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ßlich default, 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_active und unlock_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_id und command_id.
  • Sie haben einen manuellen Ausweichprozess für das Personal der Einrichtung.

Fehlerbehandlung und Wiederholungen

  • Antworten mit 400, 401, 403, 404, 409 und 422 werden den Betreibern oder Support-Teams angezeigt, statt ungeprüft wiederholt zu werden.
  • Bei Antworten mit 429, 500, 502, 503 und 504 wird 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_id des 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:

  1. Nach 1 Sekunde wiederholen.
  2. Nach 2 Sekunden wiederholen.
  3. Nach 4 Sekunden wiederholen.
  4. 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_windows weg, 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_id und scope_key stabil 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 200 erst 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 string erforderlich

    Eindeutige Kennung der Organisation.

  • name string erforderlich

    Name 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 string erforderlich

    Eindeutige Kennung der Einrichtung.

  • org_id string erforderlich

    Eindeutige Kennung der übergeordneten Organisation.

  • name string erforderlich

    Name der Einrichtung.

  • brand string optional

    Von der Einrichtung verwendeter Markenname.

  • website_url string optional

    URL der Website der Einrichtung.

  • place_data object optional

    Standortdaten aus der Google Places API mit Land, formatierter Adresse, Google Place ID, Bundesland bzw. Provinz und Stadt.

  • social_links object optional

    Social-Media-Links der Einrichtung.

  • timezone string optional

    IANA-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 string erforderlich

    Eindeutige Kennung des Mitgliedschaftstarifs.

  • facility_id string 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 Informationen

    Eindeutige Kennung der Einrichtung aus dem Performance Hub.

  • linking_identifier string 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 Informationen

    Eindeutiger Kennungswert, den der Partner für jeden Standort verwendet (z. B. „Branch ID“, „Location Code“, „Store Number“). Weitere Informationen

  • name string erforderlich

    Menschenlesbarer Tarifname (z. B. "Office tenant – business hours", "Student – term access", "Hotel guest", "10 Class Pack").

  • billing_cycle string optional

    Abrechnungshäufigkeit. Einer der Werte weekly, fortnightly, monthly, annually oder one_time.

  • price integer optional

    Grundpreis in der kleinsten Währungseinheit (Cent bei USD/AUD).

  • currency string optional

    Währungscode nach ISO 4217 (z. B. "AUD", "USD").

  • description string optional

    Optionale Marketing- oder interne Beschreibung.

  • active_members integer optional

    Anzahl der aktiven Mitglieder mit diesem Mitgliedschaftstarif

  • is_recurring boolean optional

    Ob sich der Tarif automatisch verlängert.

  • is_trial boolean optional

    Ob es sich um ein Testangebot handelt.

  • visible_to_public boolean optional

    Ob der Tarif im Self-Service gekauft werden kann.

  • duration_days integer optional

    Anzahl der Tage, die der Mitgliedschaftstarif gültig ist.

  • access_zones array optional

    Array der im Mitgliedschaftstarif enthaltenen Zutrittszonen. Jede Zone kann eigene Zutrittszeiten definieren. Details finden Sie unter Zutrittszonen.

  • class_limit integer optional

    Maximale 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 string erforderlich

    Der Name der Zone (z. B. „Level 3 Tenancy“, „Library“, „Guest Floors“, „Main Gym Floor“).

  • description string optional

    Beschreibung dessen, was in dieser Zone enthalten ist.

  • access_hours object optional

    Zutrittszeiten 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 array erforderlich

    Array 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, wenn linking_identifier nicht verwendet wird) oder linking_identifier (erforderlich, wenn facility_id nicht 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 string erforderlich

    Eindeutige Kennung des Mitglieds.

  • facility_id string 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 Informationen

    Eindeutige Kennung der Einrichtung aus dem Performance Hub.

  • linking_identifier string 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 Informationen

    Eindeutiger Kennungswert, den der Partner für jeden Standort verwendet (z. B. „Branch ID“, „Location Code“, „Store Number“). Weitere Informationen

  • first_name string erforderlich

    Vorname des Mitglieds.

  • last_name string erforderlich

    Nachname des Mitglieds.

  • email string optional

    E-Mail-Adresse.

  • mobile_phone string optional

    Mobiltelefonnummer im Format E.123 (z. B. "+1 415 555 2671").

  • address object optional

    Objekt mit der Postanschrift und folgenden Eigenschaften:

    • address_line_1 (string) - Hauptadresse (Straße und Hausnummer)
    • address_line_2 (string, optional) - Zusätzliche Adresszeile
    • city (string) - Name der Stadt
    • state (string) - Code des Bundeslands bzw. der Provinz
    • postal_code (string) - Postleitzahl
    • country (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 string optional

    Geburtsdatum im Format YYYY-MM-DD.

  • gender string optional

    Einer der Werte male, female, non_binary, prefer_not_to_say oder unknown.

  • type string optional

    Mitgliedertyp (z. B. staff, member, prospect).

  • tags array optional

    Kurze Hilfs-Strings oder -Texte, um bestimmte Mitglieder zu kategorisieren und zu identifizieren (z. B. ["vip", "personal-training", "student"]).

  • membership_status string optional

    Aktueller Mitgliedschaftsstatus (z. B. active, expired, on_hold).

  • membership_plans array optional

    Array der Mitgliedschaftstarife, die dem Mitglied zugeordnet sind.

  • profile_picture string optional

    Base64-codiertes Profilbild (optional).

  • created string optional

    ISO 8601-Zeitstempel der Erstellung des Mitglieds.

  • updated string optional

    ISO 8601-Zeitstempel der letzten Aktualisierung des Mitglieds.

  • access_time_windows array optional

    Vollstä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 integer erforderlich mit access_time_windows

    Monoton steigende, nicht negative, JSON-sichere Ganzzahl für diesen Strom aus Mitglied und Quelle. Immer dann erforderlich, wenn access_time_windows vorhanden 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 array optional

    Der vollständige Access Time Windows-Snapshot für dieses Mitglied und diese Partnerquelle. Ein Snapshot kann absolute- und weekly-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 integer erforderlich mit access_time_windows

    Eine monoton steigende, nicht negative, JSON-sichere Ganzzahl für diesen Revisionsstrom aus Mitglied und Quelle. Sie ist immer dann erforderlich, wenn access_time_windows vorhanden ist, und darf 9007199254740991 nicht ü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 bei from beginnen; genau bei to ist er nicht mehr aktiv.
  • from muss kleiner als to sein. Wenn beide wöchentlichen Grenzen vorhanden sind, muss active_from kleiner als active_until sein.
  • 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: from und to bezeichnen bereits exakte UTC-Zeitpunkte. timezone dient nur als Metadatum für Anzeige und Audit; eine Änderung verschiebt keinen der beiden Zeitpunkte.
  • Wöchentliche Zeitfenster: timezone legt die lokale Uhrzeit und die Sommerzeitregeln fest, nach denen access_hours ausgewertet 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_from und active_until bleiben 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 to keinen 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 from und endet genau bei to; auch die Enden wöchentlicher Blöcke sind exklusiv.
  • Die Aktualisierung von Zeiten unter derselben external_id mit 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_key fü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 array erforderlich

    Array 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, wenn linking_identifier nicht verwendet wird) oder linking_identifier (erforderlich, wenn facility_id nicht verwendet wird) enthalten.

    Wenn ein Mitglied access_time_windows enthält, muss es auch access_time_windows_revision enthalten. 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 string optional

    Eindeutige Kennung des Check-ins. Optional – wird aus dem Paar member_id und timestamp automatisch erzeugt, wenn sie nicht angegeben wird.

  • member_id string erforderlich

    Eindeutige Kennung des Mitglieds.

  • facility_id string 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 Informationen

    Eindeutige Kennung der Einrichtung aus dem Performance Hub.

  • linking_identifier string 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 Informationen

    Eindeutiger Kennungswert, den der Partner für jeden Standort verwendet (z. B. „Branch ID“, „Location Code“, „Store Number“). Weitere Informationen

  • check_in_type string optional

    Art des Besuchs. Einer der Werte member, class, staff, guest oder trial.

  • source string optional

    Wie der Check-in erfasst wurde. Gängige Werte sind manual, tag, rfid, kiosk, app. Weitere Werte wie door_reader oder booking können ebenfalls verwendet werden.

  • class_id string optional

    Optional. Wenn der Check-in mit einer Kursbuchung oder Kursteilnahme verknüpft ist.

  • timestamp string erforderlich

    Zeitstempel 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 array erforderlich

    Array 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, wenn linking_identifier nicht verwendet wird) oder linking_identifier (erforderlich, wenn facility_id nicht 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 string erforderlich

    Eindeutige 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 string erforderlich

    Einrichtungs-ID des Performance Hub.

  • linking_identifier string optional

    Einrichtungskennung des Partners, wenn Ihre Integration Linking Identifier verwendet. Weitere Informationen

  • name string erforderlich

    Im Performance Hub konfigurierter, menschenlesbarer Gerätename.

  • zone string optional

    Türzone oder Standort, etwa Entrance.

  • status string erforderlich

    online oder offline.

  • relay_state string optional

    Zuletzt bekannter Relaiszustand, etwa locked oder unlocked.

  • maintenance_mode string erforderlich

    Aktueller Wartungsmodus. Einer der Werte off, force-open oder force-closed.

  • hold_time_seconds integer erforderlich

    Für die Tür konfigurierte Standard-Haltezeit der Entriegelung.

  • last_seen string optional

    ISO-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.

Recommended: Include a facility identifier whenever possible. Requests without `facility_id` or `linking_identifier` may take longer to load for partners with hundreds or thousands of Door/Gate Controllers.

Parameter

  • facility_id string optional 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 Informationen

    Einrichtungs-ID des Performance Hub. Verwenden Sie diese für Direct-Link-Integrationen.

  • linking_identifier string optional 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 Informationen

    Ihre 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 string erforderlich

    Die vom Listen-Endpunkt zurückgegebene ID des Door/Gate Controller.

  • facility_id string 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 Informationen

    Einrichtungs-ID des Performance Hub. Erforderlich für Direct-Link-Integrationen.

  • linking_identifier string 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 Informationen

    Einrichtungskennung 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 string erforderlich

    Die vom Listen-Endpunkt zurückgegebene ID des Door/Gate Controller.

  • facility_id string 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 Informationen

    Einrichtungs-ID des Performance Hub. Erforderlich für Direct-Link-Integrationen.

  • linking_identifier string 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 Informationen

    Einrichtungskennung des Partners. Erforderlich für Linking-Identifier-Integrationen.

  • member_id string erforderlich

    Mitglieds-ID des Partners. Wird für die Audit-Protokollierung und die spätere Datenverknüpfung verwendet.

  • first_name string erforderlich

    Vorname der Person, die die Tür öffnet.

  • last_name string erforderlich

    Nachname der Person, die die Tür öffnet.

  • full_name string optional

    Optional. Wenn das Feld fehlt, kombiniert der Performance Hub first_name und last_name.

  • check_in_id string optional

    Optionale Check-in-ID aus Ihrem System zur Zuordnung.

  • idempotency_key string optional

    Optionaler 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 string erforderlich

    Die vom Listen-Endpunkt zurückgegebene ID des Door/Gate Controller.

  • facility_id string 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 Informationen

    Einrichtungs-ID des Performance Hub. Erforderlich für Direct-Link-Integrationen.

  • linking_identifier string 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 Informationen

    Einrichtungskennung des Partners. Erforderlich für Linking-Identifier-Integrationen.

  • outcome string erforderlich

    denied oder attempted.

  • reason string optional

    Grundcode in Kleinbuchstaben im snake_case-Format, bis zu 64 Zeichen. Erforderlich, wenn outcome den Wert denied hat. Beispiel: membership_expired.

  • reason_display_text string optional

    Menschenlesbarer Grund, bis zu 256 Zeichen. Beispiel: Membership expired on 2026-04-01.

  • member_id string optional

    Mitglieds-ID des Partners. Lassen Sie sie weg, wenn die Zugangsdaten keinem Mitglied zugeordnet werden konnten, etwa bei einer unbekannten Karte.

  • user_email string optional

    E-Mail-Adresse der Person, die den Zutritt versucht hat.

  • timestamp string optional

    Zeitpunkt 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 string optional

    Schlü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 keinen reason, der Zeitstempel liegt außerhalb des zulässigen Bereichs oder facility_id / linking_identifier entspricht keiner verknüpften Einrichtung.
  • 403 - Der Schlüssel ist schreibgeschützt.
  • 403 integration_not_enabled - Ihre Integration ist für die Einrichtung nicht aktiviert. message nennt 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 string 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 Informationen

    Eindeutige Kennung der Einrichtung aus dem Performance Hub.

  • linking_identifier string 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 Informationen

    Eindeutiger Kennungswert, den der Partner für jeden Standort verwendet (z. B. „Branch ID“, „Location Code“, „Store Number“). Weitere Informationen

  • start_date string erforderlich

    Startdatum des Snapshot-Zeitraums im Format YYYY-MM-DD.

  • end_date string erforderlich

    Enddatum des Snapshot-Zeitraums im Format YYYY-MM-DD.

  • metrics object erforderlich

    Kennzahlenobjekt 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 array erforderlich

    Array der zu speichernden Berichts-Snapshot-Objekte. Maximal 25 Elemente pro Anfrage. Jedes Element muss entweder facility_id (erforderlich, wenn linking_identifier nicht verwendet wird) oder linking_identifier (erforderlich, wenn facility_id nicht 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, wenn access_time_windows vorhanden 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:

  • 429
  • 500
  • 502
  • 503
  • 504

Wiederholen Sie diese nicht ungeprüft:

  • 400
  • 401
  • 403
  • 404
  • 409
  • 422

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_id oder command_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_key für Entriegelungsanfragen an den Door/Gate Controller hinzugefügt.