Einführung
Die Partner API des Performance Hub ermöglicht es externen Partnerplattformen, sich nahtlos in die Kernmodule des Performance Hub zu integrieren. Die API unterstützt Computer Vision, Analysen, die Protokollierung des Mitgliederzutritts und Einblicke in Einrichtungen.
Anfrageformat
Die API akzeptiert JSON-codierte Anfragetexte und gibt JSON-codierte Antworten zurück.
Ratenbegrenzung
Um eine faire Nutzung und die Systemstabilität sicherzustellen, gelten für Partner API-Konten zu Beginn folgende Standardgrenzen:
- 5 Anfragen pro Sekunde pro Endpunkt
- Empfohlen: maximal 1000 Elemente pro Batch-Anfrage für optimale Leistung
- Maximal 10MB Payload-Größe
Ratenbegrenzungen sind anpassbar und können von Ihrem Partner Account Manager beim Performance Hub im Einzelfall konfiguriert werden. Wenn Ihre Integration für den Launch, Migrationen, Nachbefüllungen von Berichtsdaten oder Einrichtungen mit hohem Volumen einen höheren Durchsatz benötigt, sprechen Sie dies während des Onboardings oder vor dem geplanten Änderungsfenster an.
Basis-URL
https://partner-api.performancehub.co/partner/v1/
Authentifizierung
Der Zugriff auf die Partner API erfordert eine Authentifizierung mit geheimen API-Schlüsseln. Erstellen und verwalten Sie Ihre Schlüssel über die Partner Console.
API-Schlüssel dienen als Ihre Anmeldedaten für den Zugriff auf Partnerressourcen. Jeder Schlüssel hat eingeschränkten Zugriff auf bestimmte Organisationsdaten und kann bei Bedarf sofort deaktiviert werden.
Gehen Sie sorgfältig mit Ihren API-Schlüsseln um – sie gewähren vollen Zugriff auf Ihr Konto! Legen Sie diese Schlüssel niemals in öffentlichen Repositorys, clientseitigen Anwendungen oder an anderen Stellen offen, an denen sie kompromittiert werden könnten.
Authentifizieren Sie Anfragen per HTTP Basic Auth, indem Sie Ihren API-Schlüssel als Benutzernamen übergeben. Lassen Sie das Passwort leer.
Die API akzeptiert ausschließlich sichere HTTPS-Verbindungen. Einfache HTTP-Anfragen werden abgelehnt, ebenso alle Anfragen ohne gültige Anmeldedaten.
Beispielanfrage
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.
Geheimen Schlüssel überprüfen
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>" }
Go-live-Checkliste
Gehen Sie diese Checkliste durch, bevor Sie eine Partnerintegration für Einrichtungen in der Produktion aktivieren.
Einrichtung der Partner Console
- Ihr Partnerprofil ist vollständig.
- Logo-URL, Website, Kategorie und Beschreibung sind korrekt.
- Ihre Datenverknüpfungsmethode ist konfiguriert: Direct Link oder Linking Identifier.
- Die Verknüpfung mit Einrichtungen wurde mit mindestens einer echten Einrichtung getestet.
- Der richtige Schlüsseltyp wird verwendet:
- Dryrun für zerstörungsfreie Schreibtests.
- Read-only für die sichere Datennutzung.
- Live erst, wenn Sie bereit sind, Produktionsdaten zu verändern.
Authentifizierung und Schlüsselverwaltung
- Geheime Schlüssel werden ausschließlich serverseitig gespeichert.
- Schlüssel sind nicht in clientseitige Anwendungen, mobile Apps, öffentliche Repositorys oder Support-Tickets eingebettet.
- Rotation und Widerruf von Schlüsseln wurden getestet.
- Ihr Team weiß, welcher Schlüssel in welcher Umgebung verwendet wird.
Datenvalidierung
- Für jeden aufgerufenen Endpunkt sind die erforderlichen Felder vorhanden.
- Die Einrichtungskennungen entsprechen Ihrer konfigurierten Verknüpfungsmethode.
- Die IDs aus Ihrem System sind stabil und ändern sich zwischen Synchronisierungen nicht.
- Große Importe werden in Batches innerhalb der dokumentierten Grenzen aufgeteilt.
- Fehlgeschlagene Batch-Elemente können identifiziert und erneut gesendet werden.
Endpunkttests
Testen Sie vor dem Launch jeden Endpunkt, von dem Ihre Integration abhängt:
- Organisationen und Einrichtungen können gelesen werden.
- Mitglieder können gespeichert und aktualisiert werden.
- Mitgliedschaftstarife, Zutrittszonen und Zutrittszeiten werden korrekt synchronisiert.
- Check-ins werden akzeptiert und können Ihrem System zugeordnet werden.
- Berichts-Snapshots verwenden den erwarteten Berichtszeitraum und die erwarteten Kennzahlen.
- Abläufe mit dem Door/Gate Controller werden, sofern zutreffend, mit echter Hardware getestet.
Bereitschaft für Access Time Windows
Wenn die Integration Access Time Windows liefert:
- Absolute und wöchentliche Beispiele bestehen die Zertifizierungscheckliste für Producer.
- Epoch-Werte sind ganzzahlige Unix-Sekunden ohne Anführungszeichen; exakte
[from, to)-Grenzen wurden getestet. - UTC-Standardwerte, die benutzerdefinierten IANA-Zeitzonen der Integration und relevante Sommerzeitumstellungen wurden überprüft.
- Ein einziger dauerhafter, monotoner Revisionsstrom pro Mitglied und Quelle koordiniert inkrementelle Aktualisierungen, Abgleiche und Wiederholungen.
- Die Betreiber verstehen das Verhalten bei weggelassenen Werten, vollständigem Ersatz, idempotenten, widersprüchlichen und veralteten Snapshots sowie bei explizitem
[]. - Jeder
scope_key, einschließlichdefault, hat eine genehmigte Zuordnung im Performance Hub; es wurde getestet, dass unbekannte Schlüssel zur Verweigerung führen (fail closed). - Die erwartete Aktualisierungsfrequenz der Integration, das maximale Alter der Quelldaten, das Verhalten bei veralteten Quellen und Warnungen sind konfiguriert.
- Es wurde nachgewiesen, dass ein fehlgeschlagener Abruf aus der Quelle keinen leeren oder unvollständigen Snapshot erzeugt.
- Konvergenz des Stage-Stroms, Stornierung/Widerruf sowie Start- und Endgrenzen an der physischen Tür erfüllen die vereinbarten Ziele.
- Reguläre Regeln und dauerhafte Berechtigungen wurden als Fallback-Pfade überprüft, und Zeitfenster können weder die Deaktivierung von Benutzern,
blockAllAccess, die Wartung noch das Geofencing umgehen.
Bereitschaft für die Zutrittskontrolle
Für Integrationen zur Zutrittskontrolle:
- Ihr System trifft die Zutrittsentscheidung, bevor es den Performance Hub aufruft.
- Die Integration verarbeitet
device_offline,maintenance_mode_activeundunlock_confirmation_timeout. - Die Betreiber wissen, dass eine Zeitüberschreitung bedeutet, dass die Entriegelung nicht bestätigt wurde.
- Ihre Protokolle speichern die zurückgegebenen Werte
event_idundcommand_id. - Sie haben einen manuellen Ausweichprozess für das Personal der Einrichtung.
Fehlerbehandlung und Wiederholungen
- Antworten mit
400,401,403,404,409und422werden den Betreibern oder Support-Teams angezeigt, statt ungeprüft wiederholt zu werden. - Bei Antworten mit
429,500,502,503und504wird eine begrenzte Wiederholungslogik mit Backoff verwendet. - Wiederholte Fehler lösen in Ihrem System eine Warnung aus.
- Die Integration verwirft fehlgeschlagene Datensätze niemals stillschweigend.
Beobachtbarkeit
- Ihre Protokolle enthalten Endpunkt, Zeitstempel, Einrichtungskennung, Quelldatensatz-ID, Ergebnis der Anfrage und Antworttext.
- Ihr Support-Team kann nach Mitglieds-ID, Einrichtungs-ID, Check-in-ID oder ID des Entriegelungsereignisses suchen.
- Sie haben eine Möglichkeit, fehlgeschlagene Synchronisierungen erneut auszuführen oder abzugleichen.
Produktionsstart
- Der Performance Hub hat Ihren Produktionszugang bestätigt.
- Mindestens eine Einrichtung in der Produktion hat Ihre Integration aktiviert.
- Ihr Produktionsschlüssel ist aktiv.
- Ihre betrieblichen und technischen Ansprechpartner sind aktuell.
- Ihr Support-Prozess ist für Kunden dokumentiert.
Nachdem diese Prüfungen abgeschlossen sind, erscheint Ihre konfigurierte Integration im Partnerverzeichnis des Performance Hub innerhalb der zentralen Performance Hub-Plattform.
Bewährte Methoden
Mit diesen Mustern bleiben Partnerintegrationen vorhersehbar, nachvollziehbar und sicher für Einrichtungen.
Einrichtungen einheitlich identifizieren
Wählen Sie die für Ihr Partnerkonto konfigurierte Verknüpfungsmethode und verwenden Sie sie durchgängig:
- Direct Link - Verwenden Sie die vom Einrichtungs-Endpunkt zurückgegebene
facility_iddes Performance Hub. - Linking Identifier - Verwenden Sie Ihre eigene Standortkennung, etwa eine Filial-ID, einen Standortcode oder eine Filialnummer.
Senden Sie nicht beide Kennungen in derselben Anfrage. Der Performance Hub löst Anfragen anhand der für Ihr Partnerkonto konfigurierten Verknüpfungsmethode auf.
Hinweise zur Einrichtung finden Sie unter Partner-Verknüpfungsmethoden.
Batch-Schreibvorgänge mit Bedacht
Die Partner API akzeptiert JSON-Anfragetexte und ist, wo dokumentiert, für batchorientierte Synchronisierungsabläufe ausgelegt. Halten Sie Batches begrenzt und wiederholbar.
Standardrichtwerte:
- Verwenden Sie für optimale Leistung bis zu 1000 Elemente pro Batch-Anfrage.
- Halten Sie Payloads unter 10MB.
- Bleiben Sie innerhalb von 5 Anfragen pro Sekunde pro Endpunkt.
Ratenbegrenzungen sind anpassbar und können von Ihrem Partner Account Manager beim Performance Hub im Einzelfall konfiguriert werden. Wenn Sie umfangreiche Importe, Launch-Traffic oder Nachbefüllungen von Berichtsdaten erwarten, vereinbaren Sie den benötigten Durchsatz vor dem Änderungsfenster.
Wenn Sie einen großen Datensatz synchronisieren müssen, teilen Sie ihn in deterministische Blöcke auf und protokollieren Sie die ID jedes Blocks auf Ihrer Seite. So lassen sich fehlgeschlagene Wiederholungsversuche leichter nachvollziehen.
Sicher wiederholen
Verwenden Sie exponentiellen Backoff bei vorübergehenden Fehlern wie 429, 500, 502, 503 und 504.
Vermeiden Sie enge Wiederholungsschleifen. Ein guter Ausgangspunkt ist:
- Nach 1 Sekunde wiederholen.
- Nach 2 Sekunden wiederholen.
- Nach 4 Sekunden wiederholen.
- Abbrechen und alarmieren, wenn der Vorgang weiterhin fehlschlägt.
Korrigieren Sie bei Validierungsfehlern wie 400 oder 422 die Anfrage, bevor Sie sie wiederholen.
Idempotenz nutzen, wo unterstützt
Der Entriegelungs-Endpunkt des Door/Gate Controller unterstützt einen optionalen idempotency_key. Wird derselbe Schlüssel für denselben Partner, dieselbe Einrichtung und dieselbe Tür erneut verwendet, wird das vorhandene Ergebnis zurückgegeben, sofern eines verfügbar ist.
Verwenden Sie einen stabilen Schlüssel für die ausgeführte Aktion, zum Beispiel eine Check-in-ID oder eine Zutrittsereignis-ID aus Ihrem System.
Gehen Sie nicht davon aus, dass jeder Schreib-Endpunkt Idempotenz unterstützt, sofern dies nicht für den jeweiligen Endpunkt dokumentiert ist.
Quelldaten sauber halten
Senden Sie nach Möglichkeit stabile, normalisierte Werte:
- Verwenden Sie einheitliche Mitglieder-, Tarif-, Einrichtungs- und Check-in-IDs aus Ihrem Quellsystem.
- Verwenden Sie ISO 8601-Zeitstempel für Datums- und Zeitangaben.
- Senden Sie Telefonnummern, sofern verfügbar, im internationalen Format.
- Senden Sie Währungen über die für jeden Endpunkt dokumentierten Felder.
- Überladen Sie Freitextfelder nicht mit Daten, die in strukturierte Felder gehören.
Für inkrementelle und vollständige Synchronisierungen planen
Die meisten Partnerintegrationen benötigen beides:
- Inkrementelle Synchronisierungen für tägliche Änderungen.
- Vollständige Abgleichssynchronisierungen, um verpasste Ereignisse, historische Importe oder Datenabweichungen zu korrigieren.
Ihre Integration sollte den aktuellen Zustand eines Mitglieds, eines Mitgliedschaftstarifs oder eines Berichts-Snapshots erneut senden können, ohne davon abzuhängen, dass eine vorherige Anfrage erfolgreich war.
Access Time Windows sicher veröffentlichen
Behandeln Sie den Wert access_time_windows jedes Mitglieds als vollständigen, unabhängig revisionierten Snapshot:
- Koordinieren Sie einen einzigen, monoton steigenden
access_time_windows_revision-Strom über inkrementelle und Abgleichs-Worker hinweg. - Wiederholen Sie eine unsichere oder vorübergehend fehlgeschlagene Zustellung mit derselben Revision und derselben normalisierten Payload.
- Lassen Sie
access_time_windowsweg, wenn Sie den Wert nicht aktualisieren. - Senden Sie
[]erst, nachdem ein erfolgreicher Abruf aus der maßgeblichen Quelle belegt, dass keine Zeitfenster mehr bestehen. Machen Sie aus einer Zeitüberschreitung, einem Teilergebnis oder einem Parsing-Fehler der Quelle niemals einen Widerruf. - Halten Sie
external_idundscope_keystabil und zertifizieren Sie jede Bereichszuordnung vor der Produktion. - Überwachen Sie das Alter der Quelldaten anhand der für diese Integration vereinbarten Aktualitätsrichtlinie.
Im maßgeblichen Producer-Leitfaden für Access Time Windows finden Sie Informationen zu vollständigen Snapshots, Zeitzonen, Sommerzeit, Stornierung und Testvektoren.
Zutrittskontrolle als sicherheitskritisch behandeln
Für Entriegelungen über den Door/Gate Controller gilt:
- Ihr System muss entscheiden, ob die Person eintreten darf, bevor es den Performance Hub aufruft.
- Der Performance Hub gibt
200erst zurück, nachdem der Controller vor Ort bestätigt hat, dass das Relais physisch entriegelt hat. - Die meisten Bestätigungen erfolgen innerhalb von 3-5 Sekunden.
- Eine Zeitüberschreitung ist eine explizit fehlgeschlagene Entriegelung, kein Erfolg im Hintergrund.
- Wiederholen Sie den Vorgang nur gemäß Ihren eigenen Zutritts- und Sicherheitsregeln.
Protokollieren Sie immer die vom Entriegelungs-Endpunkt zurückgegebenen Werte event_id und command_id.
Ihre Integration überwachen
Nutzen Sie während der Entwicklung und beim Launch die Anfrageprotokolle der Partner Console. Führen Sie in der Produktion zusätzlich eigene Protokolle mit:
- Zeitstempel der Anfrage.
- Endpunkt.
- Quelldatensatz-ID.
- Einrichtungskennung.
- HTTP-Statuscode.
- Antworttext oder Fehlermeldung des Performance Hub.
Mit diesen Feldern lassen sich Support und Abgleich deutlich beschleunigen, wenn ein Kunde fragt, was passiert ist.
Organisationen
Stellt die übergeordnete Geschäftseinheit dar, die eine oder mehrere in die Performance Hub-Plattform integrierte Einrichtungen betreibt.
Endpunkte
GET /partner/v1/organisations - List all organisations
Das Organisationsobjekt
Attribute
org_id
stringerforderlichEindeutige Kennung der Organisation.
name
stringerforderlichName der Organisation.
Das Organisationsobjekt
{
"org_id": "00000000-0000-0000-0000-000000000050",
"name": "Harbourside Group"
}
Alle Organisationen auflisten
Gibt eine Liste der Organisationen zurück, auf die Ihr Partnerkonto zugreifen kann.
Rückgabe
Gibt ein JSON-Objekt mit einer Eigenschaft data zurück, die ein Array von Organisationsobjekten enthält.
Anfrage
curl https://partner-api.performancehub.co/partner/v1/organisations \
-u sk_live_YOUR_PARTNER_SECRET_KEY:
Antwort
{
"data": [
{
"org_id": "00000000-0000-0000-0000-000000000050",
"name": "Harbourside Group"
},
{
"org_id": "6ba7b811-9dad-11d1-80b4-00c04fd430c8",
"name": "Wellness Studios Network"
}
]
}
Einrichtungen
Stellt einen physischen Standort dar, etwa ein Büro, ein Geschäft, einen Veranstaltungsort, einen Campus, eine Klinik oder ein Fitnessstudio, an dem Mitglieder Leistungen in Anspruch nehmen können.
Endpunkte
GET /partner/v1/facilities - List all facilities
Das Einrichtungsobjekt
Attribute
facility_id
stringerforderlichEindeutige Kennung der Einrichtung.
org_id
stringerforderlichEindeutige Kennung der übergeordneten Organisation.
name
stringerforderlichName der Einrichtung.
brand
stringoptionalVon der Einrichtung verwendeter Markenname.
website_url
stringoptionalURL der Website der Einrichtung.
place_data
objectoptionalStandortdaten aus der Google Places API mit Land, formatierter Adresse, Google Place ID, Bundesland bzw. Provinz und Stadt.
social_links
objectoptionalSocial-Media-Links der Einrichtung.
timezone
stringoptionalIANA-Zeitzonenkennung (z. B.
"Australia/Sydney","America/New_York").
Das Einrichtungsobjekt
{
"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"
}
Alle Einrichtungen auflisten
Gibt eine Liste der Einrichtungen zurück, auf die Ihr Partnerkonto zugreifen kann.
Rückgabe
Gibt ein JSON-Objekt mit einer Eigenschaft data zurück, die ein Array von Einrichtungsobjekten enthält.
Anfrage
curl https://partner-api.performancehub.co/partner/v1/facilities \
-u sk_live_YOUR_PARTNER_SECRET_KEY:
Antwort
{
"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"
}
]
}
Mitgliedschaftstarife
Definiert ein käufliches Angebot einer Organisation oder Einrichtung, einschließlich Leistungen, Berechtigungen, Zeitplan und Preisen.
Endpunkte
POST /partner/v1/membership-plans - Save a membership plan
Das Mitgliedschaftstarif-Objekt
Attribute
membership_plan_id
stringerforderlichEindeutige Kennung des Mitgliedschaftstarifs.
facility_id
stringentweder/oderGeben Sie den für Ihre Integration konfigurierten Typ der Einrichtungskennung an: Verwenden Sie facility_id für Direct-Link-Integrationen oder linking_identifier für Linking-Identifier-Integrationen. Senden Sie nicht beide; die API verwendet den für Ihr Partnerkonto konfigurierten Kennungstyp und ignoriert den anderen. Weitere InformationenEindeutige Kennung der Einrichtung aus dem Performance Hub.
linking_identifier
stringentweder/oderGeben Sie den für Ihre Integration konfigurierten Typ der Einrichtungskennung an: Verwenden Sie facility_id für Direct-Link-Integrationen oder linking_identifier für Linking-Identifier-Integrationen. Senden Sie nicht beide; die API verwendet den für Ihr Partnerkonto konfigurierten Kennungstyp und ignoriert den anderen. Weitere InformationenEindeutiger Kennungswert, den der Partner für jeden Standort verwendet (z. B. „Branch ID“, „Location Code“, „Store Number“). Weitere Informationen
name
stringerforderlichMenschenlesbarer Tarifname (z. B.
"Office tenant – business hours","Student – term access","Hotel guest","10 Class Pack").billing_cycle
stringoptionalAbrechnungshäufigkeit. Einer der Werte
weekly,fortnightly,monthly,annuallyoderone_time.price
integeroptionalGrundpreis in der kleinsten Währungseinheit (Cent bei USD/AUD).
currency
stringoptionalWährungscode nach ISO 4217 (z. B.
"AUD","USD").description
stringoptionalOptionale Marketing- oder interne Beschreibung.
active_members
integeroptionalAnzahl der aktiven Mitglieder mit diesem Mitgliedschaftstarif
is_recurring
booleanoptionalOb sich der Tarif automatisch verlängert.
is_trial
booleanoptionalOb es sich um ein Testangebot handelt.
visible_to_public
booleanoptionalOb der Tarif im Self-Service gekauft werden kann.
duration_days
integeroptionalAnzahl der Tage, die der Mitgliedschaftstarif gültig ist.
access_zones
arrayoptionalArray der im Mitgliedschaftstarif enthaltenen Zutrittszonen. Jede Zone kann eigene Zutrittszeiten definieren. Details finden Sie unter Zutrittszonen.
class_limit
integeroptionalMaximale Anzahl zulässiger Kurse (null für unbegrenzt).
Das Mitgliedschaftstarif-Objekt
Dieses Beispiel verwendet facility_id. Senden Sie bei einer Linking-Identifier-Integration stattdessen "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
}
Zutrittszonen
Zutrittszonen definieren bestimmte Bereiche innerhalb einer Einrichtung, zu denen ein Mitgliedschaftstarif Zutritt gewährt. Jede Zone kann eigene Zutrittszeiten haben, sodass pro Bereich unterschiedliche zeitliche Einschränkungen gelten können.
Struktur
Jede Zutrittszone umfasst:
name
stringerforderlichDer Name der Zone (z. B. „Level 3 Tenancy“, „Library“, „Guest Floors“, „Main Gym Floor“).
description
stringoptionalBeschreibung dessen, was in dieser Zone enthalten ist.
access_hours
objectoptionalZutrittszeiten speziell für diese Zone. Das Format der Zeitbereiche finden Sie unter Zutrittszeiten.
Beispiel
Ein Bürogebäude mit einem Fitnessstudio für seine Mieter: Zutritt zu den Mietflächen während der Geschäftszeiten und zum Fitnessstudio vom frühen Morgen bis zum späten Abend.
{
"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"]]
}
}
]
}
Zutrittszeiten
Zutrittszeiten legen fest, wann Mitglieder an den einzelnen Wochentagen Zutritt zu einer bestimmten Zone haben. Zutrittszeiten werden pro Zutrittszone definiert, sodass für verschiedene Bereiche einer Einrichtung unterschiedliche zeitliche Einschränkungen gelten können.
Struktur
{
"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"]]
}
Jeder Tag ist ein Array von Zeitbereichen im Format HH:MM (24-Stunden-Format). Ein leeres Array [] bedeutet, dass an diesem Tag kein Zutritt besteht. Weggelassene Tage werden wie ein leeres Array behandelt.
Beispielanwendungsfälle
Büromieter – Geschäftszeiten: Zutritt nur werktags während der Geschäftszeiten.
{
"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"]]
}
}
Studierende – Zutritt während des Semesters: eine Campusbibliothek, die werktags mit einer Pause zur Tagesmitte sowie samstagvormittags geöffnet ist.
{
"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"]]
}
}
Fitnessstudio – Frühaufsteher: Zutritt werktags nur am Morgen.
{
"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"]]
}
}
Hotelgast – rund um die Uhr: Zutritt jederzeit, der häufigste Anwendungsfall.
{
"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"]]
}
}
Beispiel pro Zone
Ein Tarif für Hotelgäste mit Zutritt rund um die Uhr zu den Gästeetagen und kürzeren Zeiten für den Pool:
{
"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"]]
}
}
]
}
Einen Mitgliedschaftstarif speichern
Erstellt oder aktualisiert Datensätze zu Mitgliedschaftstarifen. Die API entscheidet anhand der membership_plan_id, ob ein Datensatz erstellt oder aktualisiert wird.
Parameter
membership_plans
arrayerforderlichArray der zu speichernden Mitgliedschaftstarif-Objekte. Empfohlenes Maximum für optimale Leistung: 1000 Elemente pro Anfrage. Die API fasst Elemente für die Verarbeitung automatisch in Batches zusammen. Jedes Element muss entweder
facility_id(erforderlich, wennlinking_identifiernicht verwendet wird) oderlinking_identifier(erforderlich, wennfacility_idnicht verwendet wird) enthalten.
Rückgabe
Gibt eine einfache Meldung zurück, die den Synchronisierungsvorgang bestätigt.
Anfrage
Dieses Beispiel verwendet facility_id. Senden Sie bei einer Linking-Identifier-Integration stattdessen "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
}
]
}'
Antwort
Gibt eine Erfolgsmeldung mit Metadaten zum Synchronisierungsvorgang zurück.
{
"message": "Membership plan sync successful.",
"metadata": {
"success": 98,
"skipped": 2,
"skipped_items": [
{
"membership_plan_id": "plan_456",
"facility_id": null,
"reason": "Missing facility_id"
}
]
}
}
Metadatenfelder:
- success - Anzahl der erfolgreich verarbeiteten Mitgliedschaftstarife
- skipped - Anzahl der übersprungenen Tarife (falls vorhanden)
- skipped_items - Array der übersprungenen Tarife mit Gründen (falls vorhanden)
- dry-run - Boolesches Flag bei Verwendung des Schlüsseltyps dryrun (falls zutreffend)
Mitglieder
Stellt einen einzelnen Kunden einer Einrichtung dar. Kann ein Lead, ein Interessent, ein wiederkehrender Kunde, ein abgelaufenes Mitglied oder ein gesperrter Benutzer sein.
Upserts von Mitgliedern können auch einen vollständigen, revisionierten access_time_windows-Snapshot mit absoluten und wöchentlich wiederkehrenden Zutrittszeiten enthalten. Lesen Sie Access Time Windows, bevor Sie diese Felder erzeugen. Es handelt sich um zusätzliche Berechtigungen, die die regulären Regeln oder dauerhaften Berechtigungen der Einrichtung nicht ersetzen.
Endpunkte
POST /partner/v1/members - Save a member
Das Mitgliederobjekt
Attribute
member_id
stringerforderlichEindeutige Kennung des Mitglieds.
facility_id
stringentweder/oderGeben Sie den für Ihre Integration konfigurierten Typ der Einrichtungskennung an: Verwenden Sie facility_id für Direct-Link-Integrationen oder linking_identifier für Linking-Identifier-Integrationen. Senden Sie nicht beide; die API verwendet den für Ihr Partnerkonto konfigurierten Kennungstyp und ignoriert den anderen. Weitere InformationenEindeutige Kennung der Einrichtung aus dem Performance Hub.
linking_identifier
stringentweder/oderGeben Sie den für Ihre Integration konfigurierten Typ der Einrichtungskennung an: Verwenden Sie facility_id für Direct-Link-Integrationen oder linking_identifier für Linking-Identifier-Integrationen. Senden Sie nicht beide; die API verwendet den für Ihr Partnerkonto konfigurierten Kennungstyp und ignoriert den anderen. Weitere InformationenEindeutiger Kennungswert, den der Partner für jeden Standort verwendet (z. B. „Branch ID“, „Location Code“, „Store Number“). Weitere Informationen
first_name
stringerforderlichVorname des Mitglieds.
last_name
stringerforderlichNachname des Mitglieds.
email
stringoptionalE-Mail-Adresse.
mobile_phone
stringoptionalMobiltelefonnummer im Format E.123 (z. B.
"+1 415 555 2671").address
objectoptionalObjekt mit der Postanschrift und folgenden Eigenschaften:
address_line_1(string) - Hauptadresse (Straße und Hausnummer)address_line_2(string, optional) - Zusätzliche Adresszeilecity(string) - Name der Stadtstate(string) - Code des Bundeslands bzw. der Provinzpostal_code(string) - Postleitzahlcountry(string) - Ländercode nach ISO 3166-1 alpha-2 (z. B. „AU“, „US“)country_name(string, optional) - Vollständiger Name des Landes
date_of_birth
stringoptionalGeburtsdatum im Format
YYYY-MM-DD.gender
stringoptionalEiner der Werte
male,female,non_binary,prefer_not_to_sayoderunknown.type
stringoptionalMitgliedertyp (z. B.
staff,member,prospect).tags
arrayoptionalKurze Hilfs-Strings oder -Texte, um bestimmte Mitglieder zu kategorisieren und zu identifizieren (z. B.
["vip", "personal-training", "student"]).membership_status
stringoptionalAktueller Mitgliedschaftsstatus (z. B.
active,expired,on_hold).membership_plans
arrayoptionalArray der Mitgliedschaftstarife, die dem Mitglied zugeordnet sind.
profile_picture
stringoptionalBase64-codiertes Profilbild (optional).
created
stringoptionalISO 8601-Zeitstempel der Erstellung des Mitglieds.
updated
stringoptionalISO 8601-Zeitstempel der letzten Aktualisierung des Mitglieds.
access_time_windows
arrayoptionalVollständiger quelleigener Snapshot absoluter und/oder wöchentlich wiederkehrender Access Time Windows. Lassen Sie das Feld weg, um den Snapshot unverändert zu lassen; senden Sie ein leeres Array mit einer neueren Revision, um ihn zu widerrufen. Formen, Validierung, Bereichszuordnung und Ersetzungssemantik finden Sie unter Access Time Windows.
access_time_windows_revision
integererforderlich mit access_time_windowsMonoton steigende, nicht negative, JSON-sichere Ganzzahl für diesen Strom aus Mitglied und Quelle. Immer dann erforderlich, wenn
access_time_windowsvorhanden ist.
Das Mitgliederobjekt
{
"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
}
]
}
Zugriffszeitfenster
Mit Access Time Windows kann ein Partnermitglied befristete oder wiederkehrende Zutrittsberechtigungen tragen, die von einem externen System geliefert werden. Diese Seite ist der maßgebliche Producer-Leitfaden für access_time_windows und access_time_windows_revision.
Access Time Windows sind zusätzliche, ausschließlich erlaubende Berechtigungen. Ein aktives Zeitfenster kann den Zutritt erlauben, aber ein inaktives, abgelaufenes, veraltetes oder nicht zugeordnetes Zeitfenster verweigert keinen Zutritt, den eine reguläre Regel oder eine dauerhafte Berechtigung bereits erlaubt. Die Deaktivierung von Benutzern, explizite Türsperren, der Wartungsmodus, Geofencing, Ratenbegrenzungen und die Verfügbarkeit des Controllers gelten weiterhin.
Implementierungen für bestimmte Quellsysteme sind separate Adapter. Sie müssen ihre Quelldaten in diesen herstellerneutralen Vertrag übersetzen, ohne die Bedeutung seiner Felder zu verändern.
Snapshot-Felder des Mitglieds
access_time_windows
arrayoptionalDer vollständige Access Time Windows-Snapshot für dieses Mitglied und diese Partnerquelle. Ein Snapshot kann
absolute- undweekly-Zeitfenster mischen. Lassen Sie das Feld weg, um den gespeicherten Snapshot unverändert zu lassen; senden Sie[], um alle Zeitfenster dieser Quelle zu widerrufen.access_time_windows_revision
integererforderlich mit access_time_windowsEine monoton steigende, nicht negative, JSON-sichere Ganzzahl für diesen Revisionsstrom aus Mitglied und Quelle. Sie ist immer dann erforderlich, wenn
access_time_windowsvorhanden ist, und darf9007199254740991nicht überschreiten.
Jeder Snapshot akzeptiert höchstens 50 Zeitfenster. external_id, scope_key und label akzeptieren höchstens 120 Zeichen. Absolute Zeitfenster dürfen höchstens 90 Tage umfassen. Ein Wochentag akzeptiert höchstens acht sich nicht überschneidende Blöcke. Ungültige Daten werden abgelehnt, statt gekürzt oder erraten zu werden.
Formen von Zeitfenstern
Ein absolutes Zeitfenster bezeichnet genau ein Intervall:
Vollständige gemischte Anfrage
Diese Anfrage ersetzt den bisherigen quelleigenen Snapshot des Mitglieds durch ein absolutes und ein wöchentliches Zeitfenster:
Regeln für Zeiten und Grenzen
from, to, active_from und active_until sind JSON-Ganzzahlen in Unix-Sekunden, die UTC-Zeitpunkte bezeichnen:
- Senden Sie eine JSON-Ganzzahl ohne Anführungszeichen. Numerische Strings, Gleitkommazahlen, RFC 3339-Strings und Unix-Millisekunden werden abgelehnt.
- Jedes Intervall ist halboffen:
[from, to). Der Zutritt kann genau beifrombeginnen; genau beitoist er nicht mehr aktiv. frommuss kleiner alstosein. Wenn beide wöchentlichen Grenzen vorhanden sind, mussactive_fromkleiner alsactive_untilsein.- Leiten Sie Epoch-Werte nicht aus einem lokalen Datum bzw. einer lokalen Uhrzeit ohne Zeitzone ab. Lösen Sie die Quellzeit zunächst in einen UTC-Zeitpunkt auf, teilen Sie dann die Unix-Millisekunden durch 1000 und prüfen Sie, ob das Ergebnis eine Ganzzahl ist.
Zeitzonen und Sommerzeit
timezone muss eine gültige IANA-Zeitzone sein, etwa UTC, Australia/Perth oder America/New_York. Wird sie weggelassen, gilt standardmäßig UTC.
- Absolute Zeitfenster:
fromundtobezeichnen bereits exakte UTC-Zeitpunkte.timezonedient nur als Metadatum für Anzeige und Audit; eine Änderung verschiebt keinen der beiden Zeitpunkte. - Wöchentliche Zeitfenster:
timezonelegt die lokale Uhrzeit und die Sommerzeitregeln fest, nach denenaccess_hoursausgewertet wird. Rechnen Sie wöchentliche Blöcke nicht vorab in UTC um. - Bei der Umstellung auf Sommerzeit tritt eine lokale Uhrzeit, die in der Zeitzone übersprungen wird, nie ein.
- Bei der Umstellung auf Winterzeit entsprechen beide realen Zeitpunkte mit der wiederholten lokalen Uhrzeit dem wöchentlichen Block.
active_fromundactive_untilbleiben UTC-Zeitpunkte, auch wenn ein wöchentliches Zeitfenster eine andere Zeitzone als UTC verwendet.
access_hours verwendet die Kleinbuchstaben sun bis sat. Jeder Wert ist ein Array von [start, end]-Paaren im 24-Stunden-Format HH:mm mit führenden Nullen. Blöcke müssen nicht leer, geordnet und überschneidungsfrei sein. end ist exklusiv. Ein Block darf nicht über Mitternacht reichen; teilen Sie ein Quellintervall über Nacht in einen späten Block am ersten Tag und einen frühen Block am folgenden Tag auf.
Stabile IDs und Bereichszuordnung
external_id muss während der gesamten Lebensdauer eines logischen Zeitfensters stabil und innerhalb des Mitglieder-Snapshots eindeutig sein. Halten Sie sie stabil, wenn sich Zeiten oder Bezeichnungen ändern, damit Betreiber und Audit-Datensätze Revisionen einander zuordnen können. Verwenden Sie sie nicht für ein unabhängiges Zeitfenster wieder.
scope_key ist Ihr stabiles logisches Zutrittsziel. Standardwert ist default. Ein Administrator der Einrichtung ordnet jeden zulässigen Schlüssel einem Ziel im Performance Hub zu: der gesamten Einrichtung, einer Tür oder einem Zugriffsbereich:
Vollständige Snapshots und Revisionen
Behandeln Sie die beiden Felder als separat versionierte Partition innerhalb des Mitglieder-Upserts:
| Eingabe | Ergebnis |
|---|---|
access_time_windows weggelassen |
Der vorhandene Snapshot bleibt unverändert; keine Revision erforderlich |
| Vorhanden mit neuerer Revision | Der gesamte gespeicherte Snapshot für dieses Mitglied und diese Quelle wird ersetzt |
| Gleiche Revision und gleiche normalisierte Payload | Idempotente Wiederholung; keine Änderung am Snapshot |
| Gleiche Revision und abweichende normalisierte Payload | Konflikt; nach dem Abgleich eine neue Revision vergeben |
| Ältere Revision | Der veraltete Snapshot wird übersprungen; er kann keinen neueren Zustand überschreiben |
access_time_windows: [] mit neuerer Revision |
Widerruft explizit alle quelleigenen Zeitfenster |
Ein Snapshot ist vollständig, kein Patch. Wenn Revision 1842 die Zeitfenster A und B enthält, entfernt Revision 1843, die nur B enthält, das Zeitfenster A.
Führen Sie pro Partner und Mitglied einen einzigen koordinierten Revisionsstrom über Webhook-Worker, Polling, Wiederholung und vollständigen Abgleich hinweg. Eine dauerhafte Datenbanksequenz wird bevorzugt. Ein Unix-Millisekundenwert kann nur dann als Revision verwendet werden, wenn alle Schreiber sich abstimmen und eine strikte Reihenfolge und Eindeutigkeit garantieren; es handelt sich um einen Revisionswert, nicht um ein Epoch-Feld.
Speichern Sie die exakte Anfrage und Revision, bis die API-Antwort bekannt ist. Wiederholen Sie nach einer Zeitüberschreitung oder einem vorübergehenden Fehler denselben normalisierten Snapshot mit derselben Revision. Vergeben Sie keine neue Revision, nur weil die Zustellung auf Transportebene unsicher ist.
Stornierung, Ablauf und Fehler der Quelle
- Ein Zeitfenster stornieren: Rufen Sie den maßgeblichen Quellzustand erfolgreich ab, entfernen Sie dieses Zeitfenster und senden Sie den verbleibenden vollständigen Snapshot mit einer neueren Revision.
- Alle Zeitfenster stornieren: Senden Sie
access_time_windows: []mit einer neueren Revision. - Ein absolutes Zeitfenster ablaufen lassen: Es erlaubt ab
tokeinen Zutritt mehr; senden Sie später einen Abgleich ohne den abgelaufenen Eintrag, um die Snapshots sauber zu halten. - Ein wöchentliches Zeitfenster beenden: Entfernen Sie es in einem neueren Snapshot oder verwenden Sie
active_until, wenn die Quelle einen bekannten Endzeitpunkt hat. - Abruf aus der Quelle schlägt fehl oder ist unvollständig: Senden Sie kein
[]und veröffentlichen Sie keinen unvollständigen Snapshot. Lösen Sie eine Warnung aus und wiederholen Sie den Abruf. Wird ein Fehler der Quelle in einen leeren Snapshot umgewandelt, führt das zu einem unbeabsichtigten Widerruf des Zutritts. - Anfrage an die Partner API besteht die Validierung nicht: Korrigieren Sie die Daten und senden Sie nur dann eine neuere Revision, wenn sich der normalisierte Snapshot ändert. Wiederholen Sie vorübergehende Fehler mit der ursprünglichen Revision.
Die Aktualität der Quelle wird pro Integration anhand der zugesagten Liefer- und Abgleichsfrequenz konfiguriert. Vereinbaren Sie vor der Aktivierung das maximale Alter der Quelldaten, was bei Überschreitung geschieht, Schwellenwerte für Warnungen und ob Betreiber bestätigen dürfen, sich nur auf die eigenen Grenzen jedes Zeitfensters zu verlassen. Ein veraltetes Quellzeitfenster wird nie zu einer Verweigerungsregel; reguläre Regeln und dauerhafte Berechtigungen bleiben Fallback-Pfade.
Producer-Algorithmus
Verwenden Sie diesen sprachunabhängigen Ablauf für jede Mitgliederaktualisierung:
Zertifizierungscheckliste
Führen Sie diese Prüfungen in einer Stage-Einrichtung mit der endgültigen scope_key-Zuordnung durch:
- Ein absolutes Zeitfenster ohne Zeitzone wird akzeptiert und als UTC ausgewertet.
- Ein absolutes Zeitfenster mit benutzerdefinierter IANA-Zeitzone behält dieselben
from/to-Zeitpunkte bei. - Ein wöchentliches Zeitfenster mit benutzerdefinierter IANA-Zeitzone folgt der lokalen Uhrzeit über die Umstellungen auf Sommer- und Winterzeit hinweg.
- Ein gemischter Snapshot aus absoluten und wöchentlichen Zeitfenstern ersetzt den vorherigen Snapshot vollständig.
- Der Zutritt beginnt genau bei
fromund endet genau beito; auch die Enden wöchentlicher Blöcke sind exklusiv. - Die Aktualisierung von Zeiten unter derselben
external_idmit einer neueren Revision wird wirksam. - Das Weglassen von
access_time_windowsändert andere Mitgliederfelder, ohne die Zeitfenster zu ändern. - Die Wiederholung derselben Revision bzw. Payload ist idempotent.
- Gleiche Revision mit abweichender Payload gibt einen Konflikt zurück und ändert den Snapshot nicht.
- Eine ältere Revision, die außerhalb der Reihenfolge eintrifft, wird als veraltet gemeldet und kann den Zustand nicht zurücksetzen.
- Ein neueres
[]widerruft quelleigene Zeitfenster; bei einem fehlgeschlagenen Abruf aus der Quelle wird nichts gesendet. - Ein unbekannter oder nicht zugeordneter
scope_keyführt zur Verweigerung (fail closed) und erzeugt eine für Betreiber sichtbare Warnung. - Warnungen zum Alter der Quelldaten und die konfigurierte Richtlinie für veraltete Quellen funktionieren beim vereinbarten Schwellenwert.
- Webhook- und vollständige Abgleichspfade führen zum selben Snapshot und zur selben Revisionsreihenfolge.
- Die Zustellung über den Strom erreicht Door & Gate Access innerhalb des vereinbarten Ziels.
- Ein aktives Zeitfenster kann den Zutritt zur zugeordneten physischen Tür erlauben, aber weder die Deaktivierung von Benutzern,
blockAllAccess, die Wartung noch das Geofencing umgehen. - Vor, außerhalb und nach einem Zeitfenster erlauben reguläre Regeln und dauerhafte Berechtigungen weiterhin Benutzern den Zutritt, die ansonsten berechtigt sind.
Weiterführende Hinweise
{
"external_id": "access-4b1782",
"kind": "absolute",
"from": 1792053000,
"to": 1792058400,
"timezone": "Australia/Perth",
"scope_key": "after_hours_entry",
"label": "Temporary site access"
}
Erforderliche Felder sind external_id, kind, from und to. timezone, scope_key und label sind optional.
Ein wöchentliches Zeitfenster bezeichnet wiederkehrende Intervalle in lokaler Uhrzeit, optional begrenzt durch UTC-Zeitpunkte:
{
"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"
}
Erforderliche Felder sind external_id, kind und access_hours. timezone, active_from, active_until, scope_key und label sind optional.
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"
}
]
}
]
}'
Verwenden Sie entsprechend Ihrer konfigurierten Verknüpfungsmethode entweder facility_id oder linking_identifier. Senden Sie nicht beide.
Epoch-Umrechnung
2026-10-15T08:30:00Z wird in 1792053000 umgerechnet:
UTC instant Unix milliseconds Unix seconds sent
2026-10-15T08:30:00Z 1792053000000 1792053000
Sprachunabhängige Umrechnung:
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
Wenn die Quelle eine Genauigkeit unterhalb einer Sekunde hat, legen Sie vor den Integrationstests bewusst eine Rundungsrichtlinie für Start und Ende fest. Übergeben Sie niemals Millisekunden in der Erwartung, dass die API die Einheit erkennt.
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
Partner senden innerhalb eines Zeitfensters keine Einrichtungs-, Tür- oder Zugriffsbereichs-IDs des Performance Hub. Ein unbekannter, deaktivierter oder nicht zugeordneter scope_key führt für dieses Zeitfenster zur Verweigerung (fail closed); er erweitert den Zutritt nicht. Vereinbaren und testen Sie die Zuordnungen vor dem Launch.
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)
Mindest-Testvektoren
[
{
"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."
}
]
Reichen Sie außerdem Negativvektoren ein für Unix-Millisekunden, numerische Strings, Gleitkommazahlen, ungültige IANA-Zonen, from >= to, doppelte external_id, sich überschneidende Blöcke, Blöcke über Mitternacht, mehr als acht Blöcke an einem Tag, mehr als 50 Zeitfenster und nicht zugeordnete Bereichsschlüssel.
Ein Mitglied speichern
Erstellt oder aktualisiert Mitgliederdatensätze. Die API entscheidet anhand der member_id, ob ein Datensatz erstellt oder aktualisiert wird.
Parameter
members
arrayerforderlichArray der zu speichernden Mitgliederobjekte. Empfohlenes Maximum für optimale Leistung: 1000 Elemente pro Anfrage. Die API fasst Elemente für die Verarbeitung automatisch in Batches zusammen. Jedes Element muss entweder
facility_id(erforderlich, wennlinking_identifiernicht verwendet wird) oderlinking_identifier(erforderlich, wennfacility_idnicht verwendet wird) enthalten.Wenn ein Mitglied
access_time_windowsenthält, muss es auchaccess_time_windows_revisionenthalten. Das Array ist ein vollständiger Quell-Snapshot, kein Patch. Lassen Sie es weg, um den vorhandenen Snapshot beizubehalten, oder senden Sie[]mit einer neueren Revision, um alle quelleigenen Zeitfenster zu widerrufen. Lesen Sie den Leitfaden zu Access Time Windows, bevor Sie dieses Feld aktivieren.
Rückgabe
Gibt eine einfache Meldung zurück, die den Synchronisierungsvorgang bestätigt.
Die Profilfelder des Mitglieds werden weiterhin normal per Upsert verarbeitet, auch wenn ein Zeitfenster-Snapshot als idempotente Wiederholung oder als veraltet übersprungen gemeldet wird. Ein widersprüchlicher Snapshot mit gleicher Revision und abweichender Payload kann nicht unverändert wiederholt werden; gleichen Sie den Quellzustand ab und senden Sie eine neuere Revision.
Anfrage
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
}
]
}
]
}'
Antwort
Gibt eine Erfolgsmeldung mit Metadaten zum Synchronisierungsvorgang zurück.
{
"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"
}
]
}
}
Metadatenfelder:
- success - Anzahl der erfolgreich verarbeiteten Mitglieder
- skipped - Anzahl der übersprungenen Mitglieder (falls vorhanden)
- skipped_items - Array der übersprungenen Mitglieder mit Gründen (falls vorhanden)
- dry-run - Boolesches Flag bei Verwendung des Schlüsseltyps dryrun (falls zutreffend)
Check-ins
Stellt einen Datensatz über die Anwesenheit einer Person in einer Einrichtung, einem Kurs oder bei einer Aktivität dar. Wird zur Erfassung der Anwesenheit, für Nutzungsanalysen und zur Verbesserung der Genauigkeit der visuellen Erkennung verwendet.
Endpunkte
POST /partner/v1/check-ins - Save check-ins
Das Check-in-Objekt
Attribute
check_in_id
stringoptionalEindeutige Kennung des Check-ins. Optional – wird aus dem Paar
member_idundtimestampautomatisch erzeugt, wenn sie nicht angegeben wird.member_id
stringerforderlichEindeutige Kennung des Mitglieds.
facility_id
stringentweder/oderGeben Sie den für Ihre Integration konfigurierten Typ der Einrichtungskennung an: Verwenden Sie facility_id für Direct-Link-Integrationen oder linking_identifier für Linking-Identifier-Integrationen. Senden Sie nicht beide; die API verwendet den für Ihr Partnerkonto konfigurierten Kennungstyp und ignoriert den anderen. Weitere InformationenEindeutige Kennung der Einrichtung aus dem Performance Hub.
linking_identifier
stringentweder/oderGeben Sie den für Ihre Integration konfigurierten Typ der Einrichtungskennung an: Verwenden Sie facility_id für Direct-Link-Integrationen oder linking_identifier für Linking-Identifier-Integrationen. Senden Sie nicht beide; die API verwendet den für Ihr Partnerkonto konfigurierten Kennungstyp und ignoriert den anderen. Weitere InformationenEindeutiger Kennungswert, den der Partner für jeden Standort verwendet (z. B. „Branch ID“, „Location Code“, „Store Number“). Weitere Informationen
check_in_type
stringoptionalArt des Besuchs. Einer der Werte
member,class,staff,guestodertrial.source
stringoptionalWie der Check-in erfasst wurde. Gängige Werte sind
manual,tag,rfid,kiosk,app. Weitere Werte wiedoor_readeroderbookingkönnen ebenfalls verwendet werden.class_id
stringoptionalOptional. Wenn der Check-in mit einer Kursbuchung oder Kursteilnahme verknüpft ist.
timestamp
stringerforderlichZeitstempel im Format ISO 8601, zu dem der Check-in erfolgte.
Das Check-in-Objekt
{
// "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"
}
Check-ins speichern
Erstellt Check-in-Datensätze. Die API dedupliziert automatisch anhand von Mitglied, Einrichtung und Zeitstempel.
Parameter
check_ins
arrayerforderlichArray der zu speichernden Check-in-Objekte. Empfohlenes Maximum für optimale Leistung: 1000 Elemente pro Anfrage. Die API fasst Elemente für die Verarbeitung automatisch in Batches zusammen. Jedes Element muss entweder
facility_id(erforderlich, wennlinking_identifiernicht verwendet wird) oderlinking_identifier(erforderlich, wennfacility_idnicht verwendet wird) enthalten.
Rückgabe
Gibt eine einfache Meldung zurück, die den Synchronisierungsvorgang bestätigt.
Anfrage
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"
}
]
}'
Antwort
Gibt eine Erfolgsmeldung mit Metadaten zum Synchronisierungsvorgang zurück.
{
"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"
}
]
}
}
Metadatenfelder:
- success - Anzahl der erfolgreich verarbeiteten Check-ins
- skipped - Anzahl der übersprungenen Check-ins (falls vorhanden)
- skipped_items - Array der übersprungenen Check-ins mit Gründen (falls vorhanden)
- dry-run - Boolesches Flag bei Verwendung des Schlüsseltyps dryrun (falls zutreffend)
Zutrittskontrolle
Die Partner API kann die Hardware des Door/Gate Controller des Performance Hub in Einrichtungen auslösen, in denen Ihre Integration aktiviert ist.
Verwenden Sie diese API, wenn Ihr Mitgliederverwaltungssystem bereits entschieden hat, dass eine Person eintreten darf. Der Performance Hub prüft weder Mitgliedschaftsstatus, Zutrittszeiten, Türzonenregeln, Betrugsprüfungen noch Sperrlogik. Ihr System bleibt für diese Entscheidungen maßgeblich.
Die Entriegelungsanfrage ist synchron. Der Performance Hub sendet den Befehl in Echtzeit an den Controller vor Ort und gibt 200 erst zurück, nachdem das Gerät bestätigt hat, dass das Relais physisch entriegelt hat. Die meisten Bestätigungen sollten innerhalb von 3-5 Sekunden erfolgen. Wenn innerhalb des Zeitlimits keine Bestätigung eingeht, gibt die API einen expliziten Fehler zurück.
Sie können auch einen Zutrittsversuch oder eine Ablehnung erfassen, die den Controller nie erreicht hat. Dieser Aufruf entriegelt die Tür nicht. Er schreibt ein Ereignis in die Zugriffsprotokolle von Door & Gate Access.
Endpunkte
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
Das Door/Gate Controller-Objekt
Attribute
door_id
stringerforderlichEindeutige Kennung des Door/Gate Controller. Speichern Sie sie nach der Erkennung in Ihrem System und verwenden Sie sie beim Aufruf des Entriegelungs-Endpunkts.
facility_id
stringerforderlichEinrichtungs-ID des Performance Hub.
linking_identifier
stringoptionalEinrichtungskennung des Partners, wenn Ihre Integration Linking Identifier verwendet. Weitere Informationen
name
stringerforderlichIm Performance Hub konfigurierter, menschenlesbarer Gerätename.
zone
stringoptionalTürzone oder Standort, etwa
Entrance.status
stringerforderlichonlineoderoffline.relay_state
stringoptionalZuletzt bekannter Relaiszustand, etwa
lockedoderunlocked.maintenance_mode
stringerforderlichAktueller Wartungsmodus. Einer der Werte
off,force-openoderforce-closed.hold_time_seconds
integererforderlichFür die Tür konfigurierte Standard-Haltezeit der Entriegelung.
last_seen
stringoptionalISO-Zeitstempel der letzten Aktualisierung der Gerätemetadaten.
Das Door/Gate Controller-Objekt
{
"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 auflisten
Gibt die Door/Gate Controller zurück, die für Ihre Integration verfügbar sind.
Wenn weder facility_id noch linking_identifier angegeben ist, gibt die API die Door/Gate Controller aller Einrichtungen zurück, die mit Ihrem Partnerkonto verknüpft sind.
Parameter
facility_id
stringoptional entweder/oderGeben Sie den für Ihre Integration konfigurierten Typ der Einrichtungskennung an: Verwenden Sie facility_id für Direct-Link-Integrationen oder linking_identifier für Linking-Identifier-Integrationen. Senden Sie nicht beide; die API verwendet den für Ihr Partnerkonto konfigurierten Kennungstyp und ignoriert den anderen. Weitere InformationenEinrichtungs-ID des Performance Hub. Verwenden Sie diese für Direct-Link-Integrationen.
linking_identifier
stringoptional entweder/oderGeben Sie den für Ihre Integration konfigurierten Typ der Einrichtungskennung an: Verwenden Sie facility_id für Direct-Link-Integrationen oder linking_identifier für Linking-Identifier-Integrationen. Senden Sie nicht beide; die API verwendet den für Ihr Partnerkonto konfigurierten Kennungstyp und ignoriert den anderen. Weitere InformationenIhre eigene Einrichtungs-/Standortkennung. Verwenden Sie diese, wenn Ihre Integration für Linking Identifier konfiguriert ist.
Rückgabe
Gibt ein Array von Door/Gate Controller-Objekten zurück.
Anfrage
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:
Antwort
{
"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"
}
]
}
Status eines Door/Gate Controller abrufen
Ruft den zuletzt bekannten Zustand und die Basiskonfiguration eines einzelnen Door/Gate Controller ab.
Geben Sie eine Einrichtungskennung an, damit der Performance Hub prüfen kann, ob die Tür zu einer Einrichtung gehört, auf die Ihre Integration zugreifen darf.
Parameter
door_id
stringerforderlichDie vom Listen-Endpunkt zurückgegebene ID des Door/Gate Controller.
facility_id
stringentweder/oderGeben Sie den für Ihre Integration konfigurierten Typ der Einrichtungskennung an: Verwenden Sie facility_id für Direct-Link-Integrationen oder linking_identifier für Linking-Identifier-Integrationen. Senden Sie nicht beide; die API verwendet den für Ihr Partnerkonto konfigurierten Kennungstyp und ignoriert den anderen. Weitere InformationenEinrichtungs-ID des Performance Hub. Erforderlich für Direct-Link-Integrationen.
linking_identifier
stringentweder/oderGeben Sie den für Ihre Integration konfigurierten Typ der Einrichtungskennung an: Verwenden Sie facility_id für Direct-Link-Integrationen oder linking_identifier für Linking-Identifier-Integrationen. Senden Sie nicht beide; die API verwendet den für Ihr Partnerkonto konfigurierten Kennungstyp und ignoriert den anderen. Weitere InformationenEinrichtungskennung des Partners. Erforderlich für Linking-Identifier-Integrationen.
Rückgabe
Gibt ein Door/Gate Controller-Objekt zurück.
Anfrage
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:
Antwort
{
"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"
}
}
Einen Door/Gate Controller entriegeln
Sendet einen Entriegelungsbefehl an den Door/Gate Controller und wartet, bis das physische Relais die Entriegelung bestätigt.
Ihr System muss entscheiden, ob die Person berechtigt ist, bevor es diesen Endpunkt aufruft. Der Performance Hub prüft nur den Partnerschlüssel, den Einrichtungszugriff, die Zugehörigkeit der Tür und den Gerätezustand.
Parameter
door_id
stringerforderlichDie vom Listen-Endpunkt zurückgegebene ID des Door/Gate Controller.
facility_id
stringentweder/oderGeben Sie den für Ihre Integration konfigurierten Typ der Einrichtungskennung an: Verwenden Sie facility_id für Direct-Link-Integrationen oder linking_identifier für Linking-Identifier-Integrationen. Senden Sie nicht beide; die API verwendet den für Ihr Partnerkonto konfigurierten Kennungstyp und ignoriert den anderen. Weitere InformationenEinrichtungs-ID des Performance Hub. Erforderlich für Direct-Link-Integrationen.
linking_identifier
stringentweder/oderGeben Sie den für Ihre Integration konfigurierten Typ der Einrichtungskennung an: Verwenden Sie facility_id für Direct-Link-Integrationen oder linking_identifier für Linking-Identifier-Integrationen. Senden Sie nicht beide; die API verwendet den für Ihr Partnerkonto konfigurierten Kennungstyp und ignoriert den anderen. Weitere InformationenEinrichtungskennung des Partners. Erforderlich für Linking-Identifier-Integrationen.
member_id
stringerforderlichMitglieds-ID des Partners. Wird für die Audit-Protokollierung und die spätere Datenverknüpfung verwendet.
first_name
stringerforderlichVorname der Person, die die Tür öffnet.
last_name
stringerforderlichNachname der Person, die die Tür öffnet.
full_name
stringoptionalOptional. Wenn das Feld fehlt, kombiniert der Performance Hub
first_nameundlast_name.check_in_id
stringoptionalOptionale Check-in-ID aus Ihrem System zur Zuordnung.
idempotency_key
stringoptionalOptionaler Schlüssel zum Schutz vor Wiederholungen. Wird derselbe Schlüssel für denselben Partner, dieselbe Einrichtung und dieselbe Tür erneut verwendet, wird das vorhandene Ergebnis zurückgegeben, sofern verfügbar.
Rückgabe
Gibt 200 nur zurück, wenn das Gerät bestätigt, dass das Relais physisch entriegelt hat. Die Tür verwendet die in der Geräteverwaltung des Performance Hub konfigurierte Haltezeit; Partner können das Relais-Timing nicht pro Anfrage überschreiben. Die meisten Bestätigungen sollten innerhalb von 3-5 Sekunden erfolgen. Behandeln Sie das dokumentierte Zeitlimit als explizit fehlgeschlagene Entriegelung und wiederholen Sie den Vorgang nur gemäß Ihren eigenen Sicherheitsregeln.
Häufige Fehler:
403 integration_not_enabled- Ihre Integration ist für die Einrichtung nicht aktiviert.409 maintenance_mode_active- Das Personal der Einrichtung hat den Wartungsmodus für die Tür aktiviert.503 device_offline- Der Door/Gate Controller ist offline oder seine Daten sind veraltet.504 unlock_confirmation_timeout- Der Befehl wurde gesendet, aber vor Ablauf des Zeitlimits ging keine passende Bestätigung ein.
Anfrage
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"
}'
Antwort
{
"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"
}
Fehlerantwort
{
"status": "failed",
"reason": "device_offline",
"door_id": "00000000000000000000000000000007",
"facility_id": "550e8400-e29b-41d4-a716-446655440000",
"event_id": "00000000-0000-0000-0000-000000000045"
}
Einen Zutrittsversuch oder eine Ablehnung erfassen
Erfasst einen Zutrittsversuch oder eine Ablehnung, über die Ihr System bereits entschieden hat. Der Door/Gate Controller wird nicht kontaktiert, und die Tür wird nicht entriegelt.
Verwenden Sie diesen Aufruf, wenn Ihr System den Zutritt verweigert oder wenn ein Versuch ohne Entriegelung in den Zugriffsprotokollen von Door & Gate Access erscheinen soll. Der Performance Hub prüft weder Mitgliedschaftsstatus, Zutrittszeiten noch andere Zutrittsregeln.
Ein abgelehntes Ereignis erscheint in den Zugriffsprotokollen von Door & Gate Access mit dem Ergebnis Denied, Ihrem Partnernamen, der Tür, der Mitgliedskennung (sofern Sie eine senden) und dem Grundcode in lesbarer Form. Beispielsweise wird membership_expired als „Membership Expired“ angezeigt. reason_display_text und user_email werden mit dem Ereignis gespeichert.
Parameter
door_id
stringerforderlichDie vom Listen-Endpunkt zurückgegebene ID des Door/Gate Controller.
facility_id
stringentweder/oderGeben Sie den für Ihre Integration konfigurierten Typ der Einrichtungskennung an: Verwenden Sie facility_id für Direct-Link-Integrationen oder linking_identifier für Linking-Identifier-Integrationen. Senden Sie nicht beide; die API verwendet den für Ihr Partnerkonto konfigurierten Kennungstyp und ignoriert den anderen. Weitere InformationenEinrichtungs-ID des Performance Hub. Erforderlich für Direct-Link-Integrationen.
linking_identifier
stringentweder/oderGeben Sie den für Ihre Integration konfigurierten Typ der Einrichtungskennung an: Verwenden Sie facility_id für Direct-Link-Integrationen oder linking_identifier für Linking-Identifier-Integrationen. Senden Sie nicht beide; die API verwendet den für Ihr Partnerkonto konfigurierten Kennungstyp und ignoriert den anderen. Weitere InformationenEinrichtungskennung des Partners. Erforderlich für Linking-Identifier-Integrationen.
outcome
stringerforderlichdeniedoderattempted.reason
stringoptionalGrundcode in Kleinbuchstaben im snake_case-Format, bis zu 64 Zeichen. Erforderlich, wenn
outcomeden Wertdeniedhat. Beispiel:membership_expired.reason_display_text
stringoptionalMenschenlesbarer Grund, bis zu 256 Zeichen. Beispiel:
Membership expired on 2026-04-01.member_id
stringoptionalMitglieds-ID des Partners. Lassen Sie sie weg, wenn die Zugangsdaten keinem Mitglied zugeordnet werden konnten, etwa bei einer unbekannten Karte.
user_email
stringoptionalE-Mail-Adresse der Person, die den Zutritt versucht hat.
timestamp
stringoptionalZeitpunkt des Versuchs im Format ISO 8601 mit Zeitzone. Beispiel:
2026-05-18T10:15:30Z. Standardmäßig der Zeitpunkt, zu dem die Anfrage eingeht. Darf nicht mehr als 5 Minuten in der Zukunft oder mehr als 30 Tage in der Vergangenheit liegen.idempotency_key
stringoptionalSchlüssel zum Schutz vor Wiederholungen, bis zu 128 Zeichen. Wird derselbe Schlüssel für denselben Partner, dieselbe Einrichtung und dieselbe Tür erneut verwendet, wird das ursprüngliche Ergebnis zurückgegeben.
Rückgabe
Gibt 201 zurück, wenn das Ereignis erfasst wurde. Eine Wiederholung mit demselben idempotency_key gibt 200 zurück, wobei idempotent auf true gesetzt ist, und erstellt kein weiteres Ereignis.
Ein Dry-Run-Schlüssel gibt 200 zurück, wobei dry_run auf true gesetzt ist. Es wird nichts erfasst.
Häufige Fehler:
400- Der Body ist ungültig, eine Ablehnung hat keinenreason, der Zeitstempel liegt außerhalb des zulässigen Bereichs oderfacility_id/linking_identifierentspricht keiner verknüpften Einrichtung.403- Der Schlüssel ist schreibgeschützt.403 integration_not_enabled- Ihre Integration ist für die Einrichtung nicht aktiviert.messagenennt den Grund.404- Der Door/Gate Controller wurde für die verknüpfte Einrichtung nicht gefunden.
Anfrage
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"
}'
Antwort
{
"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"
}
Idempotente Wiederholung
{
"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
}
Einrichtungsberichte
Ein Datensatz zu einem bestimmten Zeitpunkt, der wichtige betriebliche und finanzielle Kennzahlen einer Einrichtung für einen bestimmten Zeitraum erfasst.
Endpunkte
POST /partner/v1/report-snapshots - Save report snapshots
Das Berichts-Snapshot-Objekt
Attribute
facility_id
stringentweder/oderGeben Sie den für Ihre Integration konfigurierten Typ der Einrichtungskennung an: Verwenden Sie facility_id für Direct-Link-Integrationen oder linking_identifier für Linking-Identifier-Integrationen. Senden Sie nicht beide; die API verwendet den für Ihr Partnerkonto konfigurierten Kennungstyp und ignoriert den anderen. Weitere InformationenEindeutige Kennung der Einrichtung aus dem Performance Hub.
linking_identifier
stringentweder/oderGeben Sie den für Ihre Integration konfigurierten Typ der Einrichtungskennung an: Verwenden Sie facility_id für Direct-Link-Integrationen oder linking_identifier für Linking-Identifier-Integrationen. Senden Sie nicht beide; die API verwendet den für Ihr Partnerkonto konfigurierten Kennungstyp und ignoriert den anderen. Weitere InformationenEindeutiger Kennungswert, den der Partner für jeden Standort verwendet (z. B. „Branch ID“, „Location Code“, „Store Number“). Weitere Informationen
start_date
stringerforderlichStartdatum des Snapshot-Zeitraums im Format
YYYY-MM-DD.end_date
stringerforderlichEnddatum des Snapshot-Zeitraums im Format
YYYY-MM-DD.metrics
objecterforderlichKennzahlenobjekt mit Mitglieder- und Umsatzdaten für den Zeitraum.
Das Berichts-Snapshot-Objekt
{
"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"
}
}
}
Berichts-Snapshots speichern
Übermittelt betriebliche und finanzielle Kennzahlen einer Einrichtung für einen bestimmten Zeitraum.
Parameter
snapshots
arrayerforderlichArray der zu speichernden Berichts-Snapshot-Objekte. Maximal 25 Elemente pro Anfrage. Jedes Element muss entweder
facility_id(erforderlich, wennlinking_identifiernicht verwendet wird) oderlinking_identifier(erforderlich, wennfacility_idnicht verwendet wird) enthalten.
Rückgabe
Gibt eine einfache Meldung zurück, die den Synchronisierungsvorgang bestätigt.
Anfrage
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"
}
}
}
]
}'
Antwort
{
"message": "Report snapshot sync successful."
}
Fehler
Die Partner API verwendet Standard-HTTP-Statuscodes und JSON-Antworttexte, um zu erklären, warum eine Anfrage fehlgeschlagen ist.
Aufbau der Fehlerantwort
Die meisten API-Fehler geben einen JSON-Body mit einer Meldung und, sofern verfügbar, strukturierten Details zurück.
Statuscodes
Fehler bei Access Time Windows
Die Validierung der Zeitfenster schlägt fehl, bevor der ungültige Snapshot geschrieben wird. Häufige Ursachen, bei denen eine Wiederholung nicht hilft, sind:
- Fehlende
access_time_windows_revision, wennaccess_time_windowsvorhanden ist. - Epoch-Werte als String, als Gleitkommazahl oder vermutlich in Millisekunden.
- Eine ungültige IANA-Zeitzone, ein umgekehrtes Intervall, eine doppelte
external_id, sich überschneidende wöchentliche Blöcke oder ein nicht aufgeteilter Block über Mitternacht. - Ein Wert außerhalb der dokumentierten Grenzen für Anzahl, Länge oder Zeitspanne.
Eine wiederholte Revision mit abweichendem normalisiertem Inhalt führt zu 409 Conflict. Gleichen Sie mit dem neuesten maßgeblichen Zustand ab und vergeben Sie eine neuere Revision; wiederholen Sie das widersprüchliche Paar nicht immer wieder. Eine ältere Revision wird als veralteter, übersprungener Snapshot gemeldet, statt einen neueren Zustand überschreiben zu dürfen. Ein unbekannter oder nicht zugeordneter scope_key führt bei der Autorisierung zur Verweigerung (fail closed) und sollte als Konfigurationswarnung behandelt werden.
Wenn bei der Zustellung eine Zeitüberschreitung auftritt oder ein vorübergehender 5xx-Fehler zurückkommt, wiederholen Sie genau denselben normalisierten Snapshot mit derselben Revision. Wenn der Abruf aus der Quelle fehlgeschlagen ist, lassen Sie das Zeitfensterfeld vollständig weg; ersetzen Sie es niemals durch ein leeres Array.
Hinweise zu Wiederholungen
Wiederholen Sie diese mit begrenztem exponentiellem Backoff:
429500502503504
Wiederholen Sie diese nicht ungeprüft:
400401403404409422
Behandeln Sie bei der Zutrittskontrolle Zeitüberschreitungs- und Offline-Antworten immer als fehlgeschlagene Entriegelungen, sofern Ihre eigenen Zutrittsregeln und Sicherheitsprozesse nichts anderes vorsehen.
Angaben für den Support
Wenn Sie sich an den Support wenden, geben Sie Folgendes an:
- Endpunkt und HTTP-Methode.
- Zeitstempel und Zeitzone.
- Partner-Schlüssel-ID, nicht den geheimen Schlüssel.
- Verwendete Einrichtungskennung.
- Quelldatensatz-ID aus Ihrem System.
- Antwortstatus und Antworttext.
event_idodercommand_id, sofern verfügbar.
{
"success": false,
"message": "Request body.members[0].member_id is required"
}
Einige domänenspezifische Endpunkte geben einen expliziten Status und Grund zurück. Fehler bei der Zutrittskontrolle enthalten beispielsweise Felder wie reason, door_id, facility_id und 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
Die Anfrage ist fehlerhaft oder es fehlen erforderliche Felder. Korrigieren Sie die Anfrage, bevor Sie sie wiederholen.
401 Unauthorized
Die Authentifizierung ist fehlgeschlagen. Prüfen Sie, ob Sie HTTP Basic Auth mit Ihrem geheimen API-Schlüssel als Benutzernamen und einem leeren Passwort verwenden.
403 Forbidden
Der Schlüssel ist gültig, aber der Vorgang ist nicht zulässig. Häufige Ursachen sind die Verwendung eines schreibgeschützten Schlüssels für einen Schreibvorgang oder der Versuch, auf eine Einrichtung zuzugreifen, für die Ihre Integration nicht aktiviert ist.
404 Not Found
Die angeforderte Ressource wurde nicht gefunden oder ist für Ihre Integration nicht verfügbar.
409 Conflict
Die Anfrage steht im Konflikt mit dem aktuellen Zustand der Ressource. Bei der Zutrittskontrolle kann dies bedeuten, dass sich ein Door/Gate Controller im Wartungsmodus befindet.
422 Unprocessable Entity
Die Anfrage ist gültiges JSON, besteht aber die semantische Validierung nicht. Korrigieren Sie die Daten, bevor Sie die Anfrage wiederholen.
429 Too Many Requests
Die Integration hat die dokumentierte Ratenbegrenzung überschritten. Wiederholen Sie die Anfrage mit exponentiellem Backoff.
500 Internal Server Error
Der Performance Hub konnte die Anfrage aufgrund eines internen Fehlers nicht abschließen. Wiederholen Sie sie mit Backoff. Wenn das Problem weiterhin besteht, wenden Sie sich mit Endpunkt, Zeitstempel und Antworttext an den Support.
503 Service Unavailable
Ein abhängiger Dienst oder ein Gerät ist nicht verfügbar. Bei Entriegelungen über den Door/Gate Controller kann dies bedeuten, dass der Controller offline ist.
504 Gateway Timeout
Bei dem Vorgang ist eine Zeitüberschreitung aufgetreten. Bei Entriegelungen über den Door/Gate Controller bedeutet dies, dass die Entriegelung nicht vor Ablauf des Zeitlimits bestätigt wurde.
Versionierung
Die Partner API wird über die URL versioniert. Die aktuelle Version ist:
Änderungsrichtlinie
Der Performance Hub ist bestrebt, nach Möglichkeit nur ergänzende, abwärtskompatible Änderungen vorzunehmen.
Beispiele für abwärtskompatible Änderungen:
- Hinzufügen eines neuen optionalen Felds zu einer Anfrage.
- Hinzufügen eines neuen Felds zu einer Antwort.
- Hinzufügen eines neuen Endpunkts.
- Hinzufügen eines neuen Enum-Werts, sofern von Clients erwartet wird, dass sie unbekannte Werte verarbeiten.
- Verbesserung von Validierungsmeldungen, ohne den Vertrag für Statuscodes zu ändern.
access_time_windows und access_time_windows_revision sind ergänzende Anfragefelder für Mitglieder. Bestehende Clients, die sie weglassen, lassen den gespeicherten Access Time Windows-Snapshot unverändert. Diese Regel zum Weglassen erhält die Kompatibilität mit partiellen Upserts; das Weglassen ist nicht gleichbedeutend mit dem Senden eines leeren Arrays.
Beispiele für Breaking Changes:
- Entfernen oder Umbenennen eines Felds.
- Ändern des Typs eines Felds.
- Ein optionales Anfragefeld zur Pflicht machen.
- Entfernen eines Endpunkts.
- Ändern der Bedeutung eines vorhandenen Statuscodes oder eines domänenspezifischen
reason.
Einstellung von Funktionen
Wenn ein Breaking Change erforderlich ist, vermeidet der Performance Hub nach Möglichkeit, die bestehende Version direkt zu ändern. Stattdessen führen wir eine neue Version oder einen Migrationspfad ein und informieren die betroffenen Partner über die Änderung.
Hinweise auf eingestellte Funktionen können Folgendes umfassen:
- Einen Eintrag im Änderungsprotokoll.
- Direkte Kommunikation mit Partnern.
- Hinweise in der Partner Console.
- Migrationshinweise in der Dokumentation.
Empfehlungen für Clients
Entwickeln Sie Clients, die ergänzende Änderungen tolerieren:
- Ignorieren Sie Antwortfelder, die Sie nicht verwenden.
- Behandeln Sie unbekannte Enum-Werte als nicht unterstützt, statt abzustürzen.
- Vermeiden Sie strikte Gleichheitsprüfungen von Antworten.
- Protokollieren Sie nicht erkannte Werte, damit Sie Ihre Integration gezielt aktualisieren können.
Speichern Sie bei revisionierten Mitgliederpartitionen wie Access Time Windows die übermittelte Revision und die normalisierte Payload, bis das Ergebnis bekannt ist. Die Wiederverwendung einer Revision für geänderten Inhalt ist ein Konflikt, während die Wiederholung desselben Inhalts idempotent ist. Siehe Access Time Windows.
OpenAPI-Spezifikationen
Verwenden Sie die veröffentlichten OpenAPI-Spezifikationen, um Clients zu generieren, Anfragen zu validieren und Änderungen an der API-Struktur im Zeitverlauf nachzuverfolgen.
Siehe OpenAPI-Spezifikationen.
https://partner-api.performancehub.co/partner/v1/
Änderungsprotokoll
Dieses Änderungsprotokoll erfasst wesentliche Änderungen an der Partner API und der Partner Console, die sich auf das Verhalten von Integrationen auswirken.
2026-09-09
2026-05-06
2026-05-01
Änderungskategorien
Künftige Einträge verwenden diese Kategorien:
- Hinzugefügt - neuer Endpunkt, neues Feld, neuer Leitfaden oder neue Funktion.
- Geändert - Verhalten oder Dokumentation geändert, ohne die Unterstützung zu entfernen.
- Veraltet - Funktion bleibt verfügbar, für sie ist aber ein Migrationspfad geplant.
- Entfernt - Funktion oder Endpunkt entfernt.
- Behoben - Fehlerbehebung oder Korrektur der Dokumentation.
- Sicherheit - Änderung an Authentifizierung, Autorisierung, Datenverarbeitung oder Schlüsselverwaltung.
Hinzugefügt
- Herstellerneutrale
access_time_windows-Snapshots für Mitglieder mit gemischten absoluten und wöchentlich wiederkehrenden Zeitfenstern hinzugefügt. - Semantik für die Reihenfolge per
access_time_windows_revision, idempotente Wiederholung, Konflikte, das Überspringen veralteter Daten und expliziten Widerruf hinzugefügt. - Hinweise zu IANA-Zeitzonen, Sommerzeit, logischer
scope_key-Zuordnung, Aktualität der Quelldaten, Producer-Implementierung und Zertifizierung hinzugefügt.
Hinzugefügt
- Dokumentation zum Partnerprogramm hinzugefügt, die Partnertypen, Onboarding, Best Practices, Go-live-Bereitschaft, Fehler, Versionierung und Support abdeckt.
- Einen eigenen Anfrageablauf „Partner werden“ für interessierte technische und kommerzielle Partner hinzugefügt.
- Dokumentation dazu hinzugefügt, wie genehmigte Partnerintegrationen im Partnerverzeichnis des Performance Hub innerhalb der zentralen Performance Hub-Plattform erscheinen.
Hinzugefügt
- Dokumentation zur Zutrittskontrolle über den Door/Gate Controller hinzugefügt, einschließlich der Vorgänge zum Auflisten, Statusabruf und Entriegeln.
- Dokumentation zum synchronen Entriegelungsverhalten hinzugefügt: Die API meldet erst Erfolg, nachdem der Controller vor Ort bestätigt hat, dass das Relais physisch entriegelt hat.
- Dokumentation zur Unterstützung des optionalen
idempotency_keyfür Entriegelungsanfragen an den Door/Gate Controller hinzugefügt.