Workflows, Hiring & HRHR Checks, Limits & Data Objects
On this page0

Unfamiliar word? See Glossary: words used in these docs. Looking for the tasks in order? Begin at Start Here.

Reference

Included in: Org chart and the employee file: All plans. Time off, pay history, goals, reviews and surveys: Team and Advanced. Which Plan Includes What

HR Checks, Limits & Data Objects

The technical reference for the HR module: what the server checks on each action, record states, hard limits, scheduled jobs and the API objects. A person’s own record and a manager’s view of the people who report to them need no permission. The list of HR permissions is on the overview page, under Permissions. This page is part of the reference HR Records, Time Off & Reviews.

What This Page Is For

In plain words: the other HR pages say what people can do. This one says what the product itself enforces, so you can tell an action that is not allowed from one that has gone wrong. It answers four kinds of question:

  • Why was this refused? For each action, such as approving time off or adding a pay record, the page lists what is checked before it goes through: who is asking, whose record it is, and what state the record is in.
  • What happens next to this record? A request, a review or a job change moves through a fixed set of stages. The page lists the stages and what moves a record from one to the next.
  • How much is allowed? The product has fixed ceilings. For example, a stored document can be up to 10 MB and one person can hold up to 100 documents. The page lists each ceiling.
  • What runs without anyone pressing a button? Some work is done on a timer, such as the daily reminders about probation and contract dates. The page lists each of those jobs and how often it runs.

If you are here to do a task and not to look up a rule, the steps are in the guides: Open and maintain an employee file, Set up time off and Run a review cycle. The technical part below is written for a developer or an IT administrator and names the exact routes, permissions and fields.

If something here is not working as you expect, start with When something goes wrong.

The plain explanation is above. This part is for IT and developers: the exact settings, permission names, API addresses and data fields behind it. Closed: select the heading above to open it. While it is closed, your browser’s find-on-page (Ctrl+F or Cmd+F) does not search this part.

The Check Behind Each Action

Each row is one thing a person does on screen and what the server checks when it happens. “Signed in” means the route asks for no permission: the service then checks that the record is the caller’s own, or belongs to someone below them in the reporting line, and answers 404 when it is neither, so the answer does not confirm that the record exists. Rows marked HR module also answer 403 when the hris entitlement is switched off on your licence. Paths are under /user-management; the request and reply of each is in the API reference.

