Versioning & changelog
The API is versioned in the path: /api/v1. A v2 would be a new path served
alongside v1, not a replacement for it.
What we may change without warning
These are additive and your integration must tolerate them:
- A new field on an existing object. Do not use a parser that rejects unknown properties.
- A new endpoint, or a new optional parameter on an existing one.
- A new value in an enumerated field — a new attendance status, say. Handle the default case rather than assuming the set is closed.
- A new webhook event type. You only receive the events you subscribed to.
- Wording changes in
titleanddetailon an error. Branch oncode, which never changes meaning.
What counts as breaking
- Removing or renaming a field, endpoint or error code.
- Narrowing what a field may contain, or making an optional parameter required.
- Changing the meaning of an existing
codeor scope. - Changing an authentication or pagination mechanism.
Outside beta, these go in a new version rather than into v1.
During the private beta
v1 is not frozen yet. We are in a private beta with a small number of
workspaces, and the point of it is to find the mistakes that are still cheap to
correct. A breaking change is possible.
What we commit to instead: we know who is building against the API, and we will contact you directly before changing anything that would break you. That promise only works if the list is accurate, so tell us you are integrating.
When the contract freezes at general availability, this page becomes the record of every change.
Changelog
2026-09 — Documents, assets, recruitment and announcements
Thirteen more read-only resources, under four scopes: documents:read for
document types, employee documents, contracts and HR letters; the new
assets:read and announcements:read; and recruitment:read for openings,
candidates and applications.
No file is exposed anywhere. A signed contract, a rendered letter, an announcement attachment and a candidate's CV all live behind keys into workspace storage — they would resolve to nothing for you and invite guessing at other people's.
Assets are retired rather than deleted, so pass include_deleted if you are
mirroring them; without it a retirement looks like a record that simply stopped
existing.
Writes are deliberately absent. Every one of these is a file-and-workflow surface: uploading a document needs multipart and a storage design this API does not have yet, and issuing a letter or converting a candidate runs a pipeline with emails and PDF rendering behind it. Writing the row without running the pipeline would produce records the app itself treats as broken.
2026-09 — Payroll, loans and expenses
Fourteen resources, all read-only: salary components, structures and assignments; payroll runs, entries and their component lines; salary slips; loan types, loans and installments; expense categories, claims and items.
Read-only is a decision rather than a stage. The figure on a payroll entry is the product of attendance, leave, loans, bonuses, adjustments, statutory contributions and tax slabs — a write path that set it directly would produce a number the workspace itself disagrees with.
Expenses have their own expenses:read scope, so an expense-reporting
integration does not have to be trusted with everyone's salary.
Two of these resources page by id rather than by creation time, because their
tables were created without timestamps. The cursor is opaque either way; only
the ordering differs.
2026-09 — Leave
Leave types, policies, groups, balances and applications, with approve,
reject and cancel. The four leave.* webhooks now fire — and they fire for
decisions made in the app as well as through the API, because they are recorded
inside the same transaction as the decision itself.
Read available_days from a balance rather than deriving one: it accounts for
accrual, and subtracting the raw columns over-reports every monthly-accrual
policy.
Policies and groups are read-only. Changing a policy retroactively changes what everyone is entitled to and what has already accrued, which belongs in the app.
2026-09 — Attendance & time
Eight resources covering the working day: attendance records, punches, regularisations, overtime requests, rest-day swaps, shift assignments, geofenced attendance sites, and a read-only attendance settings object.
attendance.recorded and attendance.updated webhooks now fire.
Worth reading if you record punches: a punch that changes no attendance record
answers 409, not 201. The punch is still written to the log — the status
tells you whether the day moved. See
the attendance reference.
2026-09 — Outbound webhooks
Signed, retried webhook delivery with per-endpoint secrets, rotation with a 24-hour overlap, a delivery log and manual replay. See Webhooks.
2026-09 — Developer console
Self-service API keys and webhook endpoints in the app, under Settings, with per-key usage.
2026-09 — Core HR and organisation
Employees, departments, designations, branches, employment types, pay grades,
shifts and holidays. employee.created, employee.updated and
employee.deleted webhooks.
2026-09 — The API opens
Scoped API keys, cursor pagination, idempotent writes,
application/problem+json errors, per-plan rate limits, and a generated
OpenAPI document at
/api/v1/openapi.json.
Coming next
The read surface is complete. Next is the private beta, and then the contract freezes at general availability.
Not yet covered, and each for its own reason: file upload and download, which needs a pre-signed-URL design rather than multipart on these endpoints; performance and scorecards, whose composite figures are computed with clamping and windowing that publishing the raw parts would invite clients to recompute wrongly; and onboarding and offboarding checklists, which are internal task lists rather than data anyone integrates against. Say so if you need one of them and it moves up.