Inleiding

Met de Performance Hub Partner API kunnen externe partnerplatforms naadloos integreren met de kernmodules van Performance Hub. De API ondersteunt computer vision, analyses, registratie van toegang door leden en inzichten in faciliteiten.

Indeling van verzoeken

De API accepteert JSON-gecodeerde request-bodies en retourneert JSON-gecodeerde responses.

Snelheidsbeperking

Voor eerlijk gebruik en een stabiel systeem beginnen Partner API-accounts met standaardlimieten:

  • 5 verzoeken per seconde per endpoint
  • Aanbevolen: maximaal 1000 items per batchverzoek voor optimale prestaties
  • Maximaal 10MB payloadgrootte

Snelheidslimieten zijn aanpasbaar en kunnen per geval worden geconfigureerd door je partneraccountmanager bij Performance Hub. Heeft je integratie een hogere doorvoer nodig voor een lancering, migraties, rapportage-backfills of faciliteiten met veel verkeer, geef dit dan aan tijdens de onboarding of vóór het geplande wijzigingsvenster.

Basis-URL

https://partner-api.performancehub.co/partner/v1/

Authenticatie

Voor toegang tot de Partner API is authenticatie met geheime API-sleutels vereist. Genereer en beheer je sleutels via de Partner Console.

API-sleutels zijn je inloggegevens voor toegang tot partnerresources. Elke sleutel heeft beperkte toegang tot specifieke organisatiegegevens en kan indien nodig direct worden gedeactiveerd.

Ga zorgvuldig om met je API-sleutels: ze geven volledige toegang tot je account! Stel deze sleutels nooit bloot in openbare repository's, client-side applicaties of op andere plaatsen waar ze kunnen worden misbruikt.

Authenticeer verzoeken met HTTP Basic Auth door je API-sleutel als gebruikersnaam mee te geven. Laat het wachtwoord leeg.

De API accepteert alleen beveiligde HTTPS-verbindingen. Gewone HTTP-verzoeken worden geweigerd, net als verzoeken zonder geldige authenticatiegegevens.

Voorbeeldverzoek

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.

Geheime sleutel verifiëren

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>" }

Checklist voor livegang

Gebruik deze checklist voordat je een partnerintegratie inschakelt voor faciliteiten in productie.

Configuratie van de Partner Console

  • Je partnerprofiel is volledig.
  • Je logo-URL, website, categorie en beschrijving kloppen.
  • Je koppelmethode voor gegevens is geconfigureerd: Direct Link of Linking Identifier.
  • De koppeling met faciliteiten is getest met minstens één echte faciliteit.
  • Het juiste sleuteltype wordt gebruikt:
    • Dryrun voor niet-destructieve schrijftests.
    • Read-only voor veilig gebruik van gegevens.
    • Live alleen wanneer je klaar bent om productiegegevens te beïnvloeden.

Authenticatie en sleutelbeheer

  • Geheime sleutels worden alleen aan de serverzijde opgeslagen.
  • Sleutels zijn niet opgenomen in client-side applicaties, mobiele apps, openbare repository's of supporttickets.
  • Rotatie en intrekking van sleutels zijn getest.
  • Je team weet welke sleutel in welke omgeving wordt gebruikt.

Gegevensvalidatie

  • Verplichte velden zijn aanwezig voor elk endpoint dat je aanroept.
  • Faciliteitidentificaties komen overeen met je geconfigureerde koppelmethode.
  • ID's uit je systeem zijn stabiel en veranderen niet tussen synchronisaties.
  • Grote imports worden opgesplitst in batches binnen de gedocumenteerde limieten.
  • Mislukte items in een batch kunnen worden herkend en opnieuw worden verzonden.

Endpoints testen

Test vóór de lancering elk endpoint waarvan je integratie afhankelijk is:

  • Organisaties en faciliteiten kunnen worden gelezen.
  • Leden kunnen worden opgeslagen en bijgewerkt.
  • Abonnementen, toegangszones en toegangsuren worden correct gesynchroniseerd.
  • Check-ins worden geaccepteerd en kunnen worden herleid naar je systeem.
  • Rapportmomentopnamen gebruiken de verwachte rapportageperiode en metrics.
  • Processen met de Door/Gate Controller zijn waar van toepassing op echte hardware getest.

Gereedheid voor Access Time Windows

Als de integratie Access Time Windows aanlevert:

  • Absolute en wekelijkse voorbeelden doorstaan de certificeringschecklist voor producenten.
  • Epochs zijn gehele getallen in Unix-seconden zonder aanhalingstekens; exacte grenzen van [from, to) zijn getest.
  • UTC-standaarden, de aangepaste IANA-tijdzones van de integratie en relevante overgangen naar en van zomertijd zijn gecontroleerd.
  • Eén duurzame, monotone revisiereeks per lid/bron coördineert incrementele updates, reconciliatie en nieuwe pogingen.
  • Beheerders begrijpen het gedrag bij weggelaten, volledig vervangende, idempotente, conflicterende, verouderde en expliciete []-waarden.
  • Elke scope_key, inclusief default, heeft een goedgekeurde toewijzing in Performance Hub; er is getest dat onbekende sleutels tot weigering leiden (fail-closed).
  • De verwachte verversingsfrequentie, de maximale leeftijd van brongegevens, het gedrag bij verouderde bronnen en de waarschuwingen van de integratie zijn geconfigureerd.
  • Er is aangetoond dat een mislukte upstream ophaalactie geen lege of gedeeltelijke momentopname verzendt.
  • Convergentie van de reeks in de testomgeving, annulering/intrekking en begin- en eindgrenzen bij de fysieke deur voldoen aan de afgesproken doelen.
  • Reguliere regels en permanente toegangsrechten zijn gecontroleerd als terugvalroutes, en vensters kunnen het uitschakelen van gebruikers, blockAllAccess, onderhoud of geofencing niet omzeilen.

Gereedheid voor toegangsbeheer

Voor integraties met toegangsbeheer:

  • Je systeem neemt de toegangsbeslissing voordat Performance Hub wordt aangeroepen.
  • De integratie verwerkt device_offline, maintenance_mode_active en unlock_confirmation_timeout.
  • Beheerders begrijpen dat een time-out betekent dat de ontgrendeling niet is bevestigd.
  • Je logboeken bewaren de geretourneerde event_id en command_id.
  • Je hebt een handmatige terugvalprocedure voor medewerkers van de faciliteit.

Foutafhandeling en nieuwe pogingen

  • Responses met 400, 401, 403, 404, 409 en 422 worden aan beheerders of supportteams gemeld in plaats van blindelings opnieuw geprobeerd.
  • Responses met 429, 500, 502, 503 en 504 gebruiken begrensde logica voor nieuwe pogingen met backoff.
  • Herhaalde fouten leiden tot een waarschuwing in je systeem.
  • De integratie laat mislukte records nooit stilletjes vallen.

Observeerbaarheid

  • Je logboeken bevatten het endpoint, de tijdstempel, de faciliteitidentificatie, het bronrecord-ID, de uitkomst van het verzoek en de response-body.
  • Je supportteam kan zoeken op lid-ID, faciliteit-ID, check-in-ID of ID van de ontgrendelgebeurtenis.
  • Je kunt mislukte synchronisaties opnieuw afspelen of reconciliëren.

Productielancering

  • Performance Hub heeft je productietoegang bevestigd.
  • Minstens één faciliteit in productie heeft je integratie ingeschakeld.
  • Je productiesleutel is actief.
  • Je operationele en technische contactpersonen zijn actueel.
  • Je ondersteuningsproces is voor klanten gedocumenteerd.

Nadat deze controles zijn afgerond, verschijnt je geconfigureerde integratie in de Performance Hub-partnerdirectory binnen het centrale Performance Hub-platform.

Best practices

Gebruik deze patronen om partnerintegraties voorspelbaar, controleerbaar en veilig te houden voor faciliteiten.

Faciliteiten consequent identificeren

Kies de koppelmethode die voor je partneraccount is geconfigureerd en gebruik die consequent:

  • Direct Link - gebruik het Performance Hub-facility_id dat door het facilities-endpoint wordt geretourneerd.
  • Linking Identifier - gebruik je eigen locatie-identificatie, zoals een vestigings-ID, locatiecode of winkelnummer.

Stuur niet beide identificaties in hetzelfde verzoek. Performance Hub verwerkt verzoeken met de koppelmethode die voor je partneraccount is geconfigureerd.

Zie Koppelmethoden voor partners voor hulp bij de configuratie.

Schrijf zorgvuldig in batches

De Partner API accepteert JSON-request-bodies en is, waar gedocumenteerd, ontworpen voor synchronisatieprocessen in batches. Houd batches begrensd en geschikt voor nieuwe pogingen.

