The admin console
Open/admin in a browser. In a local development deployment you will see a Get a development token button — enter any email address from your directory to mint a token for that user. This button does not exist in production; the route POST /api/v1/dev/token returns 404 outside development mode.
From the console you can upload pay data, view and edit configuration, manage roles, and inspect the audit log — all within the permissions your own token carries.
Pay data
CSV upload
employee_email and annual_pay are required. currency defaults to the org’s base_currency. effective_date defaults to today. pay_basis accepts annual or hourly (and common synonyms); it defaults to annual.
Upload is all-or-nothing. Any bad row means nothing is written. Every error is reported at once so you can fix them in one pass rather than one upload at a time.
- Dry run
- Live upload
- CLI
Validate the file without writing anything:The response shows how many rows would be created or updated, and lists every validation error.
(employee_email, effective_date). Re-uploading the same effective date corrects that version; a new effective date adds a new version and preserves history.
Manual pay entry
Viewing pay records
amount field is omitted and replaced with a masked display value.
To decrypt and view actual amounts:
Deleting a person’s pay data
Coverage report
stale is true when the newest effective date is older than pay_data_max_age_days (configurable, default 180 days).
Policy configuration
PATCH accepts any subset of the editable fields. All changes are audited with before-and-after values.
Example patch:
Role management
participant, organiser, team_lead, finance, and admin. Team lead assignments include a team_id to scope their report access:
role.grant and role.revoke actions.
Audit log
Directory and HRIS sync
GET /api/v1/admin/directory lists all persons currently in the org directory, including their display name, team, department, active status, and the timestamp of the last sync.
POST /api/v1/admin/sync/directory and POST /api/v1/admin/sync/hris trigger an immediate pull rather than waiting for the next scheduled run. Both return the number of records created, updated, and deactivated. Pass ?provider=<name> to sync/directory to target a single configured provider.
GET /api/v1/admin/sync-state returns the last-run and last-success timestamps for every adapter, plus a record count and the last error string if any — the backing data for the staleness reminder.
To check which adapters have credentials configured:
Audit-on-read guarantee
Every route that touches a pay figure —GET /api/v1/admin/pay?reveal=true, the export, any internal decryption path — writes its audit row in the same database transaction as the read. If the transaction does not commit, neither the read nor the audit row survives. A read that was not logged is a read that did not commit.