People sync
Use this recipe to keep an external directory, access-control list, reporting tool, or data warehouse aligned with HollyHR's safe People projection.
The default sync uses people:read only. It does not read dates of birth, home
contact details, demographics, compensation, bank details, tax or government
identifiers, document bytes, avatar bytes, or sensitive notes.
What it reads
GET /peopleGET /people/{personId}for detail refreshesGET /people/{personId}/org-linkswhen you need historical org placement- optional
GET /people/{personId}/employmentfor current employment detail
Use webhooks for public API-origin changes when you need near-real-time notifications, then fetch current state through REST. UI-origin changes inside HollyHR do not currently emit public API webhooks.
Scopes
Code
Add people:write only for a deliberate provisioning or lifecycle integration.
Do not add people:personal:read unless your integration has a documented need
for one-person-at-a-time elevated personal profile reads.
Baseline sync
Code
Incremental sync
Store the latest successful updated_at checkpoint from your downstream store,
then request only changed records:
Code
Always follow cursor pagination until pagination.next_cursor is empty before
advancing the checkpoint.
Optional safe writes
For starter provisioning, use POST /people with people:write and an
Idempotency-Key. HollyHR accepts safe setup fields such as work email, name,
job title, and start date. It does not send invite emails and does not accept
payroll, bank, tax, government-id, home contact, date-of-birth, demographic,
notes, avatar, or document payloads.
For updates, read the person first and send the returned ETag as If-Match
with an idempotency key. If the API returns 412, fetch the latest record and
ask a human or deterministic merge rule to resolve the conflict.
Webhook pairing
Create a webhook for person.created, person.updated, person.ended, and
person.reactivated if your integration needs notification-driven refreshes.
The endpoint key needs webhooks:manage plus people:read.
Webhook payloads are thin notifications. Deduplicate by
HollyHR-Webhook-Id, verify the signature, then call GET /people/{personId}
for the current projection before updating downstream systems.