Standaardrichtlijnen:

  • Gebruik maximaal 1000 items per batchverzoek voor optimale prestaties.
  • Houd payloads onder 10MB.
  • Blijf binnen 5 verzoeken per seconde per endpoint.

Snelheidslimieten zijn aanpasbaar en kunnen per geval worden geconfigureerd door je partneraccountmanager bij Performance Hub. Verwacht je imports met een groot volume, verkeer rond een lancering of rapportage-backfills, spreek dan vóór het wijzigingsvenster de benodigde doorvoer af.

Moet je een grote dataset synchroniseren, splits die dan op in deterministische delen en log aan jouw kant het ID van elk deel. Zo zijn mislukte nieuwe pogingen makkelijker te analyseren.

Probeer veilig opnieuw

Gebruik exponentiële backoff voor tijdelijke fouten zoals 429, 500, 502, 503 en 504.

Vermijd snelle lussen van nieuwe pogingen. Een goed uitgangspunt is:

  1. Probeer het na 1 seconde opnieuw.
  2. Probeer het na 2 seconden opnieuw.
  3. Probeer het na 4 seconden opnieuw.
  4. Stop en geef een waarschuwing als de bewerking nog steeds mislukt.

Corrigeer bij validatiefouten zoals 400 of 422 eerst het verzoek voordat je het opnieuw probeert.

Gebruik idempotentie waar dat wordt ondersteund

Het unlock-endpoint van de Door/Gate Controller ondersteunt een optionele idempotency_key. Als je dezelfde sleutel opnieuw gebruikt voor dezelfde partner, faciliteit en deur, wordt het bestaande resultaat geretourneerd wanneer dat beschikbaar is.

Gebruik een stabiele sleutel voor de uitgevoerde actie, bijvoorbeeld een check-in-ID of toegangsgebeurtenis-ID uit je systeem.

Ga er niet van uit dat elk schrijf-endpoint idempotentie ondersteunt, tenzij dat voor dat endpoint is gedocumenteerd.

Houd brongegevens schoon

Stuur waar mogelijk stabiele, genormaliseerde waarden:

  • Gebruik consistente ID's voor leden, abonnementen, faciliteiten en check-ins uit je bronsysteem.
  • Gebruik ISO 8601-tijdstempels voor datums en tijden.
  • Stuur telefoonnummers waar mogelijk in internationale notatie.
  • Stuur valuta via de velden die voor elk endpoint zijn gedocumenteerd.
  • Overlaad vrije-tekstvelden niet met gegevens die in gestructureerde velden thuishoren.

Ontwerp voor incrementele en volledige synchronisaties

De meeste partnerintegraties hebben beide nodig:

  • Incrementele synchronisaties voor dagelijkse wijzigingen.
  • Volledige reconciliatiesynchronisaties om gemiste gebeurtenissen, historische imports of afwijkende gegevens te corrigeren.

Je integratie moet de huidige status van een lid, abonnement of rapportmomentopname opnieuw kunnen verzenden zonder afhankelijk te zijn van het slagen van een eerder verzoek.

Publiceer Access Time Windows veilig

Behandel de waarde access_time_windows van elk lid als een volledige momentopname met een eigen revisie:

  • Coördineer één monotoon oplopende reeks access_time_windows_revision over de incrementele en reconciliatieworkers heen.
  • Herhaal een onzekere of tijdelijk mislukte levering met dezelfde revisie en genormaliseerde payload.
  • Laat access_time_windows weg wanneer je deze niet bijwerkt.
  • Stuur [] alleen nadat een geslaagde, gezaghebbende ophaalactie bij de bron heeft aangetoond dat er geen vensters meer zijn. Laat een upstream time-out, een gedeeltelijk resultaat of een parseerfout nooit leiden tot intrekking.
  • Houd external_id en scope_key stabiel en certificeer elke scopetoewijzing vóór productie.
  • Bewaak de leeftijd van de brongegevens aan de hand van het actualiteitsbeleid dat voor die integratie is afgesproken.

Zie de gezaghebbende handleiding voor producenten van Access Time Windows voor volledige momentopnamen, tijdzones, zomertijd, annulering en testvectoren.

Behandel toegangsbeheer als veiligheidskritiek

Voor ontgrendelingen van een Door/Gate Controller geldt:

  • Je systeem moet beslissen of iemand naar binnen mag voordat Performance Hub wordt aangeroepen.
  • Performance Hub retourneert pas 200 nadat de controller ter plaatse bevestigt dat het relais fysiek is ontgrendeld.
  • De meeste bevestigingen zijn binnen 3-5 seconden binnen.
  • Een time-out is een expliciet mislukte ontgrendeling, geen succes op de achtergrond.
  • Probeer het alleen opnieuw volgens je eigen toegangs- en veiligheidsregels.

Log altijd de event_id en command_id die het unlock-endpoint retourneert.

Bewaak je integratie

Gebruik de verzoeklogboeken in de Partner Console tijdens de ontwikkeling en lancering. Houd in productie ook je eigen logboeken bij met:

  • Tijdstempel van het verzoek.
  • Endpoint.
  • Bronrecord-ID.
  • Faciliteitidentificatie.
  • HTTP-statuscode.
  • Response-body of foutmelding van Performance Hub.

Met deze velden gaan ondersteuning en reconciliatie veel sneller wanneer een klant vraagt wat er is gebeurd.

Organisaties

Vertegenwoordigt de bedrijfsentiteit op het hoogste niveau die een of meer faciliteiten exploiteert die met het Performance Hub-platform zijn geïntegreerd.

Eindpunten

GET /partner/v1/organisations - List all organisations

Het organisatieobject

Attributen

  • org_id string verplicht

    Unieke identificatie van de organisatie.

  • name string verplicht

    Naam van de organisatie.

Het organisatieobject

{
  "org_id": "00000000-0000-0000-0000-000000000050",
  "name": "Harbourside Group"
}

Alle organisaties opvragen

Retourneert een lijst van organisaties die toegankelijk zijn voor je partneraccount.

Retourwaarde

Retourneert een JSON-object met een eigenschap data die een array van organisatieobjecten bevat.

Verzoek

curl https://partner-api.performancehub.co/partner/v1/organisations \
  -u sk_live_YOUR_PARTNER_SECRET_KEY:

Respon

{
  "data": [
    {
      "org_id": "00000000-0000-0000-0000-000000000050",
      "name": "Harbourside Group"
    },
    {
      "org_id": "6ba7b811-9dad-11d1-80b4-00c04fd430c8",
      "name": "Wellness Studios Network"
    }
  ]
}

Faciliteiten

Vertegenwoordigt een fysieke locatie, zoals een kantoor, winkel, evenementenlocatie, campus, kliniek of sportschool, waar leden gebruik kunnen maken van diensten.

Eindpunten

GET /partner/v1/facilities - List all facilities

Het faciliteitobject

Attributen

  • facility_id string verplicht

    Unieke identificatie van de faciliteit.

  • org_id string verplicht

    Unieke identificatie van de bovenliggende organisatie.

  • name string verplicht

    Naam van de faciliteit.

  • brand string optioneel

    Merknaam die de faciliteit gebruikt.

  • website_url string optioneel

    URL van de website van de faciliteit.

  • place_data object optioneel

    Locatiegegevens uit de Google Places API met land, opgemaakt adres, Google Place ID, provincie en plaats.

  • social_links object optioneel

    Links naar sociale media van de faciliteit.

  • timezone string optioneel

    IANA-tijdzone-identificatie (bijvoorbeeld "Australia/Sydney", "America/New_York").

Het faciliteitobject

{
  "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 faciliteiten opvragen

Retourneert een lijst van faciliteiten die toegankelijk zijn voor je partneraccount.

Retourwaarde

Retourneert een JSON-object met een eigenschap data die een array van faciliteitobjecten bevat.

Verzoek

curl https://partner-api.performancehub.co/partner/v1/facilities \
  -u sk_live_YOUR_PARTNER_SECRET_KEY:

Reactie

{
  "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"
    }
  ]
}

Abonnementen

Definieert een aanbod van een organisatie of faciliteit dat kan worden gekocht, inclusief diensten, rechten, planning en prijzen.

Eindpunten

POST /partner/v1/membership-plans - Save a membership plan

Het Membership Plan-object

