Giới thiệu
Partner API của Performance Hub cho phép các nền tảng đối tác bên ngoài tích hợp liền mạch với các mô-đun cốt lõi của Performance Hub. API hỗ trợ thị giác máy tính, phân tích, ghi nhật ký ra vào của hội viên và thông tin chi tiết về cơ sở.
Định dạng yêu cầu
API chấp nhận nội dung yêu cầu được mã hóa JSON và trả về phản hồi được mã hóa JSON.
Giới hạn tốc độ
Để đảm bảo sử dụng công bằng và hệ thống ổn định, tài khoản Partner API bắt đầu với các giới hạn mặc định:
- 5 yêu cầu mỗi giây cho mỗi endpoint
- Khuyến nghị: tối đa 1000 mục cho mỗi yêu cầu theo lô để đạt hiệu suất tối ưu
- Kích thước payload tối đa 10MB
Giới hạn tốc độ có thể điều chỉnh và được người quản lý tài khoản đối tác Performance Hub của bạn cấu hình theo từng trường hợp. Nếu tích hợp của bạn cần thông lượng cao hơn khi ra mắt, di chuyển dữ liệu, bổ sung dữ liệu báo cáo hoặc cho các cơ sở có lưu lượng lớn, hãy nêu vấn đề này trong quá trình tiếp nhận hoặc trước khung thời gian thay đổi đã lên kế hoạch.
URL cơ sở
https://partner-api.performancehub.co/partner/v1/
Xác thực
Để truy cập Partner API, bạn cần xác thực bằng khóa bí mật API. Tạo và quản lý khóa của bạn thông qua Partner Console.
Khóa API đóng vai trò là thông tin xác thực để bạn truy cập tài nguyên đối tác. Mỗi khóa chỉ có quyền truy cập hạn chế vào dữ liệu của các tổ chức cụ thể và có thể bị vô hiệu hóa ngay lập tức khi cần.
Hãy bảo quản khóa API của bạn cẩn thận, vì chúng cung cấp toàn quyền truy cập vào tài khoản của bạn! Không bao giờ để lộ các khóa này trong kho mã công khai, ứng dụng phía máy khách hoặc bất kỳ nơi nào có thể bị xâm phạm.
Xác thực yêu cầu bằng HTTP Basic Auth bằng cách truyền khóa API của bạn làm tên người dùng. Để trống mật khẩu.
API chỉ chấp nhận kết nối HTTPS bảo mật. Các yêu cầu HTTP thông thường sẽ bị từ chối, cũng như mọi yêu cầu thiếu thông tin xác thực hợp lệ.
Yêu cầu mẫu
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.
Xác minh khóa bí mật
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>" }
Danh sách kiểm tra trước khi đưa vào hoạt động
Sử dụng danh sách kiểm tra này trước khi bật tích hợp đối tác cho các cơ sở đang hoạt động trên production.
Thiết lập Partner Console
- Hồ sơ đối tác của bạn đã đầy đủ.
- URL logo, trang web, danh mục và mô tả của bạn chính xác.
- Phương thức liên kết dữ liệu của bạn đã được cấu hình: Direct Link hoặc Linking Identifier.
- Việc liên kết cơ sở đã được kiểm thử với ít nhất một cơ sở thực tế.
- Đang sử dụng đúng loại khóa:
- Dryrun để kiểm thử thao tác ghi mà không gây ảnh hưởng.
- Read-only để sử dụng dữ liệu an toàn.
- Live chỉ khi bạn đã sẵn sàng tác động đến dữ liệu production.
Xác thực và quản lý khóa
- Khóa bí mật chỉ được lưu trữ phía máy chủ.
- Khóa không được nhúng trong ứng dụng phía máy khách, ứng dụng di động, kho mã công khai hoặc phiếu hỗ trợ.
- Việc xoay vòng và thu hồi khóa đã được kiểm thử.
- Đội ngũ của bạn biết khóa nào được dùng cho từng môi trường.
Xác thực dữ liệu
- Có đầy đủ các trường bắt buộc cho mọi endpoint bạn gọi.
- Mã định danh cơ sở khớp với phương thức liên kết đã cấu hình.
- ID từ hệ thống của bạn ổn định và không thay đổi giữa các lần đồng bộ.
- Các đợt nhập dữ liệu lớn được chia thành các lô dưới giới hạn được nêu trong tài liệu.
- Có thể xác định và gửi lại các mục bị lỗi trong lô.
Kiểm thử endpoint
Trước khi ra mắt, hãy kiểm thử mọi endpoint mà tích hợp của bạn phụ thuộc vào:
- Có thể đọc thông tin tổ chức và cơ sở.
- Có thể lưu và cập nhật hội viên.
- Gói hội viên, khu vực ra vào và giờ ra vào được đồng bộ chính xác.
- Lượt check-in được chấp nhận và có thể đối chiếu ngược lại với hệ thống của bạn.
- Ảnh chụp nhanh báo cáo sử dụng đúng kỳ báo cáo và chỉ số dự kiến.
- Các luồng Door/Gate Controller được kiểm thử trên phần cứng thực tế nếu áp dụng.
Sẵn sàng cho Access Time Window
Nếu tích hợp cung cấp Access Time Windows:
- Các ví dụ khung thời gian tuyệt đối và hằng tuần vượt qua danh sách kiểm tra chứng nhận dành cho bên tạo dữ liệu.
- Giá trị epoch là số nguyên giây Unix không đặt trong dấu ngoặc kép; các ranh giới
[from, to)chính xác đã được kiểm thử. - Đã xác minh múi giờ UTC mặc định, các múi giờ IANA tùy chỉnh của tích hợp và các thời điểm chuyển đổi giờ mùa hè liên quan.
- Một chuỗi phiên bản bền vững, tăng đơn điệu theo hội viên/nguồn điều phối các bản cập nhật tăng dần, việc đối soát và các lần thử lại.
- Người vận hành hiểu hoạt động khi bỏ qua trường, thay thế toàn bộ, idempotent, xung đột, dữ liệu cũ và
[]rõ ràng. - Mọi
scope_key, bao gồmdefault, đều có ánh xạ Performance Hub đã được phê duyệt; các khóa không xác định đã được kiểm thử để đảm bảo không được cấp quyền truy cập. - Tần suất làm mới dự kiến, độ cũ tối đa của nguồn, hoạt động khi nguồn đã cũ và các cảnh báo của tích hợp đã được cấu hình.
- Đã chứng minh rằng lỗi truy xuất từ upstream không tạo ra ảnh chụp nhanh rỗng hoặc không đầy đủ.
- Khả năng hội tụ của chuỗi trên môi trường staging, việc hủy/thu hồi và các ranh giới bắt đầu/kết thúc tại cửa thực tế đạt các mục tiêu đã thống nhất.
- Các quy tắc thông thường và quyền cấp vĩnh viễn đã được xác minh là đường dự phòng, và khung thời gian không thể vượt qua việc vô hiệu hóa người dùng,
blockAllAccess, chế độ bảo trì hoặc geofencing.
Sẵn sàng cho kiểm soát ra vào
Đối với các tích hợp kiểm soát ra vào:
- Hệ thống của bạn đưa ra quyết định ra vào trước khi gọi Performance Hub.
- Tích hợp xử lý
device_offline,maintenance_mode_activevàunlock_confirmation_timeout. - Người vận hành hiểu rằng hết thời gian chờ có nghĩa là việc mở khóa chưa được xác nhận.
- Nhật ký của bạn lưu
event_idvàcommand_idđược trả về. - Bạn có quy trình dự phòng thủ công cho nhân viên cơ sở.
Xử lý lỗi và thử lại
- Các phản hồi
400,401,403,404,409và422được hiển thị cho người vận hành hoặc đội ngũ hỗ trợ thay vì bị thử lại một cách mù quáng. - Các phản hồi
429,500,502,503và504sử dụng logic thử lại có giới hạn với thời gian chờ tăng dần. - Các lỗi lặp lại sẽ tạo cảnh báo trong hệ thống của bạn.
- Tích hợp không bao giờ âm thầm bỏ qua các bản ghi bị lỗi.
Khả năng quan sát
- Nhật ký của bạn bao gồm endpoint, dấu thời gian, mã định danh cơ sở, ID bản ghi nguồn, kết quả yêu cầu và nội dung phản hồi.
- Đội ngũ hỗ trợ của bạn có thể tìm kiếm theo ID hội viên, ID cơ sở, ID check-in hoặc ID sự kiện mở khóa.
- Bạn có cách phát lại hoặc đối soát các lần đồng bộ thất bại.
Ra mắt production
- Performance Hub đã xác nhận quyền truy cập production của bạn.
- Ít nhất một cơ sở trên production đã bật tích hợp của bạn.
- Khóa production của bạn đang hoạt động.
- Thông tin đầu mối vận hành và kỹ thuật của bạn được cập nhật.
- Quy trình hỗ trợ của bạn đã được ghi lại cho khách hàng.
Sau khi hoàn tất các bước kiểm tra này, tích hợp đã cấu hình của bạn sẽ xuất hiện trong danh bạ đối tác của Performance Hub bên trong nền tảng Performance Hub cốt lõi.
Các phương pháp hay nhất
Áp dụng các mẫu sau để giữ cho tích hợp đối tác dễ dự đoán, dễ quan sát và an toàn cho các cơ sở.
Xác định cơ sở một cách nhất quán
Chọn phương thức liên kết được cấu hình cho tài khoản đối tác của bạn và sử dụng nhất quán:
- Direct Link - sử dụng
facility_idcủa Performance Hub do endpoint cơ sở trả về. - Linking Identifier - sử dụng mã định danh địa điểm của riêng bạn, chẳng hạn ID chi nhánh, mã địa điểm hoặc số cửa hàng.
Không gửi cả hai mã định danh trong cùng một yêu cầu. Performance Hub xử lý yêu cầu theo phương thức liên kết được cấu hình cho tài khoản đối tác của bạn.
Xem Các phương thức liên kết đối tác để biết hướng dẫn thiết lập.
Ghi theo lô một cách cẩn thận
Partner API chấp nhận nội dung yêu cầu dạng JSON và được thiết kế cho các quy trình đồng bộ theo lô ở những nơi được nêu trong tài liệu. Hãy giữ các lô có kích thước giới hạn và có thể thử lại.
Hướng dẫn mặc định:
- Sử dụng tối đa 1000 mục cho mỗi yêu cầu theo lô để đạt hiệu suất tối ưu.
- Giữ payload dưới 10MB.
- Không vượt quá 5 yêu cầu mỗi giây cho mỗi endpoint.
Giới hạn tốc độ có thể điều chỉnh và được người quản lý tài khoản đối tác Performance Hub của bạn cấu hình theo từng trường hợp. Nếu bạn dự kiến nhập dữ liệu khối lượng lớn, lưu lượng khi ra mắt hoặc bổ sung dữ liệu báo cáo, hãy thống nhất thông lượng cần thiết trước khung thời gian thay đổi.
Nếu bạn cần đồng bộ một tập dữ liệu lớn, hãy chia thành các phần xác định và ghi nhật ký ID của từng phần ở phía bạn. Điều này giúp việc phân tích các lần thử lại thất bại dễ dàng hơn.
Thử lại an toàn
Sử dụng thời gian chờ tăng theo cấp số nhân (exponential backoff) cho các lỗi tạm thời như 429, 500, 502, 503 và 504.
Tránh các vòng lặp thử lại liên tục. Một điểm khởi đầu tốt là:
- Thử lại sau 1 giây.
- Thử lại sau 2 giây.
- Thử lại sau 4 giây.
- Dừng lại và gửi cảnh báo nếu thao tác vẫn thất bại.
Đối với các lỗi xác thực dữ liệu như 400 hoặc 422, hãy sửa yêu cầu trước khi thử lại.
Sử dụng tính idempotent khi được hỗ trợ
Endpoint mở khóa Door/Gate Controller hỗ trợ idempotency_key không bắt buộc. Dùng lại cùng một khóa cho cùng đối tác, cơ sở và cửa sẽ trả về kết quả hiện có nếu có.
Sử dụng một khóa ổn định cho hành động đang thực hiện, ví dụ ID check-in hoặc ID sự kiện ra vào từ hệ thống của bạn.
Đừng giả định mọi endpoint ghi đều hỗ trợ tính idempotent, trừ khi điều đó được nêu trong tài liệu của endpoint đó.
Giữ dữ liệu nguồn sạch
Gửi các giá trị ổn định, đã chuẩn hóa bất cứ khi nào có thể:
- Sử dụng ID hội viên, gói, cơ sở và check-in nhất quán từ hệ thống nguồn của bạn.
- Sử dụng dấu thời gian ISO 8601 cho ngày và giờ.
- Gửi số điện thoại theo định dạng quốc tế nếu có.
- Gửi đơn vị tiền tệ bằng các trường được nêu trong tài liệu của từng endpoint.
- Tránh nhồi vào các trường văn bản tự do những dữ liệu thuộc về các trường có cấu trúc.
Thiết kế cho cả đồng bộ tăng dần và đồng bộ toàn bộ
Hầu hết các tích hợp đối tác cần cả hai:
- Đồng bộ tăng dần cho các thay đổi hằng ngày.
- Đồng bộ đối soát toàn bộ để khắc phục các sự kiện bị bỏ sót, nhập dữ liệu lịch sử hoặc sai lệch dữ liệu.
Tích hợp của bạn cần có khả năng gửi lại trạng thái hiện tại của một hội viên, gói hội viên hoặc ảnh chụp nhanh báo cáo mà không phụ thuộc vào việc một yêu cầu trước đó đã thành công.
Phát hành Access Time Windows an toàn
Hãy coi giá trị access_time_windows của mỗi hội viên là một ảnh chụp nhanh đầy đủ, có phiên bản độc lập:
- Điều phối một chuỗi
access_time_windows_revisiontăng đơn điệu duy nhất giữa các worker đồng bộ tăng dần và worker đối soát. - Thử lại một lần gửi không chắc chắn hoặc lỗi tạm thời với cùng phiên bản và payload đã chuẩn hóa.
- Bỏ qua
access_time_windowskhi bạn không cập nhật trường này. - Chỉ gửi
[]sau khi một lần truy xuất thành công từ nguồn có thẩm quyền chứng minh rằng không còn khung thời gian nào. Không bao giờ biến một lần hết thời gian chờ từ upstream, kết quả không đầy đủ hoặc lỗi phân tích cú pháp thành việc thu hồi quyền. - Giữ
external_idvàscope_keyổn định, và chứng nhận mọi ánh xạ phạm vi trước khi đưa lên production. - Theo dõi độ cũ của dữ liệu nguồn so với chính sách về độ mới đã thống nhất cho tích hợp đó.
Xem hướng dẫn chính thức dành cho bên tạo dữ liệu Access Time Windows để biết về ảnh chụp nhanh đầy đủ, múi giờ, giờ mùa hè (DST), hủy bỏ và các bộ dữ liệu kiểm thử.
Coi kiểm soát ra vào là yếu tố quan trọng về an toàn
Đối với thao tác mở khóa Door/Gate Controller:
- Hệ thống của bạn phải quyết định người đó có được phép vào hay không trước khi gọi Performance Hub.
- Performance Hub chỉ trả về
200sau khi bộ điều khiển tại chỗ xác nhận rơ-le đã thực sự mở khóa. - Hầu hết các xác nhận hoàn tất trong 3-5 giây.
- Hết thời gian chờ là một lần mở khóa thất bại rõ ràng, không phải một thao tác thành công chạy ngầm.
- Chỉ thử lại theo các quy tắc ra vào và an toàn của riêng bạn.
Luôn ghi nhật ký event_id và command_id do endpoint mở khóa trả về.
Giám sát tích hợp của bạn
Sử dụng nhật ký yêu cầu trong Partner Console trong quá trình phát triển và ra mắt. Trên production, hãy duy trì thêm nhật ký của riêng bạn với:
- Dấu thời gian của yêu cầu.
- Endpoint.
- ID bản ghi nguồn.
- Mã định danh cơ sở.
- Mã trạng thái HTTP.
- Nội dung phản hồi hoặc thông báo lỗi từ Performance Hub.
Các trường này giúp việc hỗ trợ và đối soát nhanh hơn nhiều khi khách hàng hỏi điều gì đã xảy ra.
Tổ chức
Đại diện cho pháp nhân kinh doanh cấp cao nhất vận hành một hoặc nhiều cơ sở được tích hợp với nền tảng Performance Hub.
Các endpoint
GET /partner/v1/organisations - List all organisations
Đối tượng Organisation
Thuộc tính
org_id
stringbắt buộcMã định danh duy nhất của tổ chức.
name
stringbắt buộcTên tổ chức.
Đối tượng Organisation
{
"org_id": "00000000-0000-0000-0000-000000000050",
"name": "Harbourside Group"
}
Liệt kê tất cả các tổ chức
Trả về danh sách các tổ chức mà tài khoản đối tác của bạn có thể truy cập.
Giá trị trả về
Trả về một đối tượng JSON có thuộc tính data chứa một mảng các đối tượng Organisation.
Yêu cầu
curl https://partner-api.performancehub.co/partner/v1/organisations \
-u sk_live_YOUR_PARTNER_SECRET_KEY:
Phản hồi
{
"data": [
{
"org_id": "00000000-0000-0000-0000-000000000050",
"name": "Harbourside Group"
},
{
"org_id": "6ba7b811-9dad-11d1-80b4-00c04fd430c8",
"name": "Wellness Studios Network"
}
]
}
Cơ sở
Đại diện cho một địa điểm thực tế, chẳng hạn văn phòng, cửa hàng, địa điểm tổ chức sự kiện, khuôn viên, phòng khám hoặc phòng tập, nơi hội viên có thể sử dụng dịch vụ.
Các endpoint
GET /partner/v1/facilities - List all facilities
Đối tượng cơ sở (Facility)
Thuộc tính
facility_id
stringbắt buộcMã định danh duy nhất của cơ sở.
org_id
stringbắt buộcMã định danh duy nhất của tổ chức mẹ.
name
stringbắt buộcTên cơ sở.
brand
stringtùy chọnTên thương hiệu mà cơ sở sử dụng.
website_url
stringtùy chọnURL trang web của cơ sở.
place_data
objecttùy chọnDữ liệu vị trí từ Google Places API, gồm quốc gia, địa chỉ đã định dạng, Google Place ID, tỉnh/bang và thành phố.
social_links
objecttùy chọnCác liên kết mạng xã hội của cơ sở.
timezone
stringtùy chọnMã định danh múi giờ IANA (ví dụ:
"Australia/Sydney","America/New_York").
Đối tượng cơ sở (Facility)
{
"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"
}
Liệt kê tất cả các cơ sở
Trả về danh sách các cơ sở mà tài khoản đối tác của bạn có thể truy cập.
Giá trị trả về
Trả về một đối tượng JSON có thuộc tính data chứa một mảng các đối tượng Facility.
Yêu cầu
curl https://partner-api.performancehub.co/partner/v1/facilities \
-u sk_live_YOUR_PARTNER_SECRET_KEY:
Phản hồi
{
"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"
}
]
}
Gói hội viên
Xác định một sản phẩm có thể mua của tổ chức hoặc cơ sở, bao gồm dịch vụ, quyền lợi, lịch trình và giá.
Các endpoint
POST /partner/v1/membership-plans - Save a membership plan
Đối tượng Membership Plan
Thuộc tính
membership_plan_id
stringbắt buộcMã định danh duy nhất của gói hội viên.
facility_id
stringmột trong haiCung cấp loại mã định danh cơ sở được cấu hình cho tích hợp của bạn: dùng facility_id cho tích hợp liên kết trực tiếp, hoặc linking_identifier cho tích hợp dùng mã định danh liên kết. Không gửi cả hai; API sử dụng loại mã định danh được cấu hình cho tài khoản đối tác của bạn và bỏ qua loại còn lại. Tìm hiểu thêmMã định danh duy nhất của cơ sở trong Performance Hub.
linking_identifier
stringmột trong haiCung cấp loại mã định danh cơ sở được cấu hình cho tích hợp của bạn: dùng facility_id cho tích hợp liên kết trực tiếp, hoặc linking_identifier cho tích hợp dùng mã định danh liên kết. Không gửi cả hai; API sử dụng loại mã định danh được cấu hình cho tài khoản đối tác của bạn và bỏ qua loại còn lại. Tìm hiểu thêmGiá trị mã định danh duy nhất mà đối tác dùng cho từng địa điểm (ví dụ: "Branch ID", "Location Code", "Store Number"). Tìm hiểu thêm
name
stringbắt buộcTên gói dễ đọc (ví dụ:
"Office tenant – business hours","Student – term access","Hotel guest","10 Class Pack").billing_cycle
stringtùy chọnTần suất thanh toán. Một trong các giá trị
weekly,fortnightly,monthly,annuallyhoặcone_time.price
integertùy chọnChi phí cơ bản tính theo đơn vị tiền tệ nhỏ nhất (cent đối với USD/AUD).
currency
stringtùy chọnMã tiền tệ ISO 4217 (ví dụ:
"AUD","USD").description
stringtùy chọnMô tả tiếp thị hoặc mô tả nội bộ không bắt buộc.
active_members
integertùy chọnSố hội viên đang hoạt động sử dụng gói hội viên này
is_recurring
booleantùy chọnGói có tự động gia hạn hay không.
is_trial
booleantùy chọnĐây có phải là gói dùng thử hay không.
visible_to_public
booleantùy chọnGói có thể được tự mua hay không.
duration_days
integertùy chọnSố ngày gói hội viên có hiệu lực.
access_zones
arraytùy chọnMảng các khu vực ra vào có trong gói hội viên. Mỗi khu vực có thể xác định giờ ra vào riêng. Xem Khu vực ra vào để biết chi tiết.
class_limit
integertùy chọnSố lớp học tối đa được phép (null nếu không giới hạn).
Đối tượng Membership Plan
Ví dụ này sử dụng facility_id. Đối với tích hợp dùng mã định danh liên kết, hãy gửi "linking_identifier": "branch_downtown" thay thế.
{
"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
}
Khu vực ra vào
Khu vực ra vào xác định các khu vực cụ thể trong một cơ sở mà gói hội viên cấp quyền ra vào. Mỗi khu vực có thể có giờ ra vào riêng, cho phép áp dụng các giới hạn thời gian khác nhau cho từng khu vực.
Cấu trúc
Mỗi khu vực ra vào bao gồm:
name
stringbắt buộcTên của khu vực (ví dụ: "Level 3 Tenancy", "Library", "Guest Floors", "Main Gym Floor").
description
stringtùy chọnMô tả những gì có trong khu vực đó.
access_hours
objecttùy chọnGiờ ra vào dành riêng cho khu vực này. Xem Giờ ra vào để biết định dạng khoảng thời gian.
Ví dụ
Một tòa nhà văn phòng có phòng tập dành cho khách thuê: quyền ra vào khu vực thuê trong giờ hành chính và vào phòng tập từ sáng sớm đến tối muộn.
{
"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"]]
}
}
]
}
Giờ ra vào
Giờ ra vào xác định thời điểm hội viên có thể vào một khu vực cụ thể trong từng ngày của tuần. Giờ ra vào được xác định theo từng khu vực ra vào, cho phép áp dụng các giới hạn thời gian khác nhau cho các khu vực khác nhau của cơ sở.
Cấu trúc
{
"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"]]
}
Mỗi ngày là một mảng các khoảng thời gian theo định dạng HH:MM (đồng hồ 24 giờ). Mảng rỗng [] có nghĩa là không được ra vào trong ngày đó. Các ngày bị bỏ qua được xử lý giống như mảng rỗng.
Ví dụ về trường hợp sử dụng
Khách thuê văn phòng – giờ hành chính: chỉ được ra vào trong giờ hành chính vào các ngày trong tuần.
{
"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"]]
}
}
Sinh viên – quyền ra vào theo học kỳ: thư viện trong khuôn viên mở cửa vào các ngày trong tuần, có nghỉ giữa ngày, và vào sáng thứ Bảy.
{
"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"]]
}
}
Phòng tập – khung giờ sáng sớm: chỉ được ra vào buổi sáng vào các ngày trong tuần.
{
"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"]]
}
}
Khách lưu trú khách sạn – 24/7: quyền ra vào liên tục, trường hợp sử dụng phổ biến nhất.
{
"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"]]
}
}
Ví dụ theo từng khu vực
Một gói dành cho khách lưu trú khách sạn với quyền ra vào suốt ngày đêm tại các tầng phòng khách và giờ ngắn hơn cho hồ bơi:
{
"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"]]
}
}
]
}
Lưu gói hội viên
Tạo hoặc cập nhật bản ghi gói hội viên. API xác định việc tạo mới hay cập nhật dựa trên membership_plan_id.
Tham số
membership_plans
arraybắt buộcMảng các đối tượng Membership Plan cần lưu. Khuyến nghị tối đa: 1000 mục mỗi yêu cầu để đạt hiệu suất tối ưu. API tự động chia lô các mục để xử lý. Mỗi mục phải có
facility_id(bắt buộc nếu không dùnglinking_identifier) hoặclinking_identifier(bắt buộc nếu không dùngfacility_id).
Giá trị trả về
Trả về một thông báo đơn giản xác nhận thao tác đồng bộ.
Yêu cầu
Ví dụ này sử dụng facility_id. Đối với tích hợp dùng mã định danh liên kết, hãy gửi "linking_identifier": "branch_downtown" thay thế.
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
}
]
}'
Phản hồi
Trả về thông báo thành công kèm siêu dữ liệu về thao tác đồng bộ.
{
"message": "Membership plan sync successful.",
"metadata": {
"success": 98,
"skipped": 2,
"skipped_items": [
{
"membership_plan_id": "plan_456",
"facility_id": null,
"reason": "Missing facility_id"
}
]
}
}
Các trường siêu dữ liệu:
- success - Số gói hội viên đã được xử lý thành công
- skipped - Số gói bị bỏ qua (nếu có)
- skipped_items - Mảng các gói bị bỏ qua kèm lý do (nếu có)
- dry-run - Cờ boolean nếu sử dụng loại khóa dryrun (nếu áp dụng)
Hội viên
Đại diện cho một khách hàng cá nhân của cơ sở. Có thể là khách hàng tiềm năng, người quan tâm, khách hàng định kỳ, hội viên đã hết hạn hoặc người dùng bị chặn.
Các thao tác upsert hội viên cũng có thể mang theo ảnh chụp nhanh access_time_windows đầy đủ, có phiên bản, chứa quyền ra vào theo khung thời gian tuyệt đối và lặp lại hằng tuần. Xem Access Time Windows trước khi tạo các trường này. Đây là các quyền bổ sung và không thay thế các quy tắc thông thường hoặc quyền cấp vĩnh viễn của cơ sở.
Các endpoint
POST /partner/v1/members - Save a member
Đối tượng Member
Thuộc tính
member_id
stringbắt buộcMã định danh duy nhất của hội viên.
facility_id
stringmột trong haiCung cấp loại mã định danh cơ sở được cấu hình cho tích hợp của bạn: dùng facility_id cho tích hợp liên kết trực tiếp, hoặc linking_identifier cho tích hợp dùng mã định danh liên kết. Không gửi cả hai; API sử dụng loại mã định danh được cấu hình cho tài khoản đối tác của bạn và bỏ qua loại còn lại. Tìm hiểu thêmMã định danh duy nhất của cơ sở trong Performance Hub.
linking_identifier
stringmột trong haiCung cấp loại mã định danh cơ sở được cấu hình cho tích hợp của bạn: dùng facility_id cho tích hợp liên kết trực tiếp, hoặc linking_identifier cho tích hợp dùng mã định danh liên kết. Không gửi cả hai; API sử dụng loại mã định danh được cấu hình cho tài khoản đối tác của bạn và bỏ qua loại còn lại. Tìm hiểu thêmGiá trị mã định danh duy nhất mà đối tác dùng cho từng địa điểm (ví dụ: "Branch ID", "Location Code", "Store Number"). Tìm hiểu thêm
first_name
stringbắt buộcTên của hội viên.
last_name
stringbắt buộcHọ của hội viên.
email
stringtùy chọnĐịa chỉ email.
mobile_phone
stringtùy chọnSố điện thoại di động theo định dạng E.123 (ví dụ:
"+1 415 555 2671").address
objecttùy chọnĐối tượng địa chỉ thực tế với các thuộc tính sau:
address_line_1(string) - Địa chỉ đường phố chínhaddress_line_2(string, optional) - Dòng địa chỉ phụcity(string) - Tên thành phốstate(string) - Mã bang/tỉnhpostal_code(string) - Mã bưu chính/ZIPcountry(string) - Mã quốc gia ISO 3166-1 alpha-2 (ví dụ: "AU", "US")country_name(string, optional) - Tên quốc gia đầy đủ
date_of_birth
stringtùy chọnNgày sinh theo định dạng
YYYY-MM-DD.gender
stringtùy chọnMột trong các giá trị
male,female,non_binary,prefer_not_to_sayhoặcunknown.type
stringtùy chọnLoại hội viên (ví dụ:
staff,member,prospect).tags
arraytùy chọnCác chuỗi hoặc văn bản hỗ trợ nhanh để phân loại và nhận diện các hội viên cụ thể (ví dụ:
["vip", "personal-training", "student"]).membership_status
stringtùy chọnTrạng thái hội viên hiện tại (ví dụ:
active,expired,on_hold).membership_plans
arraytùy chọnMảng các gói hội viên gắn với hội viên.
profile_picture
stringtùy chọnẢnh hồ sơ được mã hóa Base64 (không bắt buộc).
created
stringtùy chọnDấu thời gian ISO 8601 khi hội viên được tạo.
updated
stringtùy chọnDấu thời gian ISO 8601 khi hội viên được cập nhật lần gần nhất.
access_time_windows
arraytùy chọnẢnh chụp nhanh đầy đủ thuộc nguồn, gồm các Access Time Windows tuyệt đối và/hoặc lặp lại hằng tuần. Bỏ qua trường này để giữ nguyên ảnh chụp nhanh; gửi một mảng rỗng với phiên bản mới hơn để thu hồi. Xem Access Time Windows để biết về cấu trúc, kiểm tra dữ liệu, ánh xạ phạm vi và ngữ nghĩa thay thế.
access_time_windows_revision
integerbắt buộc khi có access_time_windowsSố nguyên không âm, tăng đơn điệu, an toàn với JSON cho chuỗi của hội viên/nguồn này. Bắt buộc bất cứ khi nào có
access_time_windows.
Đối tượng 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
}
]
}
Khung thời gian Cấp quyền
Access Time Windows cho phép một Partner Member mang theo quyền ra vào tạm thời hoặc định kỳ do một hệ thống bên ngoài cung cấp. Trang này là hướng dẫn chính thức dành cho bên tạo dữ liệu access_time_windows và access_time_windows_revision.
Access Time Windows là các quyền bổ sung chỉ có tác dụng cho phép. Một khung thời gian đang hiệu lực có thể cho phép ra vào, nhưng một khung thời gian không hiệu lực, đã hết hạn, đã cũ hoặc chưa được ánh xạ sẽ không từ chối quyền ra vào mà một quy tắc thông thường hoặc quyền cấp vĩnh viễn đã cho phép. Việc vô hiệu hóa người dùng, chặn cửa rõ ràng, chế độ bảo trì, geofencing, giới hạn tốc độ và tình trạng khả dụng của bộ điều khiển vẫn được áp dụng.
Phần triển khai cho từng hệ thống upstream cụ thể là các bộ điều hợp (adapter) riêng biệt. Chúng phải chuyển đổi dữ liệu nguồn sang hợp đồng không phụ thuộc nhà cung cấp này mà không thay đổi ý nghĩa của các trường.
Các trường ảnh chụp nhanh của hội viên
access_time_windows
arraytùy chọnẢnh chụp nhanh Access Time Window đầy đủ cho hội viên này và nguồn đối tác này. Một ảnh chụp nhanh có thể kết hợp các khung thời gian
absolutevàweekly. Bỏ qua trường này để giữ nguyên ảnh chụp nhanh đã lưu; gửi[]để thu hồi mọi khung thời gian thuộc nguồn này.access_time_windows_revision
integerbắt buộc khi có access_time_windowsMột số nguyên không âm, tăng đơn điệu, an toàn với JSON cho chuỗi phiên bản của hội viên/nguồn này. Trường này bắt buộc bất cứ khi nào có
access_time_windowsvà không được vượt quá9007199254740991.
Mỗi ảnh chụp nhanh chấp nhận tối đa 50 khung thời gian. external_id, scope_key và label chấp nhận tối đa 120 ký tự. Khung thời gian tuyệt đối có thể kéo dài tối đa 90 ngày. Mỗi ngày trong tuần chấp nhận tối đa tám khối không chồng lấn. Dữ liệu không hợp lệ sẽ bị từ chối thay vì bị cắt bớt hoặc suy đoán.
Cấu trúc khung thời gian
Một khung thời gian tuyệt đối xác định một khoảng thời gian chính xác:
Yêu cầu kết hợp đầy đủ
Yêu cầu này thay thế ảnh chụp nhanh trước đó thuộc nguồn của hội viên bằng một khung thời gian tuyệt đối và một khung thời gian hằng tuần:
Quy tắc về thời gian và ranh giới
from, to, active_from và active_until là số nguyên JSON tính bằng giây Unix, xác định các thời điểm UTC:
- Gửi số nguyên JSON không đặt trong dấu ngoặc kép. Chuỗi số, số thực, chuỗi RFC 3339 và mili giây Unix sẽ bị từ chối.
- Mọi khoảng thời gian đều là nửa mở:
[from, to). Quyền ra vào có thể bắt đầu đúng tạifrom; quyền không còn hiệu lực đúng tạito. fromphải nhỏ hơnto. Khi có cả hai giới hạn hằng tuần,active_fromphải nhỏ hơnactive_until.- Không suy ra epoch từ ngày/giờ địa phương không có múi giờ. Trước tiên hãy quy đổi thời gian nguồn thành một thời điểm UTC, sau đó chia số mili giây Unix cho 1000 và xác minh kết quả là số nguyên.
Múi giờ và giờ mùa hè
timezone phải là một múi giờ IANA hợp lệ, chẳng hạn UTC, Australia/Perth hoặc America/New_York. Mặc định là UTC khi bị bỏ qua.
- Khung thời gian tuyệt đối:
fromvàtođã xác định chính xác các thời điểm UTC.timezonechỉ là siêu dữ liệu để hiển thị và kiểm toán; việc thay đổi trường này không bao giờ làm dịch chuyển hai thời điểm đó. - Khung thời gian hằng tuần:
timezonexác định giờ địa phương và quy tắc giờ mùa hè dùng để đánh giáaccess_hours. Không chuyển đổi trước các khối hằng tuần sang UTC. - Khi chuyển sang giờ mùa hè (đồng hồ tiến lên), một giờ địa phương bị múi giờ bỏ qua sẽ không bao giờ xảy ra.
- Khi kết thúc giờ mùa hè (đồng hồ lùi lại), cả hai thời điểm thực mang cùng giờ địa phương lặp lại đều khớp với khối hằng tuần.
active_fromvàactive_untilvẫn là thời điểm UTC ngay cả khi khung thời gian hằng tuần sử dụng múi giờ khác UTC.
access_hours sử dụng chữ thường từ sun đến sat. Mỗi giá trị là một mảng các cặp [start, end] theo định dạng HH:mm 24 giờ có số 0 đứng đầu. Các khối phải không rỗng, được sắp xếp theo thứ tự và không chồng lấn. end không bao gồm thời điểm kết thúc. Một khối không được vượt qua nửa đêm; hãy tách một khoảng thời gian qua đêm từ nguồn thành một khối muộn vào ngày đầu tiên và một khối sớm vào ngày hôm sau.
ID ổn định và ánh xạ phạm vi
external_id phải ổn định trong suốt vòng đời của một khung thời gian logic và là duy nhất trong ảnh chụp nhanh của hội viên. Giữ nguyên giá trị này khi thời gian hoặc nhãn thay đổi để người vận hành và bản ghi kiểm toán có thể đối chiếu các phiên bản. Không dùng lại giá trị này cho một khung thời gian không liên quan.
scope_key là mục tiêu ra vào logic ổn định của bạn. Mặc định là default. Quản trị viên cơ sở ánh xạ từng khóa được phép tới các mục tiêu trong Performance Hub: toàn bộ cơ sở, cửa hoặc Phạm vi truy cập:
Ảnh chụp nhanh đầy đủ và phiên bản
Hãy coi hai trường này là một phân vùng có phiên bản riêng trong thao tác upsert Member:
| Đầu vào | Kết quả |
|---|---|
Bỏ qua access_time_windows |
Ảnh chụp nhanh hiện có được giữ nguyên; không cần phiên bản |
| Có mặt với phiên bản mới hơn | Toàn bộ ảnh chụp nhanh đã lưu của hội viên/nguồn này được thay thế |
| Cùng phiên bản và cùng payload đã chuẩn hóa | Phát lại idempotent; ảnh chụp nhanh không thay đổi |
| Cùng phiên bản nhưng payload đã chuẩn hóa khác | Xung đột; cấp phiên bản mới sau khi đối soát |
| Phiên bản cũ hơn | Ảnh chụp nhanh cũ bị bỏ qua; không thể ghi đè trạng thái mới hơn |
access_time_windows: [] với phiên bản mới hơn |
Thu hồi rõ ràng mọi khung thời gian thuộc nguồn |
Ảnh chụp nhanh là bản đầy đủ, không phải bản vá. Nếu phiên bản 1842 có khung thời gian A và B, thì phiên bản 1843 chỉ chứa B sẽ xóa A.
Duy trì một chuỗi phiên bản được điều phối thống nhất cho mỗi đối tác/hội viên giữa các worker webhook, thăm dò định kỳ, phát lại và đối soát toàn bộ. Nên dùng một sequence bền vững trong cơ sở dữ liệu. Chỉ có thể dùng giá trị mili giây Unix làm phiên bản khi mọi bên ghi đều được điều phối và đảm bảo thứ tự nghiêm ngặt cũng như tính duy nhất; đó là giá trị phiên bản, không phải trường epoch.
Lưu lại chính xác yêu cầu và phiên bản cho đến khi biết phản hồi của API. Thử lại cùng ảnh chụp nhanh đã chuẩn hóa với cùng phiên bản sau khi hết thời gian chờ hoặc gặp lỗi tạm thời. Không cấp phiên bản mới chỉ vì việc truyền tải không chắc chắn.
Hủy bỏ, hết hạn và lỗi upstream
- Hủy một khung thời gian: truy xuất thành công trạng thái nguồn có thẩm quyền, xóa khung thời gian đó và gửi ảnh chụp nhanh đầy đủ còn lại với phiên bản mới hơn.
- Hủy tất cả khung thời gian: gửi
access_time_windows: []với phiên bản mới hơn. - Để khung thời gian tuyệt đối hết hạn: khung thời gian ngừng cho phép tại
to; hãy gửi một lần đối soát sau đó không có mục đã hết hạn để giữ ảnh chụp nhanh gọn gàng. - Kết thúc khung thời gian hằng tuần: xóa khung thời gian đó trong một ảnh chụp nhanh mới hơn, hoặc dùng
active_untilkhi nguồn có thời điểm kết thúc đã biết. - Truy xuất nguồn thất bại hoặc không đầy đủ: không gửi
[]và không phát hành ảnh chụp nhanh không đầy đủ. Hãy cảnh báo và thử truy xuất lại. Biến lỗi upstream thành ảnh chụp nhanh rỗng là một lần thu hồi quyền ra vào ngoài ý muốn. - Yêu cầu Partner API không vượt qua kiểm tra dữ liệu: sửa dữ liệu và chỉ gửi phiên bản mới hơn nếu ảnh chụp nhanh đã chuẩn hóa thay đổi. Thử lại các lỗi tạm thời với phiên bản ban đầu.
Độ mới của nguồn được cấu hình theo từng tích hợp dựa trên tần suất gửi và đối soát đã cam kết. Trước khi kích hoạt, hãy thống nhất độ cũ tối đa của nguồn, điều gì xảy ra khi vượt quá, các ngưỡng cảnh báo và liệu người vận hành có thể xác nhận việc chỉ dựa vào giới hạn riêng của từng khung thời gian hay không. Một khung thời gian từ nguồn đã cũ không bao giờ trở thành quy tắc từ chối; các quy tắc thông thường và quyền cấp vĩnh viễn vẫn là đường dự phòng.
Thuật toán dành cho bên tạo dữ liệu
Áp dụng quy trình không phụ thuộc ngôn ngữ lập trình này cho mọi lần cập nhật hội viên:
Danh sách kiểm tra chứng nhận
Hoàn tất các bước kiểm tra sau tại một cơ sở staging bằng ánh xạ scope_key cuối cùng:
- Khung thời gian tuyệt đối được chấp nhận khi bỏ qua múi giờ và được đánh giá theo UTC.
- Khung thời gian tuyệt đối với múi giờ IANA tùy chỉnh giữ nguyên các thời điểm
from/to. - Khung thời gian hằng tuần với múi giờ IANA tùy chỉnh tuân theo giờ địa phương qua các lần chuyển sang và kết thúc giờ mùa hè.
- Ảnh chụp nhanh kết hợp tuyệt đối/hằng tuần thay thế hoàn toàn ảnh chụp nhanh trước đó.
- Quyền ra vào bắt đầu đúng tại
fromvà dừng đúng tạito; thời điểm kết thúc của khối hằng tuần cũng không được bao gồm. - Cập nhật thời gian dưới cùng
external_idvới phiên bản mới hơn sẽ có hiệu lực. - Bỏ qua
access_time_windowssẽ thay đổi các trường Member khác mà không thay đổi khung thời gian. - Phát lại cùng phiên bản/payload là idempotent.
- Cùng phiên bản/payload khác trả về xung đột và không thay đổi ảnh chụp nhanh.
- Phiên bản cũ hơn đến không theo thứ tự được báo cáo là cũ và không thể đưa trạng thái quay lại.
- Một
[]mới hơn thu hồi các khung thời gian thuộc nguồn; lỗi truy xuất từ upstream không gửi gì cả. - Một
scope_keykhông xác định hoặc chưa được ánh xạ không cấp quyền truy cập và tạo cảnh báo mà người vận hành có thể thấy. - Cảnh báo về độ cũ của nguồn và chính sách nguồn đã cũ được cấu hình hoạt động đúng tại ngưỡng đã thống nhất.
- Đường webhook và đường đối soát toàn bộ hội tụ về cùng ảnh chụp nhanh và thứ tự phiên bản.
- Dữ liệu từ chuỗi đến được Door & Gate Access trong thời gian mục tiêu đã thống nhất.
- Khung thời gian đang hiệu lực có thể cho phép ra vào cửa thực tế đã được ánh xạ, nhưng không thể vượt qua việc vô hiệu hóa người dùng,
blockAllAccess, chế độ bảo trì hoặc geofencing. - Trước, ngoài và sau một khung thời gian, các quy tắc thông thường và quyền cấp vĩnh viễn vẫn cho phép những người dùng đủ điều kiện theo cách khác.
Hướng dẫn liên quan
{
"external_id": "access-4b1782",
"kind": "absolute",
"from": 1792053000,
"to": 1792058400,
"timezone": "Australia/Perth",
"scope_key": "after_hours_entry",
"label": "Temporary site access"
}
Các trường bắt buộc là external_id, kind, from và to. timezone, scope_key và label là không bắt buộc.
Một khung thời gian hằng tuần xác định các khoảng thời gian định kỳ theo giờ địa phương, có thể được giới hạn bởi các thời điểm 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"
}
Các trường bắt buộc là external_id, kind và access_hours. timezone, active_from, active_until, scope_key và label là không bắt buộc.
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"
}
]
}
]
}'
Sử dụng facility_id hoặc linking_identifier theo phương thức liên kết đã cấu hình. Không gửi cả hai.
Chuyển đổi epoch
2026-10-15T08:30:00Z được chuyển đổi thành 1792053000:
UTC instant Unix milliseconds Unix seconds sent
2026-10-15T08:30:00Z 1792053000000 1792053000
Cách chuyển đổi không phụ thuộc ngôn ngữ lập trình:
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
Nếu nguồn có độ chính xác dưới một giây, hãy xác định chính sách làm tròn thời điểm bắt đầu/kết thúc một cách có chủ đích trước khi kiểm thử tích hợp. Không bao giờ truyền mili giây và trông chờ API tự suy ra đơn vị.
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
Đối tác không gửi ID cơ sở, ID cửa hoặc ID Phạm vi truy cập của Performance Hub bên trong một khung thời gian. Một scope_key không xác định, bị vô hiệu hóa hoặc chưa được ánh xạ sẽ khiến khung thời gian đó không cấp quyền truy cập nào; nó không mở rộng quyền ra vào. Hãy thống nhất và kiểm thử các ánh xạ trước khi ra mắt.
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)
Bộ dữ liệu kiểm thử tối thiểu
[
{
"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."
}
]
Đồng thời gửi các bộ dữ liệu kiểm thử phủ định cho mili giây Unix, chuỗi số, số thực, múi giờ IANA không hợp lệ, from >= to, external_id trùng lặp, các khối chồng lấn, khối qua đêm, hơn tám khối trong một ngày, hơn 50 khung thời gian và các khóa phạm vi chưa được ánh xạ.
Lưu hội viên
Tạo hoặc cập nhật bản ghi hội viên. API xác định việc tạo mới hay cập nhật dựa trên member_id.
Tham số
members
arraybắt buộcMảng các đối tượng Member cần lưu. Khuyến nghị tối đa: 1000 mục mỗi yêu cầu để đạt hiệu suất tối ưu. API tự động chia lô các mục để xử lý. Mỗi mục phải có
facility_id(bắt buộc nếu không dùnglinking_identifier) hoặclinking_identifier(bắt buộc nếu không dùngfacility_id).Khi một hội viên có
access_time_windows, hội viên đó cũng phải cóaccess_time_windows_revision. Mảng này là ảnh chụp nhanh đầy đủ từ nguồn, không phải bản vá. Bỏ qua mảng để giữ nguyên ảnh chụp nhanh hiện có, hoặc gửi[]với phiên bản mới hơn để thu hồi mọi khung thời gian thuộc nguồn. Hãy đọc hướng dẫn Access Time Windows trước khi bật trường này.
Giá trị trả về
Trả về một thông báo đơn giản xác nhận thao tác đồng bộ.
Các trường hồ sơ hội viên vẫn được upsert bình thường ngay cả khi ảnh chụp nhanh khung thời gian được báo cáo là phát lại idempotent hoặc bị bỏ qua do đã cũ. Một ảnh chụp nhanh xung đột cùng phiên bản/khác payload không thể thử lại mà không thay đổi; hãy đối soát trạng thái nguồn và gửi phiên bản mới hơn.
Yêu cầu
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
}
]
}
]
}'
Phản hồi
Trả về thông báo thành công kèm siêu dữ liệu về thao tác đồng bộ.
{
"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"
}
]
}
}
Các trường siêu dữ liệu:
- success - Số hội viên đã được xử lý thành công
- skipped - Số hội viên bị bỏ qua (nếu có)
- skipped_items - Mảng các hội viên bị bỏ qua kèm lý do (nếu có)
- dry-run - Cờ boolean nếu sử dụng loại khóa dryrun (nếu áp dụng)
Check-in
Đại diện cho bản ghi về việc một người có mặt tại một cơ sở, lớp học hoặc hoạt động. Được dùng để theo dõi lượt tham dự, phân tích mức sử dụng và cải thiện độ chính xác của nhận diện hình ảnh.
Các endpoint
POST /partner/v1/check-ins - Save check-ins
Đối tượng Check-In
Thuộc tính
check_in_id
stringtùy chọnMã định danh duy nhất của lượt check-in. Không bắt buộc - được tạo tự động từ cặp
member_idvàtimestampnếu không được cung cấp.member_id
stringbắt buộcMã định danh duy nhất của hội viên.
facility_id
stringmột trong haiCung cấp loại mã định danh cơ sở được cấu hình cho tích hợp của bạn: dùng facility_id cho tích hợp liên kết trực tiếp, hoặc linking_identifier cho tích hợp dùng mã định danh liên kết. Không gửi cả hai; API sử dụng loại mã định danh được cấu hình cho tài khoản đối tác của bạn và bỏ qua loại còn lại. Tìm hiểu thêmMã định danh duy nhất của cơ sở trong Performance Hub.
linking_identifier
stringmột trong haiCung cấp loại mã định danh cơ sở được cấu hình cho tích hợp của bạn: dùng facility_id cho tích hợp liên kết trực tiếp, hoặc linking_identifier cho tích hợp dùng mã định danh liên kết. Không gửi cả hai; API sử dụng loại mã định danh được cấu hình cho tài khoản đối tác của bạn và bỏ qua loại còn lại. Tìm hiểu thêmGiá trị mã định danh duy nhất mà đối tác dùng cho từng địa điểm (ví dụ: "Branch ID", "Location Code", "Store Number"). Tìm hiểu thêm
check_in_type
stringtùy chọnLoại lượt ghé thăm. Một trong các giá trị
member,class,staff,guesthoặctrial.source
stringtùy chọnCách thức ghi nhận lượt check-in. Các giá trị phổ biến gồm
manual,tag,rfid,kiosk,app. Cũng có thể sử dụng các giá trị khác nhưdoor_readerhoặcbooking.class_id
stringtùy chọnKhông bắt buộc. Dùng khi lượt check-in gắn với một lượt đặt chỗ hoặc tham dự lớp học.
timestamp
stringbắt buộcDấu thời gian theo định dạng ISO 8601 cho biết thời điểm diễn ra lượt check-in.
Đối tượng 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"
}
Lưu check-in
Tạo các bản ghi check-in. API tự động loại bỏ trùng lặp dựa trên hội viên, cơ sở và dấu thời gian.
Tham số
check_ins
arraybắt buộcMảng các đối tượng Check-In cần lưu. Khuyến nghị tối đa: 1000 mục mỗi yêu cầu để đạt hiệu suất tối ưu. API tự động chia lô các mục để xử lý. Mỗi mục phải có
facility_id(bắt buộc nếu không dùnglinking_identifier) hoặclinking_identifier(bắt buộc nếu không dùngfacility_id).
Giá trị trả về
Trả về một thông báo đơn giản xác nhận thao tác đồng bộ.
Yêu cầu
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"
}
]
}'
Phản hồi
Trả về thông báo thành công kèm siêu dữ liệu về thao tác đồng bộ.
{
"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"
}
]
}
}
Các trường siêu dữ liệu:
- success - Số lượt check-in đã được xử lý thành công
- skipped - Số lượt check-in bị bỏ qua (nếu có)
- skipped_items - Mảng các lượt check-in bị bỏ qua kèm lý do (nếu có)
- dry-run - Cờ boolean nếu sử dụng loại khóa dryrun (nếu áp dụng)
Kiểm soát ra vào
Partner API có thể kích hoạt phần cứng Door/Gate Controller của Performance Hub tại các cơ sở đã bật tích hợp của bạn.
Sử dụng API này khi hệ thống quản lý hội viên của bạn đã quyết định rằng một người được phép vào. Performance Hub không đánh giá trạng thái hội viên, giờ ra vào, quy tắc khu vực cửa, kiểm tra gian lận hoặc logic tạm ngưng. Hệ thống của bạn vẫn là bên có thẩm quyền đối với các quyết định đó.
Yêu cầu mở khóa là đồng bộ. Performance Hub gửi lệnh đến bộ điều khiển tại chỗ theo thời gian thực và chỉ trả về 200 sau khi thiết bị xác nhận rằng rơ-le đã thực sự mở khóa. Hầu hết các xác nhận sẽ hoàn tất trong 3-5 giây. Nếu không nhận được xác nhận trong khoảng thời gian chờ, API sẽ trả về lỗi rõ ràng.
Bạn cũng có thể ghi lại một lượt thử hoặc lượt từ chối ra vào chưa từng đến được bộ điều khiển. Lệnh gọi đó không mở khóa cửa. Nó ghi một sự kiện vào Nhật ký truy cập của Door & Gate Access.
Các endpoint
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
Đối tượng Door/Gate Controller
Thuộc tính
door_id
stringbắt buộcMã định danh duy nhất của Door/Gate Controller. Lưu giá trị này trong hệ thống của bạn sau khi phát hiện và sử dụng khi gọi endpoint mở khóa.
facility_id
stringbắt buộcID cơ sở trong Performance Hub.
linking_identifier
stringtùy chọnMã định danh cơ sở của đối tác khi tích hợp của bạn sử dụng mã định danh liên kết. Tìm hiểu thêm
name
stringbắt buộcTên thiết bị dễ đọc được cấu hình trong Performance Hub.
zone
stringtùy chọnKhu vực hoặc vị trí của cửa, chẳng hạn
Entrance.status
stringbắt buộconlinehoặcoffline.relay_state
stringtùy chọnTrạng thái rơ-le gần nhất đã biết, chẳng hạn
lockedhoặcunlocked.maintenance_mode
stringbắt buộcChế độ bảo trì hiện tại. Một trong các giá trị
off,force-openhoặcforce-closed.hold_time_seconds
integerbắt buộcThời gian giữ mở khóa mặc định được cấu hình cho cửa.
last_seen
stringtùy chọnDấu thời gian ISO của lần cập nhật siêu dữ liệu thiết bị gần nhất.
Đối tượng 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"
}
Liệt kê Door/Gate Controller
Trả về các Door/Gate Controller mà tích hợp của bạn có thể sử dụng.
Nếu không cung cấp facility_id hoặc linking_identifier, API sẽ trả về Door/Gate Controller trên tất cả các cơ sở được liên kết với tài khoản đối tác của bạn.
Tham số
facility_id
stringtùy chọn một trong haiCung cấp loại mã định danh cơ sở được cấu hình cho tích hợp của bạn: dùng facility_id cho tích hợp liên kết trực tiếp, hoặc linking_identifier cho tích hợp dùng mã định danh liên kết. Không gửi cả hai; API sử dụng loại mã định danh được cấu hình cho tài khoản đối tác của bạn và bỏ qua loại còn lại. Tìm hiểu thêmID cơ sở trong Performance Hub. Sử dụng tham số này cho tích hợp liên kết trực tiếp.
linking_identifier
stringtùy chọn một trong haiCung cấp loại mã định danh cơ sở được cấu hình cho tích hợp của bạn: dùng facility_id cho tích hợp liên kết trực tiếp, hoặc linking_identifier cho tích hợp dùng mã định danh liên kết. Không gửi cả hai; API sử dụng loại mã định danh được cấu hình cho tài khoản đối tác của bạn và bỏ qua loại còn lại. Tìm hiểu thêmMã định danh cơ sở/địa điểm của riêng bạn. Sử dụng tham số này khi tích hợp của bạn được cấu hình dùng mã định danh liên kết.
Giá trị trả về
Trả về một mảng các đối tượng Door/Gate Controller.
Yêu cầu
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:
Phản hồi
{
"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"
}
]
}
Lấy trạng thái Door/Gate Controller
Truy xuất trạng thái gần nhất đã biết và cấu hình cơ bản của một Door/Gate Controller.
Cung cấp mã định danh cơ sở để Performance Hub có thể xác minh rằng cửa thuộc về một cơ sở mà tích hợp của bạn có quyền truy cập.
Tham số
door_id
stringbắt buộcID của Door/Gate Controller do endpoint liệt kê trả về.
facility_id
stringmột trong haiCung cấp loại mã định danh cơ sở được cấu hình cho tích hợp của bạn: dùng facility_id cho tích hợp liên kết trực tiếp, hoặc linking_identifier cho tích hợp dùng mã định danh liên kết. Không gửi cả hai; API sử dụng loại mã định danh được cấu hình cho tài khoản đối tác của bạn và bỏ qua loại còn lại. Tìm hiểu thêmID cơ sở trong Performance Hub. Bắt buộc đối với tích hợp liên kết trực tiếp.
linking_identifier
stringmột trong haiCung cấp loại mã định danh cơ sở được cấu hình cho tích hợp của bạn: dùng facility_id cho tích hợp liên kết trực tiếp, hoặc linking_identifier cho tích hợp dùng mã định danh liên kết. Không gửi cả hai; API sử dụng loại mã định danh được cấu hình cho tài khoản đối tác của bạn và bỏ qua loại còn lại. Tìm hiểu thêmMã định danh cơ sở của đối tác. Bắt buộc đối với tích hợp dùng mã định danh liên kết.
Giá trị trả về
Trả về một đối tượng Door/Gate Controller.
Yêu cầu
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:
Phản hồi
{
"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"
}
}
Mở khóa Door/Gate Controller
Gửi lệnh mở khóa đến Door/Gate Controller và chờ rơ-le vật lý xác nhận đã mở khóa.
Hệ thống của bạn phải quyết định người đó có được cấp phép hay không trước khi gọi endpoint này. Performance Hub chỉ xác minh khóa đối tác, quyền truy cập cơ sở, quyền sở hữu cửa và trạng thái thiết bị.
Tham số
door_id
stringbắt buộcID của Door/Gate Controller do endpoint liệt kê trả về.
facility_id
stringmột trong haiCung cấp loại mã định danh cơ sở được cấu hình cho tích hợp của bạn: dùng facility_id cho tích hợp liên kết trực tiếp, hoặc linking_identifier cho tích hợp dùng mã định danh liên kết. Không gửi cả hai; API sử dụng loại mã định danh được cấu hình cho tài khoản đối tác của bạn và bỏ qua loại còn lại. Tìm hiểu thêmID cơ sở trong Performance Hub. Bắt buộc đối với tích hợp liên kết trực tiếp.
linking_identifier
stringmột trong haiCung cấp loại mã định danh cơ sở được cấu hình cho tích hợp của bạn: dùng facility_id cho tích hợp liên kết trực tiếp, hoặc linking_identifier cho tích hợp dùng mã định danh liên kết. Không gửi cả hai; API sử dụng loại mã định danh được cấu hình cho tài khoản đối tác của bạn và bỏ qua loại còn lại. Tìm hiểu thêmMã định danh cơ sở của đối tác. Bắt buộc đối với tích hợp dùng mã định danh liên kết.
member_id
stringbắt buộcID hội viên của đối tác. Giá trị này được dùng cho nhật ký kiểm toán và liên kết dữ liệu sau này.
first_name
stringbắt buộcTên của người mở cửa.
last_name
stringbắt buộcHọ của người mở cửa.
full_name
stringtùy chọnKhông bắt buộc. Nếu bỏ qua, Performance Hub sẽ ghép
first_namevàlast_name.check_in_id
stringtùy chọnID check-in không bắt buộc từ hệ thống của bạn để đối chiếu.
idempotency_key
stringtùy chọnKhóa chống phát lại không bắt buộc. Dùng lại cùng một khóa cho cùng đối tác, cơ sở và cửa sẽ trả về kết quả hiện có nếu có.
Giá trị trả về
Chỉ trả về 200 khi thiết bị xác nhận rơ-le đã thực sự mở khóa. Cửa sử dụng thời gian giữ được cấu hình trong Quản lý thiết bị của Performance Hub; đối tác không thể ghi đè thời gian rơ-le cho từng yêu cầu. Hầu hết các xác nhận sẽ hoàn tất trong 3-5 giây. Hãy coi trường hợp hết thời gian chờ được nêu trong tài liệu là một lần mở khóa thất bại rõ ràng và chỉ thử lại theo các quy tắc an toàn của riêng bạn.
Các lỗi thường gặp:
403 integration_not_enabled- tích hợp của bạn chưa được bật cho cơ sở.409 maintenance_mode_active- nhân viên cơ sở đã bật chế độ bảo trì cho cửa.503 device_offline- Door/Gate Controller đang ngoại tuyến hoặc dữ liệu đã cũ.504 unlock_confirmation_timeout- lệnh đã được gửi nhưng không nhận được xác nhận tương ứng trước khi hết thời gian chờ.
Yêu cầu
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"
}'
Phản hồi
{
"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"
}
Phản hồi lỗi
{
"status": "failed",
"reason": "device_offline",
"door_id": "00000000000000000000000000000007",
"facility_id": "550e8400-e29b-41d4-a716-446655440000",
"event_id": "00000000-0000-0000-0000-000000000045"
}
Ghi lại lượt thử hoặc lượt từ chối ra vào
Ghi lại một lượt thử hoặc lượt từ chối ra vào mà hệ thống của bạn đã quyết định. Door/Gate Controller không được liên hệ và cửa không mở khóa.
Sử dụng endpoint này khi hệ thống của bạn từ chối cho vào, hoặc khi một lượt thử cần xuất hiện trong Nhật ký truy cập của Door & Gate Access mà không mở khóa. Performance Hub không đánh giá trạng thái hội viên, giờ ra vào hoặc các quy tắc ra vào khác.
Một sự kiện bị từ chối xuất hiện trong Nhật ký truy cập của Door & Gate Access với kết quả Denied, tên đối tác của bạn, cửa, mã định danh hội viên khi bạn gửi và mã lý do ở dạng dễ đọc. Ví dụ: membership_expired được hiển thị là "Membership Expired". reason_display_text và user_email được lưu cùng với sự kiện.
Tham số
door_id
stringbắt buộcID của Door/Gate Controller do endpoint liệt kê trả về.
facility_id
stringmột trong haiCung cấp loại mã định danh cơ sở được cấu hình cho tích hợp của bạn: dùng facility_id cho tích hợp liên kết trực tiếp, hoặc linking_identifier cho tích hợp dùng mã định danh liên kết. Không gửi cả hai; API sử dụng loại mã định danh được cấu hình cho tài khoản đối tác của bạn và bỏ qua loại còn lại. Tìm hiểu thêmID cơ sở trong Performance Hub. Bắt buộc đối với tích hợp liên kết trực tiếp.
linking_identifier
stringmột trong haiCung cấp loại mã định danh cơ sở được cấu hình cho tích hợp của bạn: dùng facility_id cho tích hợp liên kết trực tiếp, hoặc linking_identifier cho tích hợp dùng mã định danh liên kết. Không gửi cả hai; API sử dụng loại mã định danh được cấu hình cho tài khoản đối tác của bạn và bỏ qua loại còn lại. Tìm hiểu thêmMã định danh cơ sở của đối tác. Bắt buộc đối với tích hợp dùng mã định danh liên kết.
outcome
stringbắt buộcdeniedhoặcattempted.reason
stringtùy chọnMã lý do dạng snake_case chữ thường, tối đa 64 ký tự. Bắt buộc khi
outcomelàdenied. Ví dụ:membership_expired.reason_display_text
stringtùy chọnLý do ở dạng dễ đọc, tối đa 256 ký tự. Ví dụ:
Membership expired on 2026-04-01.member_id
stringtùy chọnID hội viên của đối tác. Bỏ qua trường này khi thông tin xác thực không khớp với hội viên nào, chẳng hạn một thẻ không xác định.
user_email
stringtùy chọnEmail của người đã thử ra vào.
timestamp
stringtùy chọnThời điểm diễn ra lượt thử, theo định dạng ISO 8601 có múi giờ. Ví dụ:
2026-05-18T10:15:30Z. Mặc định là thời điểm nhận được yêu cầu. Không được muộn hơn hiện tại quá 5 phút hoặc cũ hơn 30 ngày.idempotency_key
stringtùy chọnKhóa chống phát lại, tối đa 128 ký tự. Dùng lại cùng một khóa cho cùng đối tác, cơ sở và cửa sẽ trả về kết quả ban đầu.
Giá trị trả về
Trả về 201 khi sự kiện được ghi lại. Gửi lại cùng một idempotency_key sẽ trả về 200 với idempotent được đặt thành true và không tạo thêm sự kiện nào.
Khóa dry-run trả về 200 với dry_run được đặt thành true. Không có gì được ghi lại.
Các lỗi thường gặp:
400- nội dung yêu cầu không hợp lệ, lượt từ chối không córeason, dấu thời gian nằm ngoài phạm vi, hoặcfacility_id/linking_identifierkhông khớp với cơ sở đã liên kết.403- khóa là loại chỉ đọc.403 integration_not_enabled- tích hợp của bạn chưa được bật cho cơ sở.messagecho biết lý do.404- không tìm thấy Door/Gate Controller cho cơ sở đã liên kết.
Yêu cầu
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"
}'
Phản hồi
{
"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"
}
Phát lại 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
}
Báo cáo cơ sở
Bản ghi tại một thời điểm, ghi lại các chỉ số vận hành và tài chính chính của một cơ sở trong một kỳ cụ thể.
Các endpoint
POST /partner/v1/report-snapshots - Save report snapshots
Đối tượng Report Snapshot
Thuộc tính
facility_id
stringmột trong haiCung cấp loại mã định danh cơ sở được cấu hình cho tích hợp của bạn: dùng facility_id cho tích hợp liên kết trực tiếp, hoặc linking_identifier cho tích hợp dùng mã định danh liên kết. Không gửi cả hai; API sử dụng loại mã định danh được cấu hình cho tài khoản đối tác của bạn và bỏ qua loại còn lại. Tìm hiểu thêmMã định danh duy nhất của cơ sở trong Performance Hub.
linking_identifier
stringmột trong haiCung cấp loại mã định danh cơ sở được cấu hình cho tích hợp của bạn: dùng facility_id cho tích hợp liên kết trực tiếp, hoặc linking_identifier cho tích hợp dùng mã định danh liên kết. Không gửi cả hai; API sử dụng loại mã định danh được cấu hình cho tài khoản đối tác của bạn và bỏ qua loại còn lại. Tìm hiểu thêmGiá trị mã định danh duy nhất mà đối tác dùng cho từng địa điểm (ví dụ: "Branch ID", "Location Code", "Store Number"). Tìm hiểu thêm
start_date
stringbắt buộcNgày bắt đầu kỳ của ảnh chụp nhanh theo định dạng
YYYY-MM-DD.end_date
stringbắt buộcNgày kết thúc kỳ của ảnh chụp nhanh theo định dạng
YYYY-MM-DD.metrics
objectbắt buộcĐối tượng chỉ số chứa dữ liệu hội viên và doanh thu trong kỳ.
Đối tượng 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"
}
}
}
Lưu ảnh chụp nhanh báo cáo
Gửi các chỉ số vận hành và tài chính của một cơ sở trong một kỳ cụ thể.
Tham số
snapshots
arraybắt buộcMảng các đối tượng Report Snapshot cần lưu. Tối đa 25 mục mỗi yêu cầu. Mỗi mục phải có
facility_id(bắt buộc nếu không dùnglinking_identifier) hoặclinking_identifier(bắt buộc nếu không dùngfacility_id).
Giá trị trả về
Trả về một thông báo đơn giản xác nhận thao tác đồng bộ.
Yêu cầu
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"
}
}
}
]
}'
Phản hồi
{
"message": "Report snapshot sync successful."
}
Lỗi
Partner API sử dụng mã trạng thái HTTP tiêu chuẩn và nội dung phản hồi JSON để giải thích lý do yêu cầu thất bại.
Cấu trúc phản hồi lỗi
Hầu hết các lỗi API trả về nội dung JSON gồm một thông báo và, khi có, các chi tiết có cấu trúc.
Mã trạng thái
Lỗi Access Time Window
Bước kiểm tra khung thời gian thất bại trước khi ảnh chụp nhanh không hợp lệ được ghi. Các nguyên nhân phổ biến không thể thử lại gồm:
- Thiếu
access_time_windows_revisionkhi cóaccess_time_windows. - Giá trị epoch dạng chuỗi, dạng số thực hoặc có khả năng tính bằng mili giây.
- Múi giờ IANA không hợp lệ, khoảng thời gian bị đảo ngược,
external_idtrùng lặp, các khối hằng tuần chồng lấn hoặc một khối qua đêm chưa được tách. - Giá trị nằm ngoài giới hạn về số lượng, độ dài hoặc khoảng thời gian được nêu trong tài liệu.
Một phiên bản lặp lại với nội dung đã chuẩn hóa khác sẽ trả về 409 Conflict. Hãy đối soát với trạng thái có thẩm quyền mới nhất và cấp một phiên bản mới hơn; không tiếp tục thử lại cặp đang xung đột. Một phiên bản cũ hơn được báo cáo là ảnh chụp nhanh cũ bị bỏ qua thay vì được phép ghi đè trạng thái mới hơn. Một scope_key không xác định hoặc chưa được ánh xạ sẽ không được cấp quyền truy cập và cần được xử lý như một cảnh báo cấu hình.
Nếu việc gửi bị hết thời gian chờ hoặc nhận lỗi 5xx tạm thời, hãy thử lại đúng ảnh chụp nhanh đã chuẩn hóa đó với cùng phiên bản. Nếu việc truy xuất từ nguồn upstream thất bại, hãy bỏ hoàn toàn trường khung thời gian; không bao giờ thay thế bằng một mảng rỗng.
Hướng dẫn thử lại
Thử lại các lỗi sau với thời gian chờ tăng theo cấp số nhân có giới hạn:
429500502503504
Không thử lại một cách mù quáng đối với các lỗi sau:
400401403404409422
Đối với kiểm soát ra vào, luôn coi các phản hồi hết thời gian chờ và ngoại tuyến là lần mở khóa thất bại, trừ khi các quy tắc ra vào và quy trình an toàn của riêng bạn quy định khác.
Thông tin cần cung cấp cho bộ phận hỗ trợ
Khi liên hệ bộ phận hỗ trợ, hãy cung cấp:
- Endpoint và phương thức HTTP.
- Dấu thời gian và múi giờ.
- ID khóa đối tác, không phải khóa bí mật.
- Mã định danh cơ sở đã sử dụng.
- ID bản ghi nguồn từ hệ thống của bạn.
- Trạng thái và nội dung phản hồi.
event_idhoặccommand_idnếu có.
{
"success": false,
"message": "Request body.members[0].member_id is required"
}
Một số endpoint theo lĩnh vực cụ thể trả về trạng thái và lý do rõ ràng. Ví dụ: các lỗi kiểm soát ra vào bao gồm các trường như reason, door_id, facility_id và 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
Yêu cầu sai định dạng hoặc thiếu các trường bắt buộc. Hãy sửa yêu cầu trước khi thử lại.
401 Unauthorized
Xác thực thất bại. Hãy kiểm tra rằng bạn đang sử dụng HTTP Basic Auth với khóa bí mật API làm tên người dùng và mật khẩu để trống.
403 Forbidden
Khóa hợp lệ nhưng thao tác không được phép. Các nguyên nhân phổ biến gồm dùng khóa chỉ đọc cho thao tác ghi hoặc cố truy cập một cơ sở chưa bật tích hợp của bạn.
404 Not Found
Không tìm thấy tài nguyên được yêu cầu hoặc tài nguyên đó không khả dụng với tích hợp của bạn.
409 Conflict
Yêu cầu xung đột với trạng thái hiện tại của tài nguyên. Đối với kiểm soát ra vào, trường hợp này có thể bao gồm việc Door/Gate Controller đang ở chế độ bảo trì.
422 Unprocessable Entity
Yêu cầu là JSON hợp lệ nhưng không vượt qua bước kiểm tra ngữ nghĩa. Hãy sửa dữ liệu trước khi thử lại.
429 Too Many Requests
Tích hợp đã vượt quá giới hạn tốc độ được nêu trong tài liệu. Hãy thử lại với thời gian chờ tăng theo cấp số nhân.
500 Internal Server Error
Performance Hub không thể hoàn tất yêu cầu do lỗi nội bộ. Hãy thử lại với thời gian chờ tăng dần. Nếu sự cố vẫn tiếp diễn, hãy liên hệ bộ phận hỗ trợ kèm endpoint, dấu thời gian và nội dung phản hồi.
503 Service Unavailable
Một dịch vụ hoặc thiết bị phụ thuộc không khả dụng. Đối với thao tác mở khóa Door/Gate Controller, điều này có thể có nghĩa là bộ điều khiển đang ngoại tuyến.
504 Gateway Timeout
Thao tác đã hết thời gian chờ. Đối với thao tác mở khóa Door/Gate Controller, điều này có nghĩa là việc mở khóa chưa được xác nhận trước khi hết khoảng thời gian chờ.
Quản lý phiên bản
Partner API được đánh phiên bản trong URL. Phiên bản hiện tại là:
Chính sách thay đổi
Performance Hub hướng đến việc thực hiện các thay đổi bổ sung, tương thích ngược bất cứ khi nào có thể.
Ví dụ về các thay đổi tương thích ngược:
- Thêm một trường không bắt buộc mới vào yêu cầu.
- Thêm một trường mới vào phản hồi.
- Thêm một endpoint mới.
- Thêm một giá trị enum mới ở những nơi ứng dụng khách được kỳ vọng xử lý các giá trị không xác định.
- Cải thiện thông báo kiểm tra dữ liệu mà không thay đổi cam kết về mã trạng thái.
access_time_windows và access_time_windows_revision là các trường bổ sung trong yêu cầu Member. Các ứng dụng khách hiện có bỏ qua các trường này sẽ giữ nguyên ảnh chụp nhanh Access Time Window đã lưu. Quy tắc bỏ qua này duy trì khả năng tương thích với upsert một phần; việc bỏ qua không tương đương với việc gửi một mảng rỗng.
Ví dụ về các thay đổi gây gián đoạn:
- Xóa hoặc đổi tên một trường.
- Thay đổi kiểu dữ liệu của một trường.
- Chuyển một trường yêu cầu không bắt buộc thành bắt buộc.
- Xóa một endpoint.
- Thay đổi ý nghĩa của một mã trạng thái hiện có hoặc một
reasontheo lĩnh vực cụ thể.
Ngừng hỗ trợ
Khi cần thực hiện một thay đổi gây gián đoạn, Performance Hub sẽ tránh thay đổi trực tiếp phiên bản hiện có khi có thể. Thay vào đó, chúng tôi sẽ giới thiệu một phiên bản mới hoặc lộ trình chuyển đổi và thông báo thay đổi cho các đối tác bị ảnh hưởng.
Thông báo ngừng hỗ trợ có thể bao gồm:
- Một mục trong nhật ký thay đổi.
- Liên lạc trực tiếp với đối tác.
- Ghi chú trong Partner Console.
- Hướng dẫn chuyển đổi trong tài liệu.
Khuyến nghị cho ứng dụng khách
Xây dựng ứng dụng khách có khả năng chấp nhận các thay đổi bổ sung:
- Bỏ qua các trường phản hồi mà bạn không sử dụng.
- Coi các giá trị enum không xác định là không được hỗ trợ thay vì để ứng dụng gặp sự cố.
- Tránh kiểm tra so khớp phản hồi một cách tuyệt đối.
- Ghi nhật ký các giá trị không nhận dạng được để bạn có thể chủ động cập nhật tích hợp của mình.
Đối với các phân vùng Member có phiên bản như Access Time Windows, hãy lưu lại phiên bản đã gửi và payload đã chuẩn hóa cho đến khi biết kết quả. Dùng lại một phiên bản cho nội dung đã thay đổi là xung đột, còn phát lại cùng nội dung là idempotent. Xem Access Time Windows.
Đặc tả OpenAPI
Sử dụng các đặc tả OpenAPI đã công bố để tạo ứng dụng khách, kiểm tra yêu cầu và theo dõi các thay đổi về cấu trúc API theo thời gian.
Xem Đặc tả OpenAPI.
https://partner-api.performancehub.co/partner/v1/
Nhật ký thay đổi
Nhật ký thay đổi này ghi lại các thay đổi đáng chú ý của Partner API và Partner Console có ảnh hưởng đến hoạt động của tích hợp.
2026-09-09
2026-05-06
2026-05-01
Các loại thay đổi
Các mục trong tương lai sử dụng các loại sau:
- Added - endpoint, trường, hướng dẫn hoặc khả năng mới.
- Changed - hoạt động hoặc tài liệu đã thay đổi nhưng không ngừng hỗ trợ.
- Deprecated - tính năng vẫn khả dụng nhưng đã có lộ trình chuyển đổi theo kế hoạch.
- Removed - tính năng hoặc endpoint đã bị gỡ bỏ.
- Fixed - sửa lỗi hoặc đính chính tài liệu.
- Security - thay đổi về xác thực, phân quyền, xử lý dữ liệu hoặc quản lý khóa.
Đã thêm
- Đã thêm ảnh chụp nhanh
access_time_windowscủa Member, không phụ thuộc nhà cung cấp, kết hợp các khung thời gian tuyệt đối và khung thời gian lặp lại hằng tuần. - Đã thêm cơ chế sắp xếp theo
access_time_windows_revision, phát lại idempotent, xung đột, bỏ qua dữ liệu cũ và thu hồi rõ ràng. - Đã thêm hướng dẫn về múi giờ IANA, giờ mùa hè, ánh xạ
scope_keylogic, độ mới của dữ liệu nguồn, cách triển khai phía bên tạo dữ liệu và chứng nhận.
Đã thêm
- Đã thêm tài liệu chương trình đối tác về các loại đối tác, quy trình tiếp nhận, phương pháp hay nhất, sự sẵn sàng đưa vào hoạt động, lỗi, quản lý phiên bản và hỗ trợ.
- Đã thêm luồng gửi yêu cầu Trở thành đối tác riêng cho các đối tác kỹ thuật và thương mại tiềm năng.
- Đã thêm tài liệu về cách các tích hợp đối tác đã được phê duyệt xuất hiện trong danh bạ đối tác của Performance Hub trên nền tảng Performance Hub cốt lõi.
Đã thêm
- Đã thêm tài liệu kiểm soát ra vào cho Door/Gate Controller, bao gồm các thao tác liệt kê, trạng thái và mở khóa.
- Đã thêm tài liệu về hoạt động mở khóa đồng bộ: API chỉ trả về kết quả thành công sau khi bộ điều khiển tại chỗ xác nhận rơ-le đã thực sự mở khóa.
- Đã thêm tài liệu hỗ trợ
idempotency_keykhông bắt buộc cho các yêu cầu mở khóa Door/Gate Controller.