Mensen synchroniseren vanuit je eigen API
Wijs Polzy op een HTTPS-endpoint dat je mensen opsomt en het leest dat volgens schema — en je systeem kan ondertekende wijzigingen doorsturen op het moment dat ze gebeuren.
Op deze pagina
- 1Voordat je begint
- 2Wat je endpoint teruggeeft
- 3Je API koppelen in Polzy
- 4Synchronisatie-instellingen
- 5De velden koppelen
- 6Vooraf bekijken en de eerste synchronisatie uitvoeren
- 7Wijzigingen doorsturen op het moment dat ze gebeuren
- 8Aanroepen ondertekend zonder tijdstempel
- 9Problemen oplossen
- 10Goed om te weten
De bron Custom API verbindt Polzy met een eigen systeem — een interne HR-tool, een CRM, een database achter een API. Het werkt op twee manieren, en je kunt ze allebei gebruiken:
- Ophalen (pull). Polzy leest volgens een schema dat jij kiest een HTTPS-endpoint dat je mensen als JSON teruggeeft.
- Doorsturen (push). Je systeem stuurt één persoon naar Polzy op het moment dat die verandert, ondertekend met een geheim dat jullie delen, en Polzy verwerkt het meteen.
In beide gevallen maakt dezelfde veldkoppeling van jouw records de mensen in Polzy.
Deelnemers synchroniseren zit in Team en hoger, en alleen beheerders van de werkruimte kunnen een bron koppelen. Voor doorsturen is ook de pagina Integraties nodig, die bij Business hoort, om het adres te kopiëren waar je systeem naartoe stuurt.
Voordat je begint
Je hebt nodig:
- Beheerder zijn van de Polzy-werkruimte, op Team of hoger, met Deelnemers synchroniseren ingeschakeld onder Instellingen → Algemeen → Wat deze werkruimte doet.
- Een endpoint op het openbare internet, via HTTPS, dat een JSON-lijst van mensen teruggeeft — en een ontwikkelaar die het kan aanpassen. Polzy roept geen privé- of interne adressen aan.
- Een unieke
idbij elke persoon. Daarmee herkent Polzy mensen van de ene synchronisatie op de andere. - De velden waarop je resultaten wilt groeperen, al toegevoegd in Polzy.
Een werkruimte synchroniseert uit één bron tegelijk. Is er al een andere bron gekoppeld, koppel die dan eerst los. Levert je organisatie mensen aan via SCIM, dan kan er helemaal geen bron worden gekoppeld — zie SCIM.
Wat je endpoint teruggeeft
Een GET-verzoek aan je endpoint geeft de mensen terug, als lijst bovenaan het antwoord of op een pad daarbinnen:
{
"data": {
"users": [
{
"id": "4821",
"email": "anouk@acme.com",
"first_name": "Anouk",
"last_name": "Jansen",
"phone": "+31612345678",
"is_active": true,
"department": "Sales",
"manager_email": "rahul@acme.com"
}
]
},
"meta": { "next_cursor": "eyJwYWdlIjoyfQ" }
}
Hier is Gegevenspad (JSON) data.users; staat er een gewone lijst bovenaan, laat het dan leeg. Paden kunnen ook in lijsten verwijzen, zoals results[0].people.
Elk verzoek heeft 30 seconden om te antwoorden. Verdeelt je endpoint de resultaten over pagina's, vertel Polzy dan hoe:
- Met een link of cursor. Zet het veld waarin die staat in Veld voor volgende pagina, zoals
meta.next_cursor. Een volledig adres wordt zo aangeroepen; een cursor wordt aan het adres van je endpoint toegevoegd als?cursor=…, of onder de naam in Paginaparameter. Polzy stopt als het veld leeg is. - Met een paginanummer. Laat Veld voor volgende pagina leeg en zet de naam van de parameter in Paginaparameter, zoals
page. Polzy vraagt pagina 2, 3 enzovoort op, en stopt bij de eerste lege pagina.
Polzy leest hoogstens 500 pagina's per synchronisatie.
Je API koppelen in Polzy
- Open Contacten → Synchronisatie en velden.
- Zoek Custom API onder Beschikbare bronnen en kies Verbinden. Er opent een paneel met drie stappen: Verbinding, Synchronisatie-instellingen en Veldkoppeling.
- Vul je API-eindpunt-URL in, en het Gegevenspad (JSON) en de pagineringsvelden als je die nodig hebt.
- Kies het Type authenticatie en vul in wat erbij hoort: een Bearer Token; een Naam van de API Key-header en een Waarde van de API Key; een Gebruikersnaam en Wachtwoord voor Basisauthenticatie; of niets bij Geen. Voeg elke andere header die je endpoint nodig heeft toe onder Aangepaste headers.
- Voor doorsturen vul je een lange willekeurige tekenreeks in als Ondertekengeheim voor webhooks, en geef je dezelfde reeks aan je ontwikkelaar. Laat het anders leeg.
- Kies Verbinding testen. Successfully connected to API. Found N users. betekent dat Polzy je endpoint kon lezen.
- Kies Volgende, controleer de synchronisatie-instellingen, kies nog eens Volgende, koppel de velden (hieronder) en kies dan Verbinden.
Tokens, wachtwoorden, het ondertekengeheim en de waarde van elke aangepaste header worden versleuteld opgeslagen en alleen gebruikt om je endpoint aan te roepen.
Synchronisatie-instellingen
| Instelling | Wat het doet | Standaard |
|---|---|---|
| Synchronisatiefrequentie | Hoe vaak Polzy je endpoint leest: elke 30 minuten, elk uur, elke 4 uur of dagelijks. | Elk uur |
| Verwijderde gebruikers uitschakelen | Iemand die Polzy uit je API heeft binnengehaald en daar niet meer voorkomt, wordt bij de volgende synchronisatie gedeactiveerd. | Aan |
| Uitnodigingsmails versturen | Nieuwe leden met een e-mailadres krijgen een uitnodiging om zich bij Polzy aan te melden. Contacten nooit. | Aan |
| Standaardrol | De rol die nieuwe leden krijgen: Kijker, Redacteur of Beheerder. Geldt alleen voor mensen die de synchronisatie aanmaakt. | Kijker |
| Ruwe gegevens opslaan | Bewaart bij elke persoon in Polzy een kopie van het record zoals je API het stuurde. Laat dit uit tenzij je een koppeling aan het uitzoeken bent: het bewaart meer persoonsgegevens dan nodig. | Uit |
Of je mensen als leden of als contacten binnenkomen, volgt het publiek van je werkruimte: leden in een werkruimte voor medewerkers, die zich kunnen aanmelden en een plek gebruiken; contacten in een werkruimte voor klanten, productgebruikers of eventgasten, die alleen antwoorden.
De velden koppelen
De standaardkoppeling leest email, first_name, last_name, phone en is_active. De rest koppel je zelf: zet Aangepaste veldkoppeling aan en typ voor elk veld het pad in je records dat het vult — department, manager_email, plan, profile.country. De lijst stelt gangbare namen voor, en de paden gebruiken dezelfde notatie als Gegevenspad. Elke rij heeft ook een waarde bij Indien leeg, gebruik, die wordt ingevuld als een record niets voor dat veld heeft; een waarde die je API wél stuurt, wordt nooit overschreven.
Goed om te weten:
- Echte voorbeelden. Kies na het koppelen Instellingen op Synchronisatie en velden en open Veldkoppeling opnieuw: de suggesties bevatten dan elk pad uit vijf echte records, elk met een Voorbeeld.
- Actieve status. Een waarde false, 0, no, inactive, terminated, leave, disabled, suspended of archived deactiveert de persoon; elke andere waarde, of geen, houdt hem actief.
- Leidinggevenden. Koppel Leidinggevende aan een veld met het e-mailadres, het personeelsnummer of de
idin je API van de leidinggevende. De koppeling wordt gelegd als die leidinggevende ook in Polzy staat. Daarvoor moet Rapportagelijnen in de werkruimte aan staan. - Alleen velden van je werkruimte worden gevuld. Voeg een veld toe met Veld toevoegen op Synchronisatie en velden voordat je het koppelt. Wil je resultaten erop vergelijken, maak er dan een Lijst-veld van en zet Groepen aan.
Vooraf bekijken en de eerste synchronisatie uitvoeren
- Kies op Synchronisatie en velden onder Synchronisatiegeschiedenis de optie Synchronisatie vooraf bekijken. Polzy rekent uit wat een synchronisatie zou toevoegen, bijwerken en deactiveren, zonder iets te wijzigen, en opent het logboek waar het resultaat als Voorbeeld verschijnt.
- Bekijk het voorbeeld, pas zo nodig de koppeling aan onder Instellingen, en kies dan Nu synchroniseren.
Mensen worden herkend aan hun id en daarna aan hun e-mailadres. Iemand die je al met de hand had toegevoegd, wordt dus bijgewerkt in plaats van dubbel toegevoegd.
Wijzigingen doorsturen op het moment dat ze gebeuren
Bij doorsturen stuur je steeds één persoon ondertekend naar Polzy, telkens als die verandert. Geplande synchronisaties blijven ernaast draaien en halen op wat een doorgestuurde wijziging heeft gemist — Polzy heeft het endpoint hierboven dus nog steeds nodig, ook als dat een lege lijst teruggeeft.
- Open in Polzy Integraties, dan Custom API, en kopieer het adres onder Ontvangen. Het is voor jouw koppeling gemaakt en eindigt op
/api. - Zorg dat hetzelfde geheim is opgeslagen in Ondertekengeheim voor webhooks onder Instellingen en in je systeem.
- Stuur vanuit je systeem een
POSTnaar dat adres met de persoon als JSON en drie headers:
| Header | Waarde |
|---|---|
X-Polzy-Timestamp | De huidige Unix-tijd, in seconden. |
X-Polzy-Signature | De hex HMAC-SHA256 van de tijdstempel, een punt en de exacte body: <timestamp>.<body>, gemaakt met het geheim. |
X-Polzy-Event-Id | Een ID voor deze wijziging, hetzelfde als je hem opnieuw stuurt. |
De body is de persoon, met dezelfde veldnamen die je endpoint teruggeeft, zodat dezelfde koppeling geldt. Hij mag ook verpakt zijn als { "user": { … } } of { "employee": { … } }. Hij moet de id bevatten en de velden die zijn gewijzigd — een body met alleen een id wordt geaccepteerd maar verandert niets. Wil je iemand deactiveren, stuur die persoon dan met "is_active": false, of met wat je koppeling leest voor Actieve status.
In Node.js:
import crypto from 'node:crypto';
const body = JSON.stringify({
id: '4821',
email: 'anouk@acme.com',
first_name: 'Anouk',
last_name: 'Jansen',
department: 'Operations',
is_active: true,
});
const timestamp = Math.floor(Date.now() / 1000).toString();
const signature = crypto
.createHmac('sha256', process.env.POLZY_SIGNING_SECRET)
.update(`${timestamp}.${body}`)
.digest('hex');
await fetch(process.env.POLZY_RECEIVING_URL, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-Polzy-Timestamp': timestamp,
'X-Polzy-Signature': signature,
'X-Polzy-Event-Id': 'person-4821-2026-10-31T09:12:00Z',
},
body,
});
In Python:
import hashlib, hmac, json, os, time, requests
body = json.dumps({"id": "4821", "email": "anouk@acme.com", "department": "Operations", "is_active": True})
timestamp = str(int(time.time()))
signature = hmac.new(
os.environ["POLZY_SIGNING_SECRET"].encode(),
f"{timestamp}.{body}".encode(),
hashlib.sha256,
).hexdigest()
requests.post(
os.environ["POLZY_RECEIVING_URL"],
data=body,
headers={
"Content-Type": "application/json",
"X-Polzy-Timestamp": timestamp,
"X-Polzy-Signature": signature,
"X-Polzy-Event-Id": "person-4821-2026-10-31T09:12:00Z",
},
)
Onderteken precies de bytes die je verstuurt: zet de body één keer om naar tekst en verstuur diezelfde tekenreeks. Wat Polzy antwoordt:
| Antwoord | Betekenis |
|---|---|
201 met { "received": true, "events": 1 } | Geaccepteerd. De wijziging verschijnt in Volledig logboek als een run gemarkeerd als Webhook. |
201 met { "received": true, "duplicate": true } | Deze X-Polzy-Event-Id is al eerder verwerkt; er is niets dubbel gedaan. |
401 met { "error": "Invalid webhook signature", "statusCode": 401 } | Er is geen geheim opgeslagen in Polzy, de handtekening klopt niet, of de tijdstempel ligt meer dan vijf minuten van nu af. |
429 | Meer dan 1.200 aanroepen per minuut vanaf één adres. Wacht de tijd uit Retry-After af en stuur opnieuw. |
Is je werkruimte gepauzeerd omdat die over het abonnement heen gaat, dan worden aanroepen bevestigd maar wordt er niets verwerkt.
Aanroepen ondertekend zonder tijdstempel
De eerste versie van doorsturen ondertekende alleen de body, zonder X-Polzy-Timestamp. Die aanroepen worden voorlopig nog geaccepteerd, en zolang je systeem ze stuurt, waarschuwt Instellingen → API → Webhooks met de datum vanaf wanneer ze worden geweigerd. Vanaf die datum beantwoordt Polzy ze met 401 en Calls without X-Polzy-Timestamp are refused since die datum. Stap vóór die tijd over op de handtekening hierboven — zie Webhooks.
Problemen oplossen
| Wat je ziet | Waarom | Wat je doet |
|---|---|---|
| A valid https API URL is required | Het adres begint niet met https://. | Bied je endpoint aan via HTTPS. |
| API response is not an array. Got: object. Check your Data Path configuration. | De lijst zit binnen het antwoord, of Gegevenspad wijst naar de verkeerde plek. | Zet Gegevenspad (JSON) op het pad van de lijst, zoals data.users. |
| Authentication failed. Check your credentials. | Je endpoint antwoordde met 401. | Controleer het type authenticatie en het token, de sleutel of het wachtwoord. |
| Access forbidden. Check API permissions. | Je endpoint antwoordde met 403. | Geef de gegevens die Polzy gebruikt toegang tot de lijst. |
| API endpoint not found. Check the URL. | Je endpoint antwoordde met 404. | Controleer het adres. |
| Connection refused. Check if the API URL is correct and accessible. | Op dat adres antwoordde niets. | Zorg dat het endpoint vanaf internet bereikbaar is. |
| Iedereen staat er twee keer in, of niemand wordt gedeactiveerd | Je records hebben geen id op het hoogste niveau, of die verandert tussen synchronisaties. | Geef elk record een vaste id. |
| Doorgestuurde wijzigingen worden geweigerd met Invalid webhook signature | Het geheim verschilt, de body is na het ondertekenen gewijzigd, of de klok van de server loopt niet gelijk. | Vergelijk de geheimen, onderteken precies de tekenreeks die je verstuurt, en houd je klok gelijk. |
| N personen zijn niet geïmporteerd: het abonnement heeft geen plekken meer voor hen. | Leden gebruiken plekken, en het abonnement is vol. | Maak plekken vrij of kies een ander abonnement, en kies dan Nu synchroniseren. |
Goed om te weten
- Limieten. Een synchronisatie die boven je plekken of contacten uitkomt, importeert wie past, stopt daar en laat het beheerders weten — zie Gebruik en limieten.
- Eén persoon per aanroep. Stuur voor elke gewijzigde persoon een aparte aanroep.
- Loskoppelen of verwijderen. Onder Instellingen stopt Loskoppelen de synchronisatie en blijven de instellingen en de geschiedenis bewaard, zodat je later opnieuw kunt verbinden; Verwijderen wist de koppeling. In beide gevallen blijven de al gesynchroniseerde mensen in Polzy staan en worden ze niet meer bijgewerkt, en worden doorgestuurde wijzigingen geweigerd.
- De rest van de API. Wil je vanuit je systeem resultaten lezen of acties aanmaken, gebruik dan een API-sleutel en de API-referentie.
Gerelateerde artikelen
Ingelogde leden kunnen het Polzy vragen of het team een bericht sturen via Support. Hoe snel we antwoorden, hangt af van je abonnement.