Attributen

  • membership_plan_id string verplicht

    Unieke identificatie van het abonnement.

  • facility_id string een van beideGeef het type faciliteitidentificatie op dat voor je integratie is geconfigureerd: gebruik facility_id voor integraties met Direct Link of linking_identifier voor integraties met een Linking Identifier. Stuur ze niet allebei: de API gebruikt het identificatietype dat voor je partneraccount is geconfigureerd en negeert het andere. Meer informatie

    Unieke identificatie van de faciliteit uit Performance Hub.

  • linking_identifier string een van beideGeef het type faciliteitidentificatie op dat voor je integratie is geconfigureerd: gebruik facility_id voor integraties met Direct Link of linking_identifier voor integraties met een Linking Identifier. Stuur ze niet allebei: de API gebruikt het identificatietype dat voor je partneraccount is geconfigureerd en negeert het andere. Meer informatie

    Unieke identificatiewaarde die de partner voor elke locatie gebruikt (bijvoorbeeld "Branch ID", "Location Code", "Store Number"). Meer informatie

  • name string verplicht

    Leesbare naam van het abonnement (bijvoorbeeld "Office tenant – business hours", "Student – term access", "Hotel guest", "10 Class Pack").

  • billing_cycle string optioneel

    Factureringsfrequentie. Een van weekly, fortnightly, monthly, annually of one_time.

  • price integer optioneel

    Basisprijs in de kleinste munteenheid (centen voor USD/AUD).

  • currency string optioneel

    ISO 4217-valutacode (bijvoorbeeld "AUD", "USD").

  • description string optioneel

    Optionele marketing- of interne beschrijving.

  • active_members integer optioneel

    Aantal actieve leden met dit abonnement

  • is_recurring boolean optioneel

    Of het abonnement automatisch wordt verlengd.

  • is_trial boolean optioneel

    Of dit een proefaanbod is.

  • visible_to_public boolean optioneel

    Of het abonnement via selfservice kan worden gekocht.

  • duration_days integer optioneel

    Aantal dagen dat het abonnement geldig is.

  • access_zones array optioneel

    Array van toegangszones die in het abonnement zijn inbegrepen. Elke zone kan eigen toegangsuren definiëren. Zie Toegangszones voor meer informatie.

  • class_limit integer optioneel

    Maximaal toegestaan aantal lessen (null voor onbeperkt).

Het Membership Plan-object

Dit voorbeeld gebruikt facility_id. Stuur voor een integratie met een Linking Identifier in plaats daarvan "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
}

Toegangszones

Toegangszones definiëren specifieke delen van een faciliteit waartoe een abonnement toegang geeft. Elke zone kan eigen toegangsuren hebben, zodat er per deel verschillende tijdsbeperkingen kunnen gelden.

Structuur

Elke toegangszone bevat:

  • name string verplicht

    De naam van de zone (bijvoorbeeld "Level 3 Tenancy", "Library", "Guest Floors", "Main Gym Floor").

  • description string optioneel

    Beschrijving van wat er in die zone is inbegrepen.

  • access_hours object optioneel

    Toegangsuren die specifiek voor deze zone gelden. Zie Toegangsuren voor de notatie van tijdsbereiken.

Voorbeeld

Een kantoorgebouw met een sportschool voor de huurders: toegang tot de gehuurde ruimte tijdens kantooruren en tot de sportschool van de vroege ochtend tot de late avond.

{
  "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"]]
      }
    }
  ]
}

Toegangsuren

Toegangsuren geven aan wanneer leden op elke dag van de week toegang hebben tot een specifieke zone. Toegangsuren worden per toegangszone gedefinieerd, zodat er voor verschillende delen van een faciliteit verschillende tijdsbeperkingen kunnen gelden.

Structuur

{
  "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"]]
}

Elke dag is een array van tijdsbereiken in de notatie HH:MM (24-uursklok). Een lege array [] betekent geen toegang op die dag. Weggelaten dagen worden op dezelfde manier behandeld als een lege array.

Voorbeelden van toepassingen

Kantoorhuurder – kantooruren: toegang tijdens kantooruren, alleen op werkdagen.

{
  "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"]]
  }
}

Student – toegang tijdens het semester: een campusbibliotheek die op werkdagen open is, met een pauze midden op de dag, en op zaterdagochtend.

{
  "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"]]
  }
}

Sportschool – vroege vogel: alleen 's ochtends toegang op werkdagen.

{
  "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 – 24/7: altijd toegang, de meest voorkomende toepassing.

{
  "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"]]
  }
}

Voorbeeld per zone

Een abonnement voor hotelgasten met de klok rond toegang tot de gastenverdiepingen en kortere openingstijden voor het zwembad:

{
  "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"]]
      }
    }
  ]
}

Een abonnement opslaan

Maakt abonnementsrecords aan of werkt ze bij. De API bepaalt op basis van membership_plan_id of een record wordt aangemaakt of bijgewerkt.

Parameters

  • membership_plans array verplicht

    Array van Membership Plan-objecten om op te slaan. Aanbevolen maximum: 1000 items per verzoek voor optimale prestaties. De API verdeelt items automatisch in batches voor verwerking. Elk item moet facility_id (verplicht als je linking_identifier niet gebruikt) of linking_identifier (verplicht als je facility_id niet gebruikt) bevatten.

Retourwaarde

Retourneert een eenvoudig bericht dat de synchronisatie bevestigt.

Verzoek

Dit voorbeeld gebruikt facility_id. Stuur voor een integratie met een Linking Identifier in plaats daarvan "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
      }
    ]
  }'

Reactie

Retourneert een succesbericht met metadata over de synchronisatie.

{
  "message": "Membership plan sync successful.",
  "metadata": {
    "success": 98,
    "skipped": 2,
    "skipped_items": [
      {
        "membership_plan_id": "plan_456",
        "facility_id": null,
        "reason": "Missing facility_id"
      }
    ]
  }
}

Metadatavelden:

  • success - Aantal abonnementen dat met succes is verwerkt
  • skipped - Aantal overgeslagen abonnementen (indien van toepassing)
  • skipped_items - Array van overgeslagen abonnementen met de redenen (indien van toepassing)
  • dry-run - Booleaanse vlag bij gebruik van een sleutel van het type dryrun (indien van toepassing)

Leden

Vertegenwoordigt een individuele klant van een faciliteit. Dit kan een lead, prospect, terugkerende klant, verlopen lid of geblokkeerde gebruiker zijn.

Upserts van leden kunnen ook een volledige access_time_windows-momentopname met revisie bevatten, met absolute en wekelijks terugkerende toegang. Lees Access Time Windows voordat je deze velden aanlevert. Het zijn aanvullende rechten die de reguliere regels of permanente toegangsrechten van de faciliteit niet vervangen.

Eindpunten

POST /partner/v1/members - Save a member

Het Member-object

Attributen

  • member_id string verplicht

    Unieke identificatie van het lid.

  • facility_id string een van beideGeef het type faciliteitidentificatie op dat voor je integratie is geconfigureerd: gebruik facility_id voor integraties met Direct Link of linking_identifier voor integraties met een Linking Identifier. Stuur ze niet allebei: de API gebruikt het identificatietype dat voor je partneraccount is geconfigureerd en negeert het andere. Meer informatie

    Unieke identificatie van de faciliteit uit Performance Hub.

  • linking_identifier string een van beideGeef het type faciliteitidentificatie op dat voor je integratie is geconfigureerd: gebruik facility_id voor integraties met Direct Link of linking_identifier voor integraties met een Linking Identifier. Stuur ze niet allebei: de API gebruikt het identificatietype dat voor je partneraccount is geconfigureerd en negeert het andere. Meer informatie

    Unieke identificatiewaarde die de partner voor elke locatie gebruikt (bijvoorbeeld "Branch ID", "Location Code", "Store Number"). Meer informatie

  • first_name string verplicht

    Voornaam van het lid.

  • last_name string verplicht

    Achternaam van het lid.

  • email string optioneel

    E-mailadres.

  • mobile_phone string optioneel

    Mobiel telefoonnummer in E.123-notatie (bijvoorbeeld "+1 415 555 2671").

  • address object optioneel

    Object met het fysieke adres en de volgende eigenschappen:

    • address_line_1 (string) - Primair straatadres
    • address_line_2 (string, optioneel) - Tweede adresregel
    • city (string) - Plaatsnaam
    • state (string) - Code van staat/provincie
    • postal_code (string) - Postcode
    • country (string) - ISO 3166-1 alpha-2-landcode (bijvoorbeeld "AU", "US")
    • country_name (string, optioneel) - Volledige landnaam
  • date_of_birth string optioneel

    Geboortedatum in de notatie YYYY-MM-DD.

  • gender string optioneel

    Een van male, female, non_binary, prefer_not_to_say of unknown.

  • type string optioneel

    Type lid (bijvoorbeeld staff, member, prospect).

  • tags array optioneel

    Korte hulptekenreeksen of teksten om specifieke leden in te delen en te herkennen (bijvoorbeeld ["vip", "personal-training", "student"]).

  • membership_status string optioneel

    Huidige lidmaatschapsstatus (bijvoorbeeld active, expired, on_hold).

  • membership_plans array optioneel

    Array van abonnementen die aan het lid zijn gekoppeld.

  • profile_picture string optioneel

    Base64-gecodeerde profielfoto (optioneel).

  • created string optioneel

    ISO 8601-tijdstempel van het moment waarop het lid is aangemaakt.

  • updated string optioneel

    ISO 8601-tijdstempel van het moment waarop het lid voor het laatst is bijgewerkt.

  • access_time_windows array optioneel

    Volledige momentopname van de bron met absolute en/of wekelijks terugkerende Access Time Windows. Laat het veld weg om de momentopname ongewijzigd te laten; stuur een lege array met een nieuwere revisie om deze in te trekken. Zie Access Time Windows voor de vormen, validatie, scopetoewijzing en vervangingssemantiek.

  • access_time_windows_revision integer verplicht met access_time_windows

    Monotoon oplopend, niet-negatief JSON-veilig geheel getal voor de reeks van dit lid/deze bron. Verplicht wanneer access_time_windows aanwezig is.