ActionRouteWhat Is Checked
Open the People directory or any employee fileGET /employees, GET /employees/:userIdview_employee_records or manage_employee_records
Edit a file, emergency contacts, a job change, the leaving recordPUT /employees/:userId, PUT …/emergency-contacts, POST and DELETE …/job-changes, PUT …/departuremanage_employee_records
Reveal a date of birth or home addressPOST /employees/:userId/revealview_employee_records or manage_employee_records; each reveal is written to the audit log
Read or change HR Settings and retentionGET /employees/hr-settings; PUT /employees/hr-settings, PUT …/retentionRead: view_employee_records or manage_employee_records. Change: manage_employee_records
Read your own file and change your own detailsGET and PUT /employees/me, PUT /employees/me/emergency-contactsSigned in
Read your team, or one person in itGET /employees/my-team, GET /employees/my-team/:userIdSigned in; the person must be below you in the reporting line (404 otherwise)
See pay history, reveal an amountGET /employees/:userId/compensation, POST …/compensation/:recordId/revealview_compensation or manage_compensation. HR module
Add or void a pay recordPOST /employees/:userId/compensation, POST …/compensation/:recordId/voidmanage_compensation. HR module
Read or download a person's documentsGET /employees/:userId/documents, GET …/documents/:docId/downloadview_employee_records or manage_employee_records. HR module
Upload, change or remove a documentPOST /employees/:userId/documents, PUT …/documents/:docId/content, PUT and DELETE …/documents/:docIdmanage_employee_records. HR module
Read documents shared with you, or with you as a managerGET /employees/me/documents, GET /employees/my-team/:userId/documentsSigned in; only entries whose visibility includes you. HR module
People ReportsGET /employees/reports/summaryview_employee_reports. HR module
Payroll hand-offGET /employees/payroll-export, GET /employees/payroll-export/lastexport_compensation. HR module
Request, preview or cancel your own time offGET /leave/me, GET /leave/preview, POST /leave/requests, POST /leave/requests/:id/cancelSigned in. Someone else's request can be cancelled only with manage_leave or as an administrator. HR module
Approve or decline time offGET /leave/approvals, POST /leave/requests/:id/decide, POST /leave/approvals/approve, POST /leave/approvals/declineSigned in; the decider must be above the requester in the reporting line, an administrator, or hold manage_leave, and nobody decides their own. HR module
Who is outGET /leave/calendarSigned in. HR module
Types of time off, working calendars, balance adjustmentsGET /leave/setup; POST, PUT and DELETE /leave/types and /leave/calendars; POST /leave/people/:userId/adjustmanage_leave. HR module
Read one person's balances and requestsGET /leave/people/:userIdmanage_leave, view_employee_records or manage_employee_records. HR module
Read or change goalsGET /goals/mine, GET /goals/people/:userId, POST /goals, PUT and DELETE /goals/:idSigned in; you may read and change your own goals and those of people below you. manage_employee_records also reads and changes anyone's; view_employee_records reads only. HR module
Write your self review, write a review as the reviewer, share itPUT /reviews/:reviewId/self, PUT /reviews/:reviewId/manager, POST /reviews/:reviewId/shareSigned in; the review must be yours to write (404 otherwise). HR module
Run review cycles: create, launch, close, progress, calibration, reassign, reopen, read a review/reviews/cycles and its sub-routes, PUT /reviews/:reviewId/reviewer, POST /reviews/:reviewId/reopen, GET /reviews/:reviewIdmanage_employee_reviews. HR module
Answer a surveyGET /surveys/mine, POST /surveys/:id/respondSigned in; you must have been invited (404 otherwise). HR module
Run surveys: create, open, close, duplicate, results, trendsGET and POST /surveys, PUT and DELETE /surveys/:id, POST /surveys/:id/open, /close and /duplicate, GET /surveys/:id/results, GET /surveys/trendsmanage_employee_surveys. HR module

States And Transitions

The HR records that move through fixed states, with the value the API returns for each and what moves a record from one to the next. A move that is not listed is refused.

RecordStatesWhat Moves It
Time-off request (status)pending → approved | declined | cancelled; approved → cancelledA request for a type with approval switched off starts as approved. A decision is accepted only while the request is pending (409 afterwards). The requester can cancel a pending request, or an approved one that has not started; manage_leave or an administrator can cancel any live request. Cancelling an approved request returns its days to the balance. declined and cancelled are final.
Job change (status)scheduled → applied | cancelledA change dated today or earlier is applied at once. A change dated in the future is stored as scheduled and applied by the hourly job on its day. Only a scheduled change can be cancelled; one that cannot be applied on its day is cancelled with the reason added to it.
Review (state)with_person → with_reviewer → ready_to_share → sharedThe person submitting their self review moves it to with_reviewer; the reviewer submitting moves it to ready_to_share; sharing moves it to shared. In a cycle that uses calibration, sharing is refused until HR has released the ratings. HR can reopen either half, which moves the review back to that step.
Review cycle (status)draft → open → closedLaunch opens a draft; launching an open cycle again adds people who are now in scope. Only an open cycle can be closed, only a draft can be deleted, and a closed cycle cannot be changed or launched again.
Survey (status)draft → open → closedOnly a draft can be opened or deleted, only an open survey can be closed, and a closed survey cannot be changed. Run again makes a new draft; it does not reopen the old survey.
Compensation recordlive → voidedOnly a record a person typed in can be voided, once, with a reason. A void cannot be undone, and a record is never edited or deleted.

Limits

The hard limits the server enforces. A request beyond one is answered with 400 and the reason in words, unless the row says otherwise.

