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, inclusiefdefault, 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_activeenunlock_confirmation_timeout. - Beheerders begrijpen dat een time-out betekent dat de ontgrendeling niet is bevestigd.
- Je logboeken bewaren de geretourneerde
event_idencommand_id. - Je hebt een handmatige terugvalprocedure voor medewerkers van de faciliteit.
Foutafhandeling en nieuwe pogingen
- Responses met
400,401,403,404,409en422worden aan beheerders of supportteams gemeld in plaats van blindelings opnieuw geprobeerd. - Responses met
429,500,502,503en504gebruiken 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_iddat 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:
- Probeer het na 1 seconde opnieuw.
- Probeer het na 2 seconden opnieuw.
- Probeer het na 4 seconden opnieuw.
- 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_revisionover de incrementele en reconciliatieworkers heen. - Herhaal een onzekere of tijdelijk mislukte levering met dezelfde revisie en genormaliseerde payload.
- Laat
access_time_windowsweg 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_idenscope_keystabiel 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
200nadat 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
stringverplichtUnieke identificatie van de organisatie.
name
stringverplichtNaam 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
stringverplichtUnieke identificatie van de faciliteit.
org_id
stringverplichtUnieke identificatie van de bovenliggende organisatie.
name
stringverplichtNaam van de faciliteit.
brand
stringoptioneelMerknaam die de faciliteit gebruikt.
website_url
stringoptioneelURL van de website van de faciliteit.
place_data
objectoptioneelLocatiegegevens uit de Google Places API met land, opgemaakt adres, Google Place ID, provincie en plaats.
social_links
objectoptioneelLinks naar sociale media van de faciliteit.
timezone
stringoptioneelIANA-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
stringverplichtUnieke identificatie van het abonnement.
facility_id
stringeen 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 informatieUnieke identificatie van de faciliteit uit Performance Hub.
linking_identifier
stringeen 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 informatieUnieke identificatiewaarde die de partner voor elke locatie gebruikt (bijvoorbeeld "Branch ID", "Location Code", "Store Number"). Meer informatie
name
stringverplichtLeesbare naam van het abonnement (bijvoorbeeld
"Office tenant – business hours","Student – term access","Hotel guest","10 Class Pack").billing_cycle
stringoptioneelFactureringsfrequentie. Een van
weekly,fortnightly,monthly,annuallyofone_time.price
integeroptioneelBasisprijs in de kleinste munteenheid (centen voor USD/AUD).
currency
stringoptioneelISO 4217-valutacode (bijvoorbeeld
"AUD","USD").description
stringoptioneelOptionele marketing- of interne beschrijving.
active_members
integeroptioneelAantal actieve leden met dit abonnement
is_recurring
booleanoptioneelOf het abonnement automatisch wordt verlengd.
is_trial
booleanoptioneelOf dit een proefaanbod is.
visible_to_public
booleanoptioneelOf het abonnement via selfservice kan worden gekocht.
duration_days
integeroptioneelAantal dagen dat het abonnement geldig is.
access_zones
arrayoptioneelArray van toegangszones die in het abonnement zijn inbegrepen. Elke zone kan eigen toegangsuren definiëren. Zie Toegangszones voor meer informatie.
class_limit
integeroptioneelMaximaal 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
stringverplichtDe naam van de zone (bijvoorbeeld "Level 3 Tenancy", "Library", "Guest Floors", "Main Gym Floor").
description
stringoptioneelBeschrijving van wat er in die zone is inbegrepen.
access_hours
objectoptioneelToegangsuren 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
arrayverplichtArray 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 jelinking_identifierniet gebruikt) oflinking_identifier(verplicht als jefacility_idniet 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
stringverplichtUnieke identificatie van het lid.
facility_id
stringeen 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 informatieUnieke identificatie van de faciliteit uit Performance Hub.
linking_identifier
stringeen 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 informatieUnieke identificatiewaarde die de partner voor elke locatie gebruikt (bijvoorbeeld "Branch ID", "Location Code", "Store Number"). Meer informatie
first_name
stringverplichtVoornaam van het lid.
last_name
stringverplichtAchternaam van het lid.
email
stringoptioneelE-mailadres.
mobile_phone
stringoptioneelMobiel telefoonnummer in E.123-notatie (bijvoorbeeld
"+1 415 555 2671").address
objectoptioneelObject met het fysieke adres en de volgende eigenschappen:
address_line_1(string) - Primair straatadresaddress_line_2(string, optioneel) - Tweede adresregelcity(string) - Plaatsnaamstate(string) - Code van staat/provinciepostal_code(string) - Postcodecountry(string) - ISO 3166-1 alpha-2-landcode (bijvoorbeeld "AU", "US")country_name(string, optioneel) - Volledige landnaam
date_of_birth
stringoptioneelGeboortedatum in de notatie
YYYY-MM-DD.gender
stringoptioneelEen van
male,female,non_binary,prefer_not_to_sayofunknown.type
stringoptioneelType lid (bijvoorbeeld
staff,member,prospect).tags
arrayoptioneelKorte hulptekenreeksen of teksten om specifieke leden in te delen en te herkennen (bijvoorbeeld
["vip", "personal-training", "student"]).membership_status
stringoptioneelHuidige lidmaatschapsstatus (bijvoorbeeld
active,expired,on_hold).membership_plans
arrayoptioneelArray van abonnementen die aan het lid zijn gekoppeld.
profile_picture
stringoptioneelBase64-gecodeerde profielfoto (optioneel).
created
stringoptioneelISO 8601-tijdstempel van het moment waarop het lid is aangemaakt.
updated
stringoptioneelISO 8601-tijdstempel van het moment waarop het lid voor het laatst is bijgewerkt.
access_time_windows
arrayoptioneelVolledige 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
integerverplicht met access_time_windowsMonotoon oplopend, niet-negatief JSON-veilig geheel getal voor de reeks van dit lid/deze bron. Verplicht wanneer
access_time_windowsaanwezig 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
arrayoptioneelDe volledige momentopname van Access Time Windows voor dit lid en deze partnerbron. Een momentopname kan
absolute- enweekly-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
integerverplicht met access_time_windowsEen monotoon oplopend, niet-negatief JSON-veilig geheel getal voor de revisiereeks van dit lid/deze bron. Het is verplicht wanneer
access_time_windowsaanwezig is en mag niet groter zijn dan9007199254740991.
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 opfrombeginnen; precies optois die niet meer actief. frommoet kleiner zijn danto. Als beide wekelijkse grenzen aanwezig zijn, moetactive_fromkleiner zijn danactive_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:
fromentogeven al exacte UTC-tijdstippen aan.timezoneis alleen metadata voor weergave en audit; een wijziging ervan verschuift geen van beide tijdstippen. - Wekelijkse vensters:
timezonebepaalt de lokale kloktijd en de zomertijdregels waarmeeaccess_hourswordt 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_fromenactive_untilblijven 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
togeen 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_untilwanneer 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
fromen stopt precies opto; de einden van wekelijkse blokken zijn ook exclusief. - Het bijwerken van tijden onder dezelfde
external_idmet een nieuwere revisie wordt van kracht. - Het weglaten van
access_time_windowswijzigt 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_keyleidt 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
arrayverplichtArray 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 jelinking_identifierniet gebruikt) oflinking_identifier(verplicht als jefacility_idniet gebruikt) bevatten.Wanneer een lid
access_time_windowsbevat, moet het ookaccess_time_windows_revisionbevatten. 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
stringoptioneelUnieke identificatie van de check-in. Optioneel: wordt automatisch gegenereerd uit het paar
member_identimestampals dit niet wordt opgegeven.member_id
stringverplichtUnieke identificatie van het lid.
facility_id
stringeen 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 informatieUnieke identificatie van de faciliteit uit Performance Hub.
linking_identifier
stringeen 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 informatieUnieke identificatiewaarde die de partner voor elke locatie gebruikt (bijvoorbeeld "Branch ID", "Location Code", "Store Number"). Meer informatie
check_in_type
stringoptioneelType bezoek. Een van
member,class,staff,guestoftrial.source
stringoptioneelHoe de check-in is vastgelegd. Veelvoorkomende waarden zijn
manual,tag,rfid,kioskenapp. Aanvullende waarden zoalsdoor_readerofbookingkunnen ook worden gebruikt.class_id
stringoptioneelOptioneel. Als de check-in aan een lesboeking of lesaanwezigheid is gekoppeld.
timestamp
stringverplichtTijdstempel 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
arrayverplichtArray 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 jelinking_identifierniet gebruikt) oflinking_identifier(verplicht als jefacility_idniet 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
stringverplichtUnieke 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
stringverplichtFaciliteit-ID in Performance Hub.
linking_identifier
stringoptioneelFaciliteitidentificatie van de partner wanneer je integratie Linking Identifiers gebruikt. Meer informatie
name
stringverplichtLeesbare apparaatnaam die in Performance Hub is geconfigureerd.
zone
stringoptioneelDeurzone of locatie, zoals
Entrance.status
stringverplichtonlineofoffline.relay_state
stringoptioneelLaatst bekende status van het relais, zoals
lockedofunlocked.maintenance_mode
stringverplichtHuidige onderhoudsmodus. Een van
off,force-openofforce-closed.hold_time_seconds
integerverplichtStandaard openhoudtijd na ontgrendeling die voor de deur is geconfigureerd.
last_seen
stringoptioneelISO-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.
Parameters
facility_id
stringoptioneel 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 informatieFaciliteit-ID in Performance Hub. Gebruik dit voor integraties met Direct Link.
linking_identifier
stringoptioneel 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 informatieJe 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
stringverplichtID van de Door/Gate Controller dat door het list-endpoint wordt geretourneerd.
facility_id
stringeen 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 informatieFaciliteit-ID in Performance Hub. Verplicht voor integraties met Direct Link.
linking_identifier
stringeen 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 informatieFaciliteitidentificatie 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
stringverplichtID van de Door/Gate Controller dat door het list-endpoint wordt geretourneerd.
facility_id
stringeen 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 informatieFaciliteit-ID in Performance Hub. Verplicht voor integraties met Direct Link.
linking_identifier
stringeen 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 informatieFaciliteitidentificatie van de partner. Verplicht voor integraties met een Linking Identifier.
member_id
stringverplichtLid-ID van de partner. Wordt gebruikt voor auditlogboeken en latere koppeling van gegevens.
first_name
stringverplichtVoornaam van de persoon die de deur opent.
last_name
stringverplichtAchternaam van de persoon die de deur opent.
full_name
stringoptioneelOptioneel. Als dit wordt weggelaten, combineert Performance Hub
first_nameenlast_name.check_in_id
stringoptioneelOptioneel check-in-ID uit je systeem om gegevens aan elkaar te koppelen.
idempotency_key
stringoptioneelOptionele 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
stringverplichtID van de Door/Gate Controller dat door het list-endpoint wordt geretourneerd.
facility_id
stringeen 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 informatieFaciliteit-ID in Performance Hub. Verplicht voor integraties met Direct Link.
linking_identifier
stringeen 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 informatieFaciliteitidentificatie van de partner. Verplicht voor integraties met een Linking Identifier.
outcome
stringverplichtdeniedofattempted.reason
stringoptioneelRedencode in snake_case met kleine letters, maximaal 64 tekens. Verplicht wanneer
outcomedeniedis. Voorbeeld:membership_expired.reason_display_text
stringoptioneelLeesbare reden, maximaal 256 tekens. Voorbeeld:
Membership expired on 2026-04-01.member_id
stringoptioneelLid-ID van de partner. Laat dit weg wanneer de inloggegevens niet bij een lid hoorden, zoals bij een onbekende kaart.
user_email
stringoptioneelE-mailadres van de persoon die toegang probeerde te krijgen.
timestamp
stringoptioneelWanneer 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
stringoptioneelSleutel 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 geenreason, de tijdstempel valt buiten het toegestane bereik, offacility_id/linking_identifierkomt niet overeen met een gekoppelde faciliteit.403- de sleutel is read-only.403 integration_not_enabled- je integratie is niet ingeschakeld voor de faciliteit.messagegeeft 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
stringeen 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 informatieUnieke identificatie van de faciliteit uit Performance Hub.
linking_identifier
stringeen 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 informatieUnieke identificatiewaarde die de partner voor elke locatie gebruikt (bijvoorbeeld "Branch ID", "Location Code", "Store Number"). Meer informatie
start_date
stringverplichtBegindatum van de periode van de momentopname in de notatie
YYYY-MM-DD.end_date
stringverplichtEinddatum van de periode van de momentopname in de notatie
YYYY-MM-DD.metrics
objectverplichtMetrics-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
arrayverplichtArray van Report Snapshot-objecten om op te slaan. Maximaal 25 items per verzoek. Elk item moet
facility_id(verplicht als jelinking_identifierniet gebruikt) oflinking_identifier(verplicht als jefacility_idniet 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_revisionontbreekt terwijlaccess_time_windowsaanwezig 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:
429500502503504
Probeer deze niet blindelings opnieuw:
400401403404409422
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_idofcommand_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
reasonwijzigen.
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.
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_keybij ontgrendelverzoeken voor de Door/Gate Controller.