Het Member-object

{
  "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
    }
  ]
}

Toegangstijdvensters

Met Access Time Windows kan een Partner Member tijdelijke of terugkerende toegang meekrijgen die door een extern systeem wordt aangeleverd. Deze pagina is de gezaghebbende handleiding voor producenten van access_time_windows en access_time_windows_revision.

Access Time Windows zijn aanvullende rechten die alleen toegang kunnen toestaan. Een actief venster kan toegang toestaan, maar een inactief, verlopen, verouderd of niet-toegewezen venster weigert geen toegang die een reguliere regel of een permanent toegangsrecht al toestaat. Het uitschakelen van gebruikers, expliciete deurblokkering, de onderhoudsmodus, geofencing, snelheidslimieten en de beschikbaarheid van controllers blijven van toepassing.

Implementaties voor specifieke upstream systemen zijn afzonderlijke adapters. Ze moeten hun brongegevens vertalen naar dit leverancierneutrale contract zonder de betekenis van de velden te veranderen.

Velden van de momentopname van een lid

  • access_time_windows array optioneel

    De volledige momentopname van Access Time Windows voor dit lid en deze partnerbron. Een momentopname kan absolute- en weekly-vensters combineren. Laat het veld weg om de opgeslagen momentopname ongewijzigd te laten; stuur [] om elk venster van deze bron in te trekken.

  • access_time_windows_revision integer verplicht met access_time_windows

    Een monotoon oplopend, niet-negatief JSON-veilig geheel getal voor de revisiereeks van dit lid/deze bron. Het is verplicht wanneer access_time_windows aanwezig is en mag niet groter zijn dan 9007199254740991.

Elke momentopname accepteert maximaal 50 vensters. external_id, scope_key en label accepteren maximaal 120 tekens. Absolute vensters kunnen maximaal 90 dagen beslaan. Een weekdag accepteert maximaal acht niet-overlappende blokken. Ongeldige gegevens worden geweigerd in plaats van ingekort of geraden.

Vormen van vensters

Een absoluut venster geeft één exact interval aan:

Volledig gecombineerd verzoek

Dit verzoek vervangt de vorige momentopname van de bron voor het lid door één absoluut en één wekelijks venster:

Regels voor tijden en grenzen

from, to, active_from en active_until zijn JSON-gehele getallen in Unix-seconden die UTC-tijdstippen aangeven:

  • Stuur een JSON-geheel getal zonder aanhalingstekens. Numerieke tekenreeksen, drijvendekommagetallen, RFC 3339-tekenreeksen en Unix-milliseconden worden geweigerd.
  • Elk interval is halfopen: [from, to). Toegang kan precies op from beginnen; precies op to is die niet meer actief.
  • from moet kleiner zijn dan to. Als beide wekelijkse grenzen aanwezig zijn, moet active_from kleiner zijn dan active_until.
  • Leid epochs niet af van een lokale datum/tijd zonder tijdzone. Zet de brontijd eerst om naar een UTC-tijdstip, deel daarna de Unix-milliseconden door 1000 en controleer of het resultaat een geheel getal is.

Tijdzones en zomertijd

timezone moet een geldige IANA-tijdzone zijn, zoals UTC, Australia/Perth of America/New_York. Als dit veld wordt weggelaten, is de standaardwaarde UTC.

  • Absolute vensters: from en to geven al exacte UTC-tijdstippen aan. timezone is alleen metadata voor weergave en audit; een wijziging ervan verschuift geen van beide tijdstippen.
  • Wekelijkse vensters: timezone bepaalt de lokale kloktijd en de zomertijdregels waarmee access_hours wordt geëvalueerd. Zet wekelijkse blokken niet vooraf om naar UTC.
  • Bij de overgang naar zomertijd komt een lokale tijd die de tijdzone overslaat nooit voor.
  • Bij de overgang naar wintertijd vallen beide echte tijdstippen met de herhaalde lokale tijd binnen het wekelijkse blok.
  • active_from en active_until blijven UTC-tijdstippen, ook wanneer een wekelijks venster een andere tijdzone dan UTC gebruikt.

access_hours gebruikt sun tot en met sat in kleine letters. Elke waarde is een array van [start, end]-paren in 24-uursnotatie HH:mm met voorloopnullen. Blokken mogen niet leeg zijn, moeten op volgorde staan en mogen niet overlappen. end is exclusief. Een blok kan niet over middernacht heen lopen; splits een nachtelijk broninterval in een laat blok op de eerste dag en een vroeg blok op de volgende dag.

Stabiele ID's en scopetoewijzing

external_id moet stabiel zijn gedurende de levensduur van een logisch venster en uniek binnen de momentopname van het lid. Houd het stabiel wanneer tijden of labels veranderen, zodat beheerders en auditrecords revisies aan elkaar kunnen koppelen. Gebruik het niet opnieuw voor een venster dat er niets mee te maken heeft.

scope_key is je stabiele logische toegangsdoel. De standaardwaarde is default. Een beheerder van de faciliteit wijst elke toegestane sleutel toe aan doelen in Performance Hub: de hele faciliteit, een deur of een Toegangsbereik:

Volledige momentopnamen en revisies

Behandel de twee velden als een afzonderlijk geversioneerde partitie binnen de upsert van een lid:

Invoer Resultaat
access_time_windows weggelaten Bestaande momentopname blijft ongewijzigd; er is geen revisie nodig
Aanwezig met een nieuwere revisie De volledige opgeslagen momentopname voor dit lid/deze bron wordt vervangen
Dezelfde revisie en dezelfde genormaliseerde payload Idempotente herhaling; de momentopname verandert niet
Dezelfde revisie en een andere genormaliseerde payload Conflict; ken na reconciliatie een nieuwe revisie toe
Oudere revisie Verouderde momentopname wordt overgeslagen; deze kan een nieuwere status niet overschrijven
access_time_windows: [] met een nieuwere revisie Trekt expliciet alle vensters van de bron in

Een momentopname is volledig, geen patch. Als revisie 1842 de vensters A en B bevat, verwijdert revisie 1843 met alleen B het venster A.

Houd per partner/lid één gecoördineerde revisiereeks bij over webhookworkers, polling, herhaling en volledige reconciliatie heen. Een duurzame databasesequentie heeft de voorkeur. Een waarde in Unix-milliseconden kan alleen als revisie worden gebruikt wanneer alle schrijvers zich coördineren en een strikte volgorde en uniciteit garanderen; het is een revisiewaarde, geen epochveld.

Bewaar het exacte verzoek en de revisie totdat de API-response bekend is. Probeer na een time-out of tijdelijke fout dezelfde genormaliseerde momentopname opnieuw met dezelfde revisie. Ken geen nieuwe revisie toe alleen omdat de aflevering onzeker is.

Annulering, verloop en upstream fouten

  • Eén venster annuleren: haal met succes de gezaghebbende status bij de bron op, verwijder dat venster en stuur de resterende volledige momentopname met een nieuwere revisie.
  • Alle vensters annuleren: stuur access_time_windows: [] met een nieuwere revisie.
  • Een absoluut venster laten verlopen: het staat vanaf to geen toegang meer toe; stuur later een reconciliatie zonder het verlopen item om momentopnamen schoon te houden.
  • Een wekelijks venster beëindigen: verwijder het in een nieuwere momentopname, of gebruik active_until wanneer de bron een bekend eindtijdstip heeft.
  • Ophalen bij de bron mislukt of is onvolledig: stuur geen [] en publiceer geen gedeeltelijke momentopname. Geef een waarschuwing en probeer het ophalen opnieuw. Een upstream fout omzetten in een lege momentopname betekent een onbedoelde intrekking van toegang.
  • Verzoek aan de Partner API mislukt bij validatie: corrigeer de gegevens en stuur alleen een nieuwere revisie als de genormaliseerde momentopname verandert. Probeer tijdelijke fouten opnieuw met de oorspronkelijke revisie.

