Public API

API Roles & Scopes

How scopes limit what a token can reach, how reusable API roles and the built-in templates work, and the full scope catalogue with the minimum owner role for each scope.

A token's access is the overlap of three things, worked out again on every request:

  1. The scopes it was granted, either through an API role or as a custom list.
  2. The ceiling of its owner's current role. Each scope has a minimum owner role; scopes above the owner's role are ignored.
  3. The scopes that have endpoints today. A scope only takes effect once at least one endpoint uses it.

Inside a scope, the data returned is always limited to what the owner can see in the app. A scope opens an area of the API; it never widens the owner's own visibility.

GET /token returns the resulting effective scopes, so an integration can check what it may do before it starts.

Scope naming

  • Scopes are written resource:action, for example leaves:read or leaves:approve.
  • A . marks a more sensitive tier of a resource's fields, for example users.personal:read on top of users:read.
  • A write scope also satisfies the matching read scope for the same resource and tier. leaves:write lets a token call endpoints that need leaves:read; it does not satisfy leaves:approve, and users:write does not satisfy users.personal:read.

When a token calls an endpoint without the scope it needs, the response is 403 SCOPE_MISSING, and the message names the scope that endpoint requires. Each operation in the API Reference lists its required scope.

API roles

An API role is a named, reusable set of scopes, such as "Payroll export" or "Leave dashboard". Administrators and Executives manage them on the API roles tab under Settings > API.

  • A token created from a role follows it. Editing the role changes every token that uses it, from the next request.
  • Archiving a role makes every token that follows it grant nothing until the role is restored. Roles are never deleted.
  • A role can only contain scopes the person creating or editing it may hold. An Administrator cannot define a role with Executive-only scopes.
  • A token can only follow a role whose scopes are all within its owner's role ceiling.

A token can instead have a custom scope list, which is fixed to that token.

Built-in templates

Templates are starting points for a new API role or a custom token. When applied, a template keeps only the scopes that have endpoints today and that the owner's role may hold.

TemplateScopes
Read-only directoryorganization:read, users:read, departments:read, teams:read
Leave syncorganization:read, users:read, leave_types:read, leaves:read, leave_balances:read, holidays:read
Leave managementEverything in Leave sync, plus leaves:write and leaves:approve
Time and payroll exportorganization:read, users:read, users.employment:read, time_entries:read, timesheets:read, projects:read
HRIS syncEvery read scope except compensation:read, users.govid:read and webhooks:read
HRIS sync includes sensitive read scopes, such as users.personal:read, time_entries.location:read, documents.content:read and benefits:read, when its owner's role allows them. Review the list before saving, and remove anything the receiving system does not need.

Scope catalogue

The minimum owner role is the lowest role whose tokens may hold the scope. The four roles, from lowest to highest, are Employee, Department Head, Administrator and Executive.

Scopes marked Sensitive read restricted personal, financial or file data and are flagged in the token console.

ScopeMinimum owner roleGrantsSensitive
organization:readEmployeeRead the organization profile
users:readEmployeeRead the employee directory
users.employment:readDepartment HeadRead employment details (dates, probation, payroll id)
users.personal:readAdministratorRead personal details (date of birth, home address, emergency contact)Yes
users.govid:readExecutiveRead government identifiersYes
users:writeAdministratorCreate and update employees
departments:readEmployeeRead departments
departments:writeAdministratorCreate and update departments
teams:readEmployeeRead teams
teams:writeAdministratorCreate and update teams
leave_types:readEmployeeRead leave types
leaves:readEmployeeRead leave requests
leaves:writeEmployeeCreate and cancel leave requests
leaves:approveDepartment HeadApprove and reject leave requests
leave_balances:readEmployeeRead leave balances
holidays:readEmployeeRead public holidays and locked dates
time_entries:readEmployeeRead time entries
time_entries:writeEmployeeCreate, update and delete time entries
time_entries.location:readAdministratorRead clock-in and clock-out locationsYes
time_entries:approveDepartment HeadApprove and reject time entries
timesheets:readEmployeeRead timesheets
projects:readEmployeeRead projects, tasks and clients
schedules:readEmployeeRead shift schedules
expenses:readEmployeeRead expense reports
expenses:approveDepartment HeadApprove and reject expense reports
documents:readEmployeeRead document metadata
documents.content:readAdministratorDownload document filesYes
training:readEmployeeRead training assignments
training:writeDepartment HeadAssign training
certifications:readEmployeeRead certifications
assets:readEmployeeRead assigned assets
assets:writeDepartment HeadAssign and update assets
benefits:readAdministratorRead benefit enrollmentsYes
compensation:readAdministratorRead compensation recordsYes
onboarding:readEmployeeRead onboarding progress
custom_fields:readEmployeeRead custom profile fields
goals:readEmployeeRead goals
webhooks:readAdministratorRead webhook endpoints, deliveries and the event catalogue
webhooks:writeAdministratorCreate, update, test and delete webhook endpoints

Every scope in the catalogue has at least one endpoint. Each operation in the API Reference names the scope it requires, and the OpenAPI document carries it as x-required-scope. Operations that return more fields with a field-tier scope, such as users.personal:read on GET /users, list those scopes in x-field-scopes.

Field tiers

A field-tier scope adds fields to responses the base scope already opens; it never opens an endpoint on its own.

Base scopeField-tier scopeAdds
users:readusers.employment:readEmployee and payroll ids, employment type, employment start and end dates, probation, offboarding date
users:readusers.personal:readDate of birth, gender, marital status, nationality, personal phone numbers and email, home address, emergency contact
users:readusers.govid:readTax id, citizenship certificate number, benefit id number
time_entries:readtime_entries.location:readClock-in and clock-out coordinates, addresses and accuracy, location confidence, whether the clock-in was outside the geofence
timesheets:readusers.employment:readPay figures, for Administrator and Executive owners only

Reads that return users.personal:read, users.govid:read, compensation:read or documents.content:read data are written to the organization's sensitive-data access log, one entry per record, with the token that read them.

Rules beyond the scope

A scope is necessary but not always enough: the owner must also be allowed to do the same thing in the app. The cases that most often surprise integrators:

EndpointRule
GET /clientsDepartment Heads and above. An Employee's token gets 403 FORBIDDEN even with projects:read.
GET /users/{id}/custom-fieldsThe owner's own values, or anyone's for an Administrator or Executive. Other people answer 404.
Approving or rejecting leave, time entries and expense reportsNobody decides their own request through the API, whatever their role (403 FORBIDDEN). A Department Head decides only inside their own and managed departments. A record the owner cannot see answers 404; a leave request they can see but may not decide answers 403 FORBIDDEN before anything is revealed about its state.
POST /leaves for someone elseAdministrators and Executives, or the person's Department Head.
PATCH /users/{id}Only an Executive edits or promotes to Executive, and nobody changes their own role.
Webhook endpointsOwners must be Administrators or Executives, whatever Who may create tokens allows.

The guides describe the visibility rules for each area.

Choosing scopes

  • Start from the narrowest template that fits, then remove anything unused.
  • Use separate tokens for separate integrations rather than one token with every scope.
  • Prefer read scopes for reporting and sync jobs. Grant write or approve only to integrations that genuinely act on behalf of their owner.
  • Give sensitive scopes only to tokens owned by someone whose job already involves that data, and pair them with an IP allowlist.