WhatLimit
People directory pagelimit 1 to 200 (default 50); a search uses the first 8 words typed
Job history on a fileThe newest 200 changes (the newest 100 on your own file and on a team member's)
Emergency contacts5 per person; a phone number up to 40 characters
Free-text fields on a file255 characters; home address 1,000; the reason on a job change 1,000
Documents100 per person; 10 MB each; PDF, PNG, JPEG, Word (.docx) or Excel (.xlsx), decided from the file's own bytes (413 over the size, 415 for another type); a name up to 180 characters
Time off by the hourA whole number of minutes, at least 15, starting and ending on the same day
One time-off requestA span of at most 366 days; a note up to 500 characters; a weekly repeat of 2 to 12 weeks; at most 20 bookings by the hour replaced by one request
Bulk approve or decline1 to 50 requests in one call
Time-off listsYour requests: the newest 100 by start date. Requests waiting for your decision: the 200 with the earliest start date. Who is out: a range of at most 366 days
Type of time offA name up to 60 characters, unique without regard to case; days per year and carry-over limit 0 to 366
Balance adjustmentNot zero, and at most 366 days either way; a reason is required
Goals50 per person; 30 example goals
Review cycle12 questions; an answer up to 4,000 characters; 8 colleagues asked for feedback per review
Survey20 questions; a written answer up to 1,000 characters; an audience of at least 5 people; results need at least 5 responses
Payroll hand-offA period of at most 366 days
Retention for people who have left0 (off), or a whole number of months from 6 to 240

Scheduled Jobs

Four jobs run inside your instance without anyone starting them. Each also runs once a few minutes after the service starts, and each can be run again safely: a reminder already sent, a change already applied or an allowance already credited is not repeated.

JobRunsWhat It Does
Scheduled job changesEvery hourApplies each scheduled job change whose effective date has arrived, oldest first, up to 500 in one run. The person's title, department, manager, level, employment type or location changes at that moment.
Time-off accrualOnce a dayCredits the time off each person has earned under their types of time off, and at the turn of the year removes what is above a type's carry-over limit. Correcting a person's start date credits that person at once, without waiting for the run.
Date remindersOnce a dayNotifies the holders of manage_employee_records, and for probation and contract dates the person's manager too. Probation end: 14 days before and on the day. Contract end: 30 days, 7 days and on the day. Right to work: 60 days, 14 days and on the day. A document with an expiry date: 30 days before and on the day, on plans with the HR module. A reminder missed by up to 7 days is still sent; the person the date belongs to is never the one notified.
Retention for people who have leftOnce a dayDoes nothing unless a retention period is set in HR Settings. For a person whose account is in a left state and whose last day is further back than the period, it removes their HR profile, pay records, emergency contacts, time-off requests and balance entries, documents, goals, reviews and the feedback about them, training assignments and completions, learning-path memberships and survey invitations. Each removal is written to the audit log at warning level. The removal is permanent.

Data Objects (Typed Fields)

In plain words: a call to the API answers with objects such as an employee file, a compensation record or a time-off request. This section lists what is inside each one: every field, its type, and whether it can be empty. Open an object to see its fields. In the API reference, a capitalised name in a row’s returns line is one of these objects. The training, learning-path and phishing objects are on the page Training, Phishing & Policy Signing.

  • Types. integer, number, string, boolean, object and arrays written as integer[]. string (date-time) is ISO 8601 in UTC; string (date) is YYYY-MM-DD. A type followed by a colon and values separated by | takes only those values. A capitalised type is another object in this list.
  • The third column. “nullable” means the field can be null; “optional” means the key can be missing; “no” means neither. Do not fail on a field you do not recognise: a reply can carry fields beyond these. A card marked “request body” is what you send, not what comes back: its third column is headed Required, where “required” means the field must be sent and every other field is optional.
  • Not part of EmployeeListItem, EmployeeFile or CompensationRecord: a date of birth, a home address and a pay amount. Someone else’s is read one at a time through its reveal route, and each reveal is written to the audit log. Two routes do carry them: your own file (GET /employees/me) holds your own date of birth and home address, and the payroll hand-off (GET /employees/payroll-export, permission export_compensation) holds the pay amounts of the period.
EmployeeListItemin a reply18 fields

One row of GET /user-management/employees.

FieldTypeNull / optional / read-onlyNote
idintegerno
firstNamestringnullable
lastNamestringnullable
emailstringno
namestringnoFirst and last name joined; the email address when both are empty.
positionstringnullableJob title.
departmentstringnullable
managerIdintegernullable
managerNamestringnullable
statusstringnullableThe account status, for example active.
employeeIdstringnullableYour own employee number, not the Zonitix id.
photoUrlstringnullable
terminationDatestring (date-time)nullable
hireDatestring (date)nullable
employmentTypestringnullable
workLocationstringnullable
levelstringnullable
remindersEmployeeReminder[]noEmpty for a person who has left.
EmployeeReminderin a reply5 fields

An upcoming date on a file. Worked out on each read, not stored.

FieldTypeNull / optional / read-onlyNote
kindstring: probation | contract | right_to_workno
labelstringno"Probation ends", "Contract ends" or "Right to work expires".
datestring (date)no
daysintegernoDays from today; negative once the date has passed.
overduebooleannotrue when days is below 0.
EmployeeFilein a reply7 fields

GET /user-management/employees/:userId, and the reply of every write on a file.

FieldTypeNull / optional / read-onlyNote
userEmployeeFileUserno
profileEmployeeProfileno
emergencyContactsEmergencyContact[]noIn the stored order.
historyEmploymentEvent[]noThe newest 200 job changes, newest effective date first.
remindersEmployeeReminder[]no
authorityHrAuthoritynoWhich system owns each governed field.
peopleobjectno{ "<user id>": name } for the managers named in history.
EmployeeFileUserin a reply18 fields

The identity half of an employee file.

FieldTypeNull / optional / read-onlyNote
idintegerno
firstNamestringnullable
lastNamestringnullable
emailstringno
namestringno
positionstringnullable
departmentstringnullable
managerIdintegernullable
managerNamestringnullable
statusstringnullable
employeeIdstringnullable
phoneNumberstringnullable
personalEmailstringnullable
photoUrlstringnullable
terminationDatestring (date-time)nullable
personaIdintegernullable
sourcestringnullableWhere the account came from, for example local.
createdAtstring (date-time)no
EmployeeProfilein a reply18 fields

The HR half of an employee file. Every field is null until it is set.

FieldTypeNull / optional / read-onlyNote
preferredNamestringnullable
legalNamestringnullable
nationalitystringnullable
hireDatestring (date)nullable
originalHireDatestring (date)nullable
employmentTypestringnullable
workLocationstringnullable
levelstringnullable
costCenterstringnullable
legalEntitystringnullable
probationEndDatestring (date)nullable
contractEndDatestring (date)nullable
noticePeriodstringnullableFree text, up to 255 characters.
rightToWorkStatusstring: verified | pending | expired | not_requirednullable
rightToWorkVerifiedAtstring (date)nullable
rightToWorkExpiresAtstring (date)nullable
hasDateOfBirthbooleannoThe date itself is never in a file; reveal it with POST /reveal.
hasHomeAddressbooleannoThe address itself is never in a file; reveal it with POST /reveal.
EmergencyContactin a reply4 fields
FieldTypeNull / optional / read-onlyNote
idintegerno
namestringnullablenull only when the stored value cannot be read.
relationshipstringnullable
phonestringnullable
EmploymentEventin a reply13 fields

One job change in a file's history.

FieldTypeNull / optional / read-onlyNote
idintegerno
userIdintegerno
typestringnopromotion | transfer | manager_change | title_change | other for a change a person recorded.
effectiveDatestring (date)no
statusstring: applied | scheduled | cancellednoscheduled until its effective date arrives.
changesobjectno{ "<field>": { from, to } } for each field that changed.
reasonstringnullable
sourcestringnomanual for a change a person recorded.
sourceRefstringnullable
actorEmailstringnullable
appliedAtstring (date-time)nullable
createdAtstring (date-time)no
updatedAtstring (date-time)no
HrAuthorityin a reply7 fields

Which system owns people data. Also the base of GET /employees/hr-settings.

FieldTypeNull / optional / read-onlyNote
modestring: zonitix | externalno
providerIdintegernullableThe connected HR system, when mode is external.
providerNamestringnullable
providerMissingbooleannotrue when mode is external and that connection no longer exists.
fieldsobjectno{ "<field key>": "zonitix" | "external" }: the owner of each governed field.
overridesobjectnoThe per-field choices as saved.
lastSyncobjectnullableWhat the last sync from the HR system recorded.
CompensationRecordin a reply13 fields

The amount is never part of this object: reveal one with POST /compensation/:recordId/reveal.

FieldTypeNull / optional / read-onlyNote
idintegerno
effectiveDatestring (date)no
currencystringnoA 3-letter code.
payPeriodstring: annual | monthly | hourlyno
bonusPctnumbernullable
reasonstringnullable
sourcestringnomanual for a record a person typed in.
sourceOfferIdintegernullableThe signed offer the record was carried over from.
actorEmailstringnullable
createdAtstring (date-time)no
voidedAtstring (date-time)nullable
voidedBystringnullable
voidReasonstringnullable
EmployeeDocumentin a reply9 fields

The entry for a stored file. The file itself is fetched from the download route.

FieldTypeNull / optional / read-onlyNote
idintegerno
namestringnoUp to 180 characters.
categorystring: contract | offer | job_change | policy | certificate | review | letter | otherno
visibilitystring: hr | employee | managerno
mimeTypestringnullablenull until the file has been uploaded.
sizeBytesintegerno0 until the file has been uploaded.
expiresAtstring (date)nullable
uploadedBystringnullableThe email address of the person who created the entry.
createdAtstring (date-time)no
DepartureRecordin a reply9 fields

The leaving record on a file.

FieldTypeNull / optional / read-onlyNote
idintegerno
lastDaystring (date)no
departureTypestring: voluntary | involuntary | end_of_contractnullable
reasonCodestringnullableOne of the keys in the reply's reasons list.
rehireEligiblebooleannullable
checklistobject[]noEach { key:string, label:string, done:boolean, doneBy:string|null, doneAt:string (date-time)|null }.
sourcestringno
recordedBystringnullable
createdAtstring (date-time)no
LeaveBalancein a reply16 fields

One per type of time off.

FieldTypeNull / optional / read-onlyNote
typeIdintegerno
namestringno
paidbooleanno
tracksBalancebooleanno
requiresApprovalbooleanno
annualDaysnumberno
allowNegativebooleanno
isActivebooleanno
allowHoursbooleanno
minPartMinutesintegernoThe smallest booking by the hour.
maxPartMinutesintegernullableThe most per booking by the hour.
balancenumbernullablenull for a type that does not track a balance.
pendingnumbernoDays in requests still waiting for a decision.
availablenumbernullablebalance minus pending, to two places; null without a balance.
availableExactnumbernullableThe same figure before rounding.
takennumbernoApproved days that start in the current calendar year.
LeaveRequestin a reply17 fields
FieldTypeNull / optional / read-onlyNote
idintegerno
userIdintegerno
leaveTypeIdintegerno
typeNamestringnullableNot sent in the reply to a cancel.
startDatestring (date)no
endDatestring (date)no
startHalfbooleanno
endHalfbooleanno
startTimestring (HH:MM)nullableSet only for time off by the hour.
minutesintegernullableSet only for time off by the hour.
daysnumbernoWorking days the request uses.
statusstring: pending | approved | declined | cancelledno
notestringnullableUp to 500 characters.
decidedByEmailstringnullable
decidedAtstring (date-time)nullable
decisionNotestringnullable
createdAtstring (date-time)no
LeaveTypein a reply15 fields
FieldTypeNull / optional / read-onlyNote
idintegerno
namestringnoUp to 60 characters; unique without regard to case.
paidbooleanno
requiresApprovalbooleanno
tracksBalancebooleanno
annualDaysnumberno0 to 366.
accrualstring: upfront | monthlyno
accrueFromstring (date)nullable
carryOverMaxDaysnumberno0 to 366.
allowNegativebooleanno
allowHoursbooleanno
minPartMinutesintegerno
maxPartMinutesintegernullable
isActivebooleannofalse for a retired type.
sortOrderintegerno
WorkingCalendarin a reply8 fields
FieldTypeNull / optional / read-onlyNote
idintegerno
namestringno
locationstringnullable
workDaysinteger[]noThe working days of the week.
hoursPerDaynumberno
dayStartstring (HH:MM)no
isDefaultbooleanno
holidaysobject[]noEach { date:string (date), name:string }, earliest first.
Goalin a reply13 fields
FieldTypeNull / optional / read-onlyNote
idintegerno
userIdintegerno
titlestringno
descriptionstringnullable
periodstringnullable
dueDatestring (date)nullable
statusstring: on_track | at_risk | done | droppedno
progressintegerno
weightintegernullable
createdByEmailstringnullable
completedAtstring (date-time)nullable
createdAtstring (date-time)no
updatedAtstring (date-time)no
GoalTemplatein a reply5 fields

An example goal.

FieldTypeNull / optional / read-onlyNote
idintegerno
titlestringno
descriptionstringnullableUp to 2,000 characters.
isActivebooleanno
sortOrderintegerno
ReviewCyclein a reply16 fields
FieldTypeNull / optional / read-onlyNote
idintegerno
namestringno
periodLabelstringnullable
selfDueDatestring (date)nullable
managerDueDatestring (date)nullable
questionsobject[]noEach { key:string, label:string, help:string|null }; at most 12.
includeRatingbooleanno
departmentstringnullablenull when the cycle covers everyone.
peerFeedbackstringnoThe colleague-feedback mode of the cycle.
calibrationbooleanno
ratingsReleasedbooleanno
ratingTargetsobjectnullablenull when the cycle does not use calibration.
goalRatingsbooleanno
statusstringnodraft, open or closed.
launchedAtstring (date-time)nullable
closedAtstring (date-time)nullable
Surveyin a reply10 fields
FieldTypeNull / optional / read-onlyNote
idintegerno
titlestringno
introstringnullable
questionsobject[]noEach { key:string, label:string, type: scale | enps | text }; at most 20.
departmentstringnullablenull when everyone is asked.
statusstringnodraft, open or closed.
closesAtstring (date)nullable
openedAtstring (date-time)nullable
closedAtstring (date-time)nullable
expiredbooleannotrue once the closing date has passed.
EmployeeProfileUpdaterequest body15 fields

Only the keys you send are changed. Job title, department, manager, level, employment type and work location are not read here: they change through a job change.

FieldTypeRequiredNote
preferredNamestringoptional, null clears it
legalNamestringoptional, null clears it
nationalitystringoptional, null clears it
costCenterstringoptional, null clears it
legalEntitystringoptional, null clears it
noticePeriodstringoptional, null clears it
rightToWorkStatusstring: verified | pending | expired | not_requiredoptional, null clears itAny other value answers 400.
hireDatestring (date)optional, null clears itA real calendar date, or the answer is 400. The same for every date below.
originalHireDatestring (date)optional, null clears it
probationEndDatestring (date)optional, null clears it
contractEndDatestring (date)optional, null clears it
rightToWorkVerifiedAtstring (date)optional, null clears it
rightToWorkExpiresAtstring (date)optional, null clears it
dateOfBirthstring (date)optional, null clears itStored encrypted.
homeAddressstringoptional, null clears itAt most 1000 characters. Stored encrypted.
EmergencyContactInputrequest body3 fields

One entry of { contacts: [...] }. A call replaces the whole list: at most 5, kept in the order sent.

FieldTypeRequiredNote
namestringrequired
relationshipstringoptional
phonestringoptionalAt most 40 characters.
JobChangeCreaterequest body4 fields
FieldTypeRequiredNote
typestring: promotion | transfer | manager_change | title_change | otherrequired
effectiveDatestring (date)optionalDefault today. A later date stores the change as scheduled; it is applied on that day.
changesobjectrequiredAt least one of position, department, level, employmentType, workLocation (strings; null clears) and managerId (a user id; null removes the manager).
reasonstringoptionalAt most 1000 characters.
MyDetailsUpdaterequest body4 fields

What a person may change on their own file. At least one key is needed, or the answer is 400.

FieldTypeRequiredNote
phoneNumberstringoptional, null clears itAt most 40 characters.
personalEmailstring (email)optional, null clears itMust be an email address and must differ from the work email.
preferredNamestringoptional, null clears it
homeAddressstringoptional, null clears itAt most 1000 characters. Stored encrypted.
CompensationCreaterequest body6 fields
FieldTypeRequiredNote
amountnumberrequiredGreater than 0 and at most 10000000000.
currencystringrequiredThree letters; upper-cased.
effectiveDatestring (date)optionalDefault today.
payPeriodstring: annual | monthly | hourlyoptionalDefault annual.
bonusPctnumberoptional0 to 999.
reasonstringoptional
EmployeeDocumentWriterequest body4 fields

The entry a file is then uploaded to. An update (PUT on the document) takes the same keys and changes only those sent.

FieldTypeRequiredNote
namestringrequired on createCharacters that cannot be in a file name become spaces; cut to 180 characters.
categorystring: contract | offer | job_change | policy | certificate | review | letter | otheroptionalDefault other.
visibilitystring: hr | employee | manageroptionalDefault hr. employee means HR and the person; manager means HR, the person and their manager.
expiresAtstring (date)optional, null clears it
LeaveRequestCreaterequest body10 fields

Whole or half days over a range, or hours on one day when minutes is sent.

FieldTypeRequiredNote
leaveTypeIdintegerrequiredA type that is in use.
startDatestring (date)required
endDatestring (date)optionalDefault startDate. Not before startDate and at most 366 days after it. With minutes it must be the same day.
startHalfbooleanoptionalThe first day is a half day.
endHalfbooleanoptionalThe last day is a half day.
minutesintegeroptionalTime off by the hour: at least 15, and it must end on the day it starts.
startTimestringrequired with minutesHH:MM.
notestringoptionalAt most 500 characters.
repeatWeeksintegeroptional2 to 12: the same one-day request on that weekday for this many weeks. Weeks that hold no working day are reported in skipped.
replaceIdsinteger[]optionalAt most 20 of your own bookings by the hour that this whole-day request replaces.
LeaveDecisionrequest body2 fields
FieldTypeRequiredNote
decisionstring: approve | declinerequired
notestringrequired for declineAt most 500 characters. Shown to the person.
LeaveTypeWriterequest body14 fields

Create and update take the same keys, and an update sets every one of them: a key left out takes its default.

FieldTypeRequiredNote
namestringrequiredAt most 60 characters.
tracksBalancebooleanoptionalDefault true. When false, annualDays and carryOverMaxDays are stored as 0.
annualDaysnumberoptional0 to 366. Default 0.
accrualstring: upfront | monthlyoptionalDefault upfront; any other value is stored as upfront.
carryOverMaxDaysnumberoptional0 to 366. Default 0.
paidbooleanoptionalDefault true.
requiresApprovalbooleanoptionalDefault true.
allowHoursbooleanoptionalDefault true.
allowNegativebooleanoptionalDefault false.
minPartMinutesintegeroptional, null clears itThe smallest amount by the hour: 15 to 1440.
maxPartMinutesintegeroptional, null clears itThe most by the hour in one request: 15 to 1440, not less than minPartMinutes.
isActivebooleanoptionalDefault true.
sortOrderintegeroptionalDefault 0.
accrueFromstring (date)optionalCreate only: the day balances start to build from. Kept between 1 January of this year and today; default 1 January.
HolidayCalendarWriterequest body7 fields

Create and update take the same keys. The holidays sent replace the stored list.

FieldTypeRequiredNote
namestringrequired
locationstringoptional, null clears itThe work location this calendar applies to.
workDaysinteger[]optionalDays of the week as 0 (Sunday) to 6 (Saturday). Default 1 to 5.
holidaysobject[]optionalEach { date:string (YYYY-MM-DD), name:string }, both required. At most 400, and no date twice.
hoursPerDaynumberoptional1 to 24.
dayStartstringoptionalHH:MM.
isDefaultbooleanoptionaltrue makes this the default calendar. The only calendar is always the default.
LeaveBalanceAdjustrequest body3 fields
FieldTypeRequiredNote
leaveTypeIdintegerrequiredA type that tracks a balance.
daysnumberrequiredNot 0, between -366 and 366; a negative number removes days.
notestringrequiredWhy the balance is changed.
GoalWriterequest body8 fields

Create and update take the same keys; an update changes only the keys you send. A person can have at most 50 goals.

FieldTypeRequiredNote
titlestringrequired on create
userIdintegeroptionalCreate only: whose goal it is. Default yourself.
descriptionstringoptional, null clears itAt most 2000 characters.
periodstringoptional, null clears itAt most 40 characters.
dueDatestring (date)optional, null clears it
statusstring: on_track | at_risk | done | droppedoptionaldone sets progress to 100.
progressintegeroptional0 to 100. 100 with no status sets status to done.
weightintegeroptional, null clears it0 to 100.
ReviewCycleWriterequest body10 fields

Create and update take the same keys. The questions, department, rating and feedback options can be changed only while the cycle is a draft; a closed cycle cannot be changed.

FieldTypeRequiredNote
namestringrequired
periodLabelstringoptional, null clears itAt most 60 characters.
selfDueDatestring (date)optional, null clears it
managerDueDatestring (date)optional, null clears itNot before selfDueDate.
departmentstringoptional, null clears itLimits the cycle to one department.
questionsobject[]optional1 to 12, each { label:string (required), key?:string, help?:string (at most 300 characters) }. The default questions when left out.
includeRatingbooleanoptionalDefault true.
calibrationbooleanoptionalDefault false. Takes effect only with includeRating.
goalRatingsbooleanoptionalDefault false.
peerFeedbackstring: off | reviewer | personoptionalDefault off. Any other value answers 400.
SurveyWriterequest body5 fields

Create and update take the same keys. The questions and the department can be changed only while the survey is a draft; a closed survey cannot be changed.

FieldTypeRequiredNote
titlestringrequired
introstringoptional, null clears itAt most 2000 characters.
departmentstringoptional, null clears itLimits the survey to one department.
closesAtstring (date)optional, null clears itNot in the past.
questionsobject[]optional1 to 20, each { label:string (required, at most 300 characters), type: scale | enps | text (required), key?:string }. The default questions when left out.
SensitiveFieldRevealrequest body1 field
FieldTypeRequiredNote
fieldstring: dateOfBirth | homeAddressrequiredAny other value is refused with 400.
HrAuthorityWriterequest body3 fields

Which system holds the people data: this instance, or a connected HR system.

FieldTypeRequiredNote
modestring: zonitix | externalrequiredAny other value is refused with 400.
providerIdintegerrequired for externalA connected HR system; any other id is refused with 400. Not read for zonitix.
fieldsobjectoptionalPer field: the field key, and zonitix or external as its value.
HrRetentionWriterequest body1 field
FieldTypeRequiredNote
monthsintegerrequired0 switches retention off; otherwise a whole number from 6 to 240. Anything else is refused with 400.
CompensationVoidrequest body1 field
FieldTypeRequiredNote
reasonstringrequiredCut to 255 characters; blank is refused with 400.
LeaveApproveManyrequest body1 field
FieldTypeRequiredNote
idsinteger[]required1 to 50 request ids. An id sent twice is handled once.
LeaveDeclineItemrequest body2 fields
FieldTypeRequiredNote
idintegerrequiredA request id.
notestringrequiredThe reason the person reads; cut to 500 characters.
LeaveDeclineManyrequest body1 field
FieldTypeRequiredNote
itemsLeaveDeclineItem[]required1 to 50 items. When any item has no note, the whole call is refused with 400 and nothing is declined.
FeedbackRequestrequest body1 field
FieldTypeRequiredNote
userIdsinteger[]requiredActive colleagues; not the person reviewed and not the reviewer.
ReviewerReassignrequest body1 field
FieldTypeRequiredNote
reviewerIdintegerrequiredAn active person other than the person reviewed.

Related reference