De actualiteit van de bron wordt per integratie geconfigureerd op basis van de toegezegde frequentie van aflevering en reconciliatie. Spreek vóór activering af wat de maximale leeftijd van de brongegevens is, wat er gebeurt als die wordt overschreden, wat de drempels voor waarschuwingen zijn en of beheerders mogen bevestigen dat alleen op de eigen grenzen van elk venster wordt vertrouwd. Een verouderd bronvenster wordt nooit een weigeringsregel; reguliere regels en permanente toegangsrechten blijven terugvalroutes.

Algoritme voor producenten

Gebruik dit taalonafhankelijke proces voor elke update van een lid:

Certificeringschecklist

Voer deze controles uit in een testfaciliteit met de definitieve scope_key-toewijzing:

  • Een absoluut venster zonder tijdzone wordt geaccepteerd en als UTC geëvalueerd.
  • Een absoluut venster met een aangepaste IANA-tijdzone behoudt dezelfde from/to-tijdstippen.
  • Een wekelijks venster met een aangepaste IANA-tijdzone volgt de lokale kloktijd bij de overgangen naar zomer- en wintertijd.
  • Een gecombineerde absolute/wekelijkse momentopname vervangt de vorige momentopname volledig.
  • Toegang begint precies op from en stopt precies op to; de einden van wekelijkse blokken zijn ook exclusief.
  • Het bijwerken van tijden onder dezelfde external_id met een nieuwere revisie wordt van kracht.
  • Het weglaten van access_time_windows wijzigt andere velden van het lid zonder de vensters te wijzigen.
  • Het herhalen van dezelfde revisie/payload is idempotent.
  • Dezelfde revisie met een andere payload geeft een conflict en wijzigt de momentopname niet.
  • Een oudere revisie die in de verkeerde volgorde binnenkomt, wordt als verouderd gemeld en kan de status niet terugdraaien.
  • Een nieuwere [] trekt de vensters van de bron in; bij een mislukte upstream ophaalactie wordt niets verzonden.
  • Een onbekende of niet-toegewezen scope_key leidt tot weigering (fail-closed) en geeft een waarschuwing die beheerders kunnen zien.
  • Waarschuwingen over de leeftijd van brongegevens en het geconfigureerde beleid voor verouderde bronnen werken bij de afgesproken drempel.
  • De webhookroute en de route voor volledige reconciliatie komen uit op dezelfde momentopname en revisievolgorde.
  • Aflevering van de reeks bereikt Door & Gate Access binnen het afgesproken doel.
  • Een actief venster kan toegang geven tot de toegewezen fysieke deur, maar kan het uitschakelen van gebruikers, blockAllAccess, onderhoud of geofencing niet omzeilen.
  • Vóór, buiten en na een venster geven reguliere regels en permanente toegangsrechten nog steeds toegang aan gebruikers die daar anders recht op hebben.

Gerelateerde richtlijnen

{
  "external_id": "access-4b1782",
  "kind": "absolute",
  "from": 1792053000,
  "to": 1792058400,
  "timezone": "Australia/Perth",
  "scope_key": "after_hours_entry",
  "label": "Temporary site access"
}

Verplichte velden zijn external_id, kind, from en to. timezone, scope_key en label zijn optioneel.

Een wekelijks venster geeft terugkerende intervallen in lokale kloktijd aan, eventueel begrensd door UTC-tijdstippen:

{
  "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"
}

Verplichte velden zijn external_id, kind en access_hours. timezone, active_from, active_until, scope_key en label zijn optioneel.

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"
          }
        ]
      }
    ]
  }'

Gebruik facility_id of linking_identifier, afhankelijk van je geconfigureerde koppelmethode. Stuur niet beide.

Epochconversie

2026-10-15T08:30:00Z wordt omgezet naar 1792053000:

UTC instant                 Unix milliseconds   Unix seconds sent
2026-10-15T08:30:00Z        1792053000000        1792053000

Taalonafhankelijke conversie:

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

Als de bron een precisie onder de seconde heeft, leg dan vóór het testen van de integratie bewust een afrondingsbeleid voor begin en einde vast. Geef nooit milliseconden door in de verwachting dat de API de eenheid zelf afleidt.

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

Partners sturen binnen een venster geen ID's van faciliteiten, deuren of Toegangsbereiken in Performance Hub mee. Een onbekende, uitgeschakelde of niet-toegewezen scope_key leidt voor dat venster tot weigering (fail-closed); de toegang wordt er niet ruimer door. Spreek toewijzingen af en test ze vóór de lancering.

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)

Minimale testvectoren

[
  {
    "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."
  }
]

Lever ook negatieve vectoren aan voor Unix-milliseconden, numerieke tekenreeksen, drijvendekommagetallen, ongeldige IANA-zones, from >= to, dubbele external_id, overlappende blokken, nachtelijke blokken, meer dan acht blokken op een dag, meer dan 50 vensters en niet-toegewezen scopesleutels.

Een lid opslaan

Maakt ledenrecords aan of werkt ze bij. De API bepaalt op basis van member_id of een record wordt aangemaakt of bijgewerkt.

Parameters

  • members array verplicht

    Array van Member-objecten om op te slaan. Aanbevolen maximum: 1000 items per verzoek voor optimale prestaties. De API verdeelt items automatisch in batches voor verwerking. Elk item moet facility_id (verplicht als je linking_identifier niet gebruikt) of linking_identifier (verplicht als je facility_id niet gebruikt) bevatten.

    Wanneer een lid access_time_windows bevat, moet het ook access_time_windows_revision bevatten. De array is een volledige momentopname van de bron, geen patch. Laat de array weg om de bestaande momentopname te behouden, of stuur [] met een nieuwere revisie om alle vensters van de bron in te trekken. Lees de handleiding voor Access Time Windows voordat je dit veld inschakelt.

Retourwaarde

Retourneert een eenvoudig bericht dat de synchronisatie bevestigt.

Profielvelden van leden blijven gewone upserts, ook wanneer een momentopname van vensters wordt gemeld als idempotente herhaling of als verouderd en overgeslagen. Een conflicterende momentopname met dezelfde revisie en een andere payload kan niet ongewijzigd opnieuw worden geprobeerd; reconcilieer de status bij de bron en stuur een nieuwere revisie.

Verzoek

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
          }
        ]
      }
    ]
  }'

Reactie

Retourneert een succesbericht met metadata over de synchronisatie.

{
  "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"
      }
    ]
  }
}

Metadatavelden:

  • success - Aantal leden dat met succes is verwerkt
  • skipped - Aantal overgeslagen leden (indien van toepassing)
  • skipped_items - Array van overgeslagen leden met de redenen (indien van toepassing)
  • dry-run - Booleaanse vlag bij gebruik van een sleutel van het type dryrun (indien van toepassing)

Check-ins

Vertegenwoordigt een registratie van de aanwezigheid van een persoon in een faciliteit, les of activiteit. Wordt gebruikt om aanwezigheid bij te houden, gebruiksanalyses te maken en de nauwkeurigheid van visuele detectie te verbeteren.

Eindpunten

POST /partner/v1/check-ins - Save check-ins

Het Check-In-object

Attributen

  • check_in_id string optioneel

    Unieke identificatie van de check-in. Optioneel: wordt automatisch gegenereerd uit het paar member_id en timestamp als dit niet wordt opgegeven.

  • member_id string verplicht

    Unieke identificatie van het lid.

  • facility_id string een van beideGeef het type faciliteitidentificatie op dat voor je integratie is geconfigureerd: gebruik facility_id voor integraties met Direct Link of linking_identifier voor integraties met een Linking Identifier. Stuur ze niet allebei: de API gebruikt het identificatietype dat voor je partneraccount is geconfigureerd en negeert het andere. Meer informatie

    Unieke identificatie van de faciliteit uit Performance Hub.

  • linking_identifier string een van beideGeef het type faciliteitidentificatie op dat voor je integratie is geconfigureerd: gebruik facility_id voor integraties met Direct Link of linking_identifier voor integraties met een Linking Identifier. Stuur ze niet allebei: de API gebruikt het identificatietype dat voor je partneraccount is geconfigureerd en negeert het andere. Meer informatie

    Unieke identificatiewaarde die de partner voor elke locatie gebruikt (bijvoorbeeld "Branch ID", "Location Code", "Store Number"). Meer informatie

  • check_in_type string optioneel

    Type bezoek. Een van member, class, staff, guest of trial.

  • source string optioneel

    Hoe de check-in is vastgelegd. Veelvoorkomende waarden zijn manual, tag, rfid, kiosk en app. Aanvullende waarden zoals door_reader of booking kunnen ook worden gebruikt.

  • class_id string optioneel

    Optioneel. Als de check-in aan een lesboeking of lesaanwezigheid is gekoppeld.

  • timestamp string verplicht

    Tijdstempel in ISO 8601-notatie van het moment waarop de check-in plaatsvond.

Het Check-In-object

{
  // "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 opslaan

Maakt check-inrecords aan. De API ontdubbelt automatisch op basis van lid, faciliteit en tijdstempel.

Parameters

  • check_ins array verplicht

    Array van Check-In-objecten om op te slaan. Aanbevolen maximum: 1000 items per verzoek voor optimale prestaties. De API verdeelt items automatisch in batches voor verwerking. Elk item moet facility_id (verplicht als je linking_identifier niet gebruikt) of linking_identifier (verplicht als je facility_id niet gebruikt) bevatten.

Retourwaarde

Retourneert een eenvoudig bericht dat de synchronisatie bevestigt.

Verzoek

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"
      }
    ]
  }'

Antwoord

Retourneert een succesbericht met metadata over de synchronisatie.

{
  "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"
      }
    ]
  }
}

Metadatavelden:

  • success - Aantal check-ins dat met succes is verwerkt
  • skipped - Aantal overgeslagen check-ins (indien van toepassing)
  • skipped_items - Array van overgeslagen check-ins met de redenen (indien van toepassing)
  • dry-run - Booleaanse vlag bij gebruik van een sleutel van het type dryrun (indien van toepassing)

Toegangsbeheer

De Partner API kan de hardware van de Performance Hub Door/Gate Controller aansturen voor faciliteiten waar je integratie is ingeschakeld.

Gebruik deze API wanneer je ledenbeheersysteem al heeft bepaald dat iemand naar binnen mag. Performance Hub beoordeelt geen lidmaatschapsstatus, toegangsuren, regels voor deurzones, fraudecontroles of opschortingslogica. Jouw systeem blijft verantwoordelijk voor die beslissingen.

Het ontgrendelverzoek is synchroon. Performance Hub stuurt de opdracht in realtime naar de controller ter plaatse en retourneert pas 200 nadat het apparaat heeft bevestigd dat het relais fysiek is ontgrendeld. De meeste bevestigingen zijn binnen 3-5 seconden binnen. Als er binnen de time-outperiode geen bevestiging wordt ontvangen, retourneert de API een expliciete fout.

Je kunt ook een toegangspoging of weigering vastleggen die de controller nooit heeft bereikt. Die aanroep ontgrendelt de deur niet. Er wordt een gebeurtenis geschreven naar de Toegangslogboeken van Door & Gate Access.

Endpoints

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

Het Door/Gate Controller-object

Attributen

  • door_id string verplicht

    Unieke identificatie van de Door/Gate Controller. Sla deze na het opvragen op in je systeem en gebruik deze bij het aanroepen van het unlock-endpoint.

  • facility_id string verplicht

    Faciliteit-ID in Performance Hub.

  • linking_identifier string optioneel

    Faciliteitidentificatie van de partner wanneer je integratie Linking Identifiers gebruikt. Meer informatie

  • name string verplicht

    Leesbare apparaatnaam die in Performance Hub is geconfigureerd.

  • zone string optioneel

    Deurzone of locatie, zoals Entrance.

  • status string verplicht

    online of offline.

  • relay_state string optioneel

    Laatst bekende status van het relais, zoals locked of unlocked.

  • maintenance_mode string verplicht

    Huidige onderhoudsmodus. Een van off, force-open of force-closed.

  • hold_time_seconds integer verplicht

    Standaard openhoudtijd na ontgrendeling die voor de deur is geconfigureerd.

  • last_seen string optioneel

    ISO-tijdstempel van de meest recente update van de apparaatmetadata.

Het Door/Gate Controller-object

{
  "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 Controllers opvragen

Retourneert de Door/Gate Controllers die voor je integratie beschikbaar zijn.

Als je facility_id noch linking_identifier opgeeft, retourneert de API de Door/Gate Controllers van alle faciliteiten die aan je partneraccount zijn gekoppeld.

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.

Parameters

  • facility_id string optioneel een van beideGeef het type faciliteitidentificatie op dat voor je integratie is geconfigureerd: gebruik facility_id voor integraties met Direct Link of linking_identifier voor integraties met een Linking Identifier. Stuur ze niet allebei: de API gebruikt het identificatietype dat voor je partneraccount is geconfigureerd en negeert het andere. Meer informatie

    Faciliteit-ID in Performance Hub. Gebruik dit voor integraties met Direct Link.

  • linking_identifier string optioneel een van beideGeef het type faciliteitidentificatie op dat voor je integratie is geconfigureerd: gebruik facility_id voor integraties met Direct Link of linking_identifier voor integraties met een Linking Identifier. Stuur ze niet allebei: de API gebruikt het identificatietype dat voor je partneraccount is geconfigureerd en negeert het andere. Meer informatie

    Je eigen identificatie van de faciliteit/locatie. Gebruik dit wanneer je integratie is geconfigureerd voor Linking Identifiers.

Retourwaarde

Retourneert een array van Door/Gate Controller-objecten.

Verzoek

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:

Reactie

{
  "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 van een Door/Gate Controller opvragen

Haalt de laatst bekende status en de basisconfiguratie van één Door/Gate Controller op.

Geef een faciliteitidentificatie op, zodat Performance Hub kan controleren of de deur hoort bij een faciliteit waartoe je integratie toegang heeft.

Parameters

  • door_id string verplicht

    ID van de Door/Gate Controller dat door het list-endpoint wordt geretourneerd.

  • facility_id string een van beideGeef het type faciliteitidentificatie op dat voor je integratie is geconfigureerd: gebruik facility_id voor integraties met Direct Link of linking_identifier voor integraties met een Linking Identifier. Stuur ze niet allebei: de API gebruikt het identificatietype dat voor je partneraccount is geconfigureerd en negeert het andere. Meer informatie

    Faciliteit-ID in Performance Hub. Verplicht voor integraties met Direct Link.

  • linking_identifier string een van beideGeef het type faciliteitidentificatie op dat voor je integratie is geconfigureerd: gebruik facility_id voor integraties met Direct Link of linking_identifier voor integraties met een Linking Identifier. Stuur ze niet allebei: de API gebruikt het identificatietype dat voor je partneraccount is geconfigureerd en negeert het andere. Meer informatie

    Faciliteitidentificatie van de partner. Verplicht voor integraties met een Linking Identifier.

Retourwaarde

Retourneert een Door/Gate Controller-object.

Verzoek

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:

Reactie

{
  "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"
  }
}

Een Door/Gate Controller ontgrendelen

Stuurt een ontgrendelopdracht naar de Door/Gate Controller en wacht tot het fysieke relais bevestigt dat het is ontgrendeld.

Je systeem moet beslissen of de persoon toegang heeft voordat dit endpoint wordt aangeroepen. Performance Hub controleert alleen de partnersleutel, de toegang tot de faciliteit, het eigendom van de deur en de status van het apparaat.

Parameters

  • door_id string verplicht

    ID van de Door/Gate Controller dat door het list-endpoint wordt geretourneerd.

  • facility_id string een van beideGeef het type faciliteitidentificatie op dat voor je integratie is geconfigureerd: gebruik facility_id voor integraties met Direct Link of linking_identifier voor integraties met een Linking Identifier. Stuur ze niet allebei: de API gebruikt het identificatietype dat voor je partneraccount is geconfigureerd en negeert het andere. Meer informatie

    Faciliteit-ID in Performance Hub. Verplicht voor integraties met Direct Link.

  • linking_identifier string een van beideGeef het type faciliteitidentificatie op dat voor je integratie is geconfigureerd: gebruik facility_id voor integraties met Direct Link of linking_identifier voor integraties met een Linking Identifier. Stuur ze niet allebei: de API gebruikt het identificatietype dat voor je partneraccount is geconfigureerd en negeert het andere. Meer informatie

    Faciliteitidentificatie van de partner. Verplicht voor integraties met een Linking Identifier.

  • member_id string verplicht

    Lid-ID van de partner. Wordt gebruikt voor auditlogboeken en latere koppeling van gegevens.

  • first_name string verplicht

    Voornaam van de persoon die de deur opent.

  • last_name string verplicht

    Achternaam van de persoon die de deur opent.

  • full_name string optioneel

    Optioneel. Als dit wordt weggelaten, combineert Performance Hub first_name en last_name.

  • check_in_id string optioneel

    Optioneel check-in-ID uit je systeem om gegevens aan elkaar te koppelen.

  • idempotency_key string optioneel

    Optionele sleutel ter bescherming tegen herhaling. Als je dezelfde sleutel opnieuw gebruikt voor dezelfde partner, faciliteit en deur, wordt het bestaande resultaat geretourneerd wanneer dat beschikbaar is.

Retourwaarde

Retourneert alleen 200 wanneer het apparaat bevestigt dat het relais fysiek is ontgrendeld. De deur gebruikt de openhoudtijd die in Apparaatbeheer van Performance Hub is geconfigureerd; partners kunnen de relaistiming niet per verzoek overschrijven. De meeste bevestigingen zijn binnen 3-5 seconden binnen. Behandel de gedocumenteerde time-out als een expliciet mislukte ontgrendeling en probeer het alleen opnieuw volgens je eigen veiligheidsregels.

Veelvoorkomende fouten:

  • 403 integration_not_enabled - je integratie is niet ingeschakeld voor de faciliteit.
  • 409 maintenance_mode_active - medewerkers van de faciliteit hebben de onderhoudsmodus voor de deur ingeschakeld.
  • 503 device_offline - de Door/Gate Controller is offline of niet actueel.
  • 504 unlock_confirmation_timeout - de opdracht is verzonden, maar er is vóór de time-out geen bijbehorende bevestiging ontvangen.

Verzoek

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"
  }'

Respons

{
  "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"
}

Response bij een fout

{
  "status": "failed",
  "reason": "device_offline",
  "door_id": "00000000000000000000000000000007",
  "facility_id": "550e8400-e29b-41d4-a716-446655440000",
  "event_id": "00000000-0000-0000-0000-000000000045"
}

Een toegangspoging of weigering vastleggen

Legt een toegangspoging of weigering vast waarover je systeem al heeft beslist. Er wordt geen contact gemaakt met de Door/Gate Controller en de deur wordt niet ontgrendeld.

Gebruik dit wanneer je systeem de toegang weigert, of wanneer een poging zonder ontgrendeling in de Toegangslogboeken van Door & Gate Access moet verschijnen. Performance Hub beoordeelt geen lidmaatschapsstatus, toegangsuren of andere toegangsregels.

Een geweigerde gebeurtenis verschijnt in de Toegangslogboeken van Door & Gate Access met de uitkomst Denied, je partnernaam, de deur, de identificatie van het lid als je die meestuurt en de redencode in leesbare vorm. membership_expired wordt bijvoorbeeld weergegeven als "Membership Expired". reason_display_text en user_email worden bij de gebeurtenis opgeslagen.

Parameters

  • door_id string verplicht

    ID van de Door/Gate Controller dat door het list-endpoint wordt geretourneerd.

  • facility_id string een van beideGeef het type faciliteitidentificatie op dat voor je integratie is geconfigureerd: gebruik facility_id voor integraties met Direct Link of linking_identifier voor integraties met een Linking Identifier. Stuur ze niet allebei: de API gebruikt het identificatietype dat voor je partneraccount is geconfigureerd en negeert het andere. Meer informatie

    Faciliteit-ID in Performance Hub. Verplicht voor integraties met Direct Link.

  • linking_identifier string een van beideGeef het type faciliteitidentificatie op dat voor je integratie is geconfigureerd: gebruik facility_id voor integraties met Direct Link of linking_identifier voor integraties met een Linking Identifier. Stuur ze niet allebei: de API gebruikt het identificatietype dat voor je partneraccount is geconfigureerd en negeert het andere. Meer informatie

    Faciliteitidentificatie van de partner. Verplicht voor integraties met een Linking Identifier.

  • outcome string verplicht

    denied of attempted.

  • reason string optioneel

    Redencode in snake_case met kleine letters, maximaal 64 tekens. Verplicht wanneer outcome denied is. Voorbeeld: membership_expired.

  • reason_display_text string optioneel

    Leesbare reden, maximaal 256 tekens. Voorbeeld: Membership expired on 2026-04-01.

  • member_id string optioneel

    Lid-ID van de partner. Laat dit weg wanneer de inloggegevens niet bij een lid hoorden, zoals bij een onbekende kaart.

  • user_email string optioneel

    E-mailadres van de persoon die toegang probeerde te krijgen.

  • timestamp string optioneel

    Wanneer de poging plaatsvond, als ISO 8601 met een tijdzone. Voorbeeld: 2026-05-18T10:15:30Z. Standaard het tijdstip waarop het verzoek wordt ontvangen. Mag niet meer dan 5 minuten in de toekomst liggen of ouder zijn dan 30 dagen.

  • idempotency_key string optioneel

    Sleutel ter bescherming tegen herhaling, maximaal 128 tekens. Als je dezelfde sleutel opnieuw gebruikt voor dezelfde partner, faciliteit en deur, wordt het oorspronkelijke resultaat geretourneerd.

Retourwaarde

Retourneert 201 wanneer de gebeurtenis is vastgelegd. Een herhaling met dezelfde idempotency_key retourneert 200 met idempotent ingesteld op true en maakt geen nieuwe gebeurtenis aan.

Een dry-run-sleutel retourneert 200 met dry_run ingesteld op true. Er wordt niets vastgelegd.

Veelvoorkomende fouten:

  • 400 - de body is ongeldig, een weigering heeft geen reason, de tijdstempel valt buiten het toegestane bereik, of facility_id / linking_identifier komt niet overeen met een gekoppelde faciliteit.
  • 403 - de sleutel is read-only.
  • 403 integration_not_enabled - je integratie is niet ingeschakeld voor de faciliteit. message geeft de reden.
  • 404 - de Door/Gate Controller is niet gevonden voor de gekoppelde faciliteit.

Verzoek

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"
  }'

Respons

{
  "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 herhaling

{
  "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
}

Faciliteitrapporten

Een momentopname met de belangrijkste operationele en financiële metrics van een faciliteit gedurende een specifieke periode.

Eindpunten

POST /partner/v1/report-snapshots - Save report snapshots

Het Report Snapshot-object

Attributen

  • facility_id string een van beideGeef het type faciliteitidentificatie op dat voor je integratie is geconfigureerd: gebruik facility_id voor integraties met Direct Link of linking_identifier voor integraties met een Linking Identifier. Stuur ze niet allebei: de API gebruikt het identificatietype dat voor je partneraccount is geconfigureerd en negeert het andere. Meer informatie

    Unieke identificatie van de faciliteit uit Performance Hub.

  • linking_identifier string een van beideGeef het type faciliteitidentificatie op dat voor je integratie is geconfigureerd: gebruik facility_id voor integraties met Direct Link of linking_identifier voor integraties met een Linking Identifier. Stuur ze niet allebei: de API gebruikt het identificatietype dat voor je partneraccount is geconfigureerd en negeert het andere. Meer informatie

    Unieke identificatiewaarde die de partner voor elke locatie gebruikt (bijvoorbeeld "Branch ID", "Location Code", "Store Number"). Meer informatie

  • start_date string verplicht

    Begindatum van de periode van de momentopname in de notatie YYYY-MM-DD.

  • end_date string verplicht

    Einddatum van de periode van de momentopname in de notatie YYYY-MM-DD.

  • metrics object verplicht

    Metrics-object met gegevens over leden en omzet voor de periode.

Het Report Snapshot-object

{
  "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"
    }
  }
}

Rapportmomentopnamen opslaan

Dient operationele en financiële metrics in voor een faciliteit gedurende een specifieke periode.

Parameters

  • snapshots array verplicht

    Array van Report Snapshot-objecten om op te slaan. Maximaal 25 items per verzoek. Elk item moet facility_id (verplicht als je linking_identifier niet gebruikt) of linking_identifier (verplicht als je facility_id niet gebruikt) bevatten.

Retourwaarde

Retourneert een eenvoudig bericht dat de synchronisatie bevestigt.

Verzoek

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"
          }
        }
      }
    ]
  }'

Respon

{
  "message": "Report snapshot sync successful."
}

Fouten

De Partner API gebruikt standaard HTTP-statuscodes en JSON-response-bodies om uit te leggen waarom een verzoek is mislukt.

Structuur van foutresponses

De meeste API-fouten retourneren een JSON-body met een bericht en, waar beschikbaar, gestructureerde details.

Statuscodes

Fouten bij Access Time Windows

De validatie van vensters mislukt voordat de ongeldige momentopname wordt weggeschreven. Veelvoorkomende oorzaken waarbij een nieuwe poging geen zin heeft:

  • access_time_windows_revision ontbreekt terwijl access_time_windows aanwezig is.
  • Epochwaarden als tekenreeks, als drijvendekommagetal of vermoedelijk in milliseconden.
  • Een ongeldige IANA-tijdzone, een omgekeerd interval, een dubbele external_id, overlappende wekelijkse blokken of een nachtelijk blok dat niet is gesplitst.
  • Een waarde buiten de gedocumenteerde limieten voor aantal, lengte of tijdsspanne.

Een herhaalde revisie met andere genormaliseerde inhoud levert een 409 Conflict op. Stem af op de meest recente gezaghebbende status en ken een nieuwere revisie toe; blijf het conflicterende paar niet opnieuw proberen. Een oudere revisie wordt gemeld als een verouderde, overgeslagen momentopname en mag een nieuwere status niet overschrijven. Een onbekende of niet-toegewezen scope_key leidt bij autorisatie tot weigering (fail-closed) en moet worden behandeld als een configuratiewaarschuwing.

Als de levering een time-out krijgt of een tijdelijke 5xx ontvangt, probeer dan exact dezelfde genormaliseerde momentopname opnieuw met dezelfde revisie. Als het ophalen bij de upstream bron is mislukt, laat het vensterveld dan helemaal weg; vervang het nooit door een lege array.

Richtlijnen voor nieuwe pogingen

Probeer deze opnieuw met begrensde exponentiële backoff:

  • 429
  • 500
  • 502
  • 503
  • 504

Probeer deze niet blindelings opnieuw:

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

Behandel bij toegangsbeheer time-out- en offline-responses altijd als mislukte ontgrendelingen, tenzij je eigen toegangsregels en veiligheidsprocessen anders voorschrijven.

Gegevens voor ondersteuning

Vermeld het volgende wanneer je contact opneemt met ondersteuning:

  • Endpoint en HTTP-methode.
  • Tijdstempel en tijdzone.
  • Partnersleutel-ID, niet de geheime sleutel.
  • Gebruikte faciliteitidentificatie.
  • Bronrecord-ID uit je systeem.
  • Status en body van de response.
  • event_id of command_id, indien beschikbaar.
{
  "success": false,
  "message": "Request body.members[0].member_id is required"
}

Sommige domeinspecifieke endpoints retourneren een expliciete status en reden. Fouten bij toegangsbeheer bevatten bijvoorbeeld velden zoals reason, door_id, facility_id en 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

Het verzoek is onjuist opgebouwd of verplichte velden ontbreken. Corrigeer het verzoek voordat je het opnieuw probeert.

401 Unauthorized

Authenticatie is mislukt. Controleer of je HTTP Basic Auth gebruikt met je geheime API-sleutel als gebruikersnaam en een leeg wachtwoord.

403 Forbidden

De sleutel is geldig, maar de bewerking is niet toegestaan. Veelvoorkomende oorzaken zijn het gebruik van een read-only sleutel voor een schrijfbewerking of een poging om een faciliteit te benaderen waarvoor je integratie niet is ingeschakeld.

404 Not Found

De gevraagde resource is niet gevonden of is niet beschikbaar voor je integratie.

409 Conflict

Het verzoek is in strijd met de huidige status van de resource. Bij toegangsbeheer kan dit betekenen dat een Door/Gate Controller in de onderhoudsmodus staat.

422 Unprocessable Entity

Het verzoek is geldige JSON, maar voldoet niet aan de semantische validatie. Corrigeer de gegevens voordat je het opnieuw probeert.

429 Too Many Requests

De integratie heeft de gedocumenteerde snelheidslimiet overschreden. Probeer het opnieuw met exponentiële backoff.

500 Internal Server Error

Performance Hub kon het verzoek niet voltooien door een interne fout. Probeer het opnieuw met backoff. Blijft het probleem bestaan, neem dan contact op met ondersteuning en vermeld het endpoint, de tijdstempel en de response-body.

503 Service Unavailable

Een afhankelijke service of een apparaat is niet beschikbaar. Bij ontgrendelingen van een Door/Gate Controller kan dit betekenen dat de controller offline is.

504 Gateway Timeout

Er is een time-out opgetreden bij de bewerking. Bij ontgrendelingen van een Door/Gate Controller betekent dit dat de ontgrendeling niet binnen de time-outperiode is bevestigd.

Versiebeheer

De versie van de Partner API staat in de URL. De huidige versie is:

Wijzigingsbeleid

Performance Hub streeft ernaar om waar mogelijk aanvullende, achterwaarts compatibele wijzigingen door te voeren.

Voorbeelden van achterwaarts compatibele wijzigingen:

  • Een nieuw optioneel veld aan een verzoek toevoegen.
  • Een nieuw veld aan een response toevoegen.
  • Een nieuw endpoint toevoegen.
  • Een nieuwe enumwaarde toevoegen waar van clients wordt verwacht dat ze onbekende waarden afhandelen.
  • Validatieberichten verbeteren zonder het contract voor statuscodes te wijzigen.

access_time_windows en access_time_windows_revision zijn aanvullende velden in Member-verzoeken. Bestaande clients die ze weglaten, laten de opgeslagen momentopname van Access Time Windows ongewijzigd. Deze regel voor weglaten behoudt de compatibiliteit met gedeeltelijke upserts; weglaten is niet hetzelfde als een lege array sturen.

Voorbeelden van wijzigingen die compatibiliteit verbreken:

  • Een veld verwijderen of hernoemen.
  • Het type van een veld wijzigen.
  • Een optioneel veld in een verzoek verplicht maken.
  • Een endpoint verwijderen.
  • De betekenis van een bestaande statuscode of domeinspecifieke reason wijzigen.

Uitfasering

Wanneer een wijziging nodig is die compatibiliteit verbreekt, vermijdt Performance Hub waar mogelijk om de bestaande versie ter plekke te wijzigen. In plaats daarvan introduceren we een nieuwe versie of een migratiepad en communiceren we de wijziging aan de betrokken partners.

Meldingen over uitfasering kunnen bestaan uit:

  • Een vermelding in het wijzigingslogboek.
  • Directe communicatie met partners.
  • Opmerkingen in de Partner Console.
  • Migratierichtlijnen in de documentatie.

Aanbevelingen voor clients

Bouw clients die bestand zijn tegen aanvullende wijzigingen:

  • Negeer responsevelden die je niet gebruikt.
  • Behandel onbekende enumwaarden als niet-ondersteund in plaats van te crashen.
  • Vermijd strikte gelijkheidscontroles op responses.
  • Log onbekende waarden, zodat je je integratie bewust kunt bijwerken.

Bewaar voor Member-partities met revisies, zoals Access Time Windows, de ingediende revisie en de genormaliseerde payload totdat de uitkomst bekend is. Een revisie hergebruiken voor gewijzigde inhoud is een conflict, terwijl het herhalen van dezelfde inhoud idempotent is. Zie Access Time Windows.

OpenAPI-specificaties

Gebruik de gepubliceerde OpenAPI-specificaties om clients te genereren, verzoeken te valideren en wijzigingen in de structuur van de API in de loop van de tijd te volgen.

Zie OpenAPI-specificaties.

https://partner-api.performancehub.co/partner/v1/

Wijzigingslogboek

In dit wijzigingslogboek staan belangrijke wijzigingen in de Partner API en de Partner Console die van invloed zijn op het gedrag van integraties.

2026-09-09

2026-05-06

2026-05-01

Wijzigingscategorieën

Toekomstige vermeldingen gebruiken deze categorieën:

  • Toegevoegd - nieuw endpoint, veld, nieuwe handleiding of functionaliteit.
  • Gewijzigd - gedrag of documentatie gewijzigd zonder dat ondersteuning vervalt.
  • Verouderd - functie blijft beschikbaar, maar er is een migratiepad gepland.
  • Verwijderd - functie of endpoint verwijderd.
  • Opgelost - bugfix of correctie in de documentatie.
  • Beveiliging - wijziging in authenticatie, autorisatie, gegevensverwerking of sleutelbeheer.

Toegevoegd

  • Leverancierneutrale access_time_windows-momentopnamen voor leden toegevoegd, met een combinatie van absolute en wekelijks terugkerende vensters.
  • Semantiek toegevoegd voor de volgorde via access_time_windows_revision, idempotente herhaling, conflicten, het overslaan van verouderde revisies en expliciete intrekking.
  • Richtlijnen toegevoegd voor IANA-tijdzones, zomertijd, logische scope_key-toewijzing, actualiteit van brongegevens, implementatie door producenten en certificering.

Toegevoegd

  • Documentatie voor het partnerprogramma toegevoegd over partnertypen, onboarding, best practices, gereedheid voor livegang, fouten, versiebeheer en ondersteuning.
  • Een speciaal aanvraagproces Partner worden toegevoegd voor potentiële technische en commerciële partners.
  • Documentatie toegevoegd over hoe goedgekeurde partnerintegraties verschijnen in de Performance Hub-partnerdirectory binnen het centrale Performance Hub-platform.

Toegevoegd

  • Documentatie over toegangsbeheer met de Door/Gate Controller toegevoegd, waaronder bewerkingen voor opvragen, status en ontgrendelen.
  • Documentatie toegevoegd over synchroon ontgrendelgedrag: de API meldt pas succes nadat de controller ter plaatse bevestigt dat het relais fysiek is ontgrendeld.
  • Documentatie toegevoegd over ondersteuning voor de optionele idempotency_key bij ontgrendelverzoeken voor de Door/Gate Controller.