Scheduling API
23 endpoints, generated from packages/core/openapi/v1.snapshot.json (OpenAPI 3.1.0, contract version 1.0). Conventions for lists, errors, money and authentication are on the API conventions page.
GET/api/v1/scheduling/me
My published shifts (default: the next 14 days), open shifts I may pick up, and my swaps
Parameters
| Name | In | Type | Required |
|---|---|---|---|
from | query | string | no |
to | query | string | no |
Responses
200 Success. object
employeeIdstring (uuid) or nullrequiredfromstringrequiredtostringrequiredshiftsarray of objectrequiredidstring (uuid)requiredrosterIdstring (uuid)requiredscopeLabelstringrequireddatestringrequiredkindenumrequiredone of "shift", "rest"
startstring | nullrequiredendstring | nullrequiredbreakMinutesnumberrequiredpaidMinutesnumberrequiredtemplateCodestring | nullrequiredcolourenumrequiredone of "plain", "kuning", "biru", "oren", "ink"
notestring | nullrequiredpendingSwapbooleanrequired
weeksarray of objectrequiredweekStartstringrequiredpublishedbooleanrequired
openShiftsarray of objectrequiredidstring (uuid)requiredrosterIdstring (uuid)requiredscopeLabelstringrequireddatestringrequiredkindenumrequiredone of "shift", "rest"
startstring | nullrequiredendstring | nullrequiredbreakMinutesnumberrequiredpaidMinutesnumberrequiredtemplateCodestring | nullrequiredcolourenumrequiredone of "plain", "kuning", "biru", "oren", "ink"
notestring | nullrequiredpendingSwapbooleanrequired
swapsarray of objectrequiredidstring (uuid)requiredkindenumrequiredone of "swap", "giveaway", "pickup"
statusenumrequiredone of "pending_peer", "pending_approval", "approved", "rejected", "declined", "cancelled", "expired"
directionenumrequiredone of "outgoing", "incoming", "other"
requesterobjectrequiredidstring (uuid)requirednamestringrequired
peerobject or nullrequiredidstring (uuid)requirednamestringrequired
shiftobjectrequiredidstring (uuid)requireddatestringrequiredtimestringrequired
peerShiftobject or nullrequiredidstring (uuid)requireddatestringrequiredtimestringrequired
notestring | nullrequiredreasonstring | nullrequiredapprovalRequestIdstring (uuid) or nullrequiredcreatedAtstringrequiredexpiresAtstringrequired
- 400
validation_failed - 401
session_expired,session_revoked,unauthenticated - 403
mfa_enrolment_required
GET/api/v1/scheduling/rosters
A roster week by scope: the working copy with conflicts for editors, the published copy for staff
Parameters
| Name | In | Type | Required |
|---|---|---|---|
weekStart | query | string | yes |
locationId | query | string (uuid) | no |
departmentId | query | string (uuid) | no |
Responses
200 Success. object
rosterobjectrequiredidstring (uuid) or nullrequiredweekStartstringrequiredlocationIdstring (uuid) or nullrequireddepartmentIdstring (uuid) or nullrequiredscopeLabelstringrequiredstatusenumrequiredone of "none", "draft", "published"
versionnumberrequiredhasChangesbooleanrequiredpublishedAtstring | nullrequired
modeenumrequiredone of "edit", "published"
canEditbooleanrequireddaysarray of objectrequireddatestringrequiredholidaystring | nullrequiredminutesnumberrequired
employeesarray of objectrequiredidstring (uuid)requirednamestringrequiredemployeeNumberstringrequiredscheduleenum or nullrequiredone of "fixed", "shift"
editablebooleanrequiredminutesnumberrequiredrestDayAssumedstring | nullrequiredwarningsarray of objectrequiredkindenumrequiredone of "overlap", "on_leave", "outside_employment", "pending_leave", "public_holiday", "rest_day", "daily_hours", "overtime", "weekly_hours", "no_rest_day", "ot_cap"
severityenumrequiredone of "block", "ack", "warning", "hint"
labelstringrequiredmessagestringrequiredsourcestring | nullrequired
shiftsarray of objectrequiredidstring (uuid)requiredemployeeIdstring (uuid) or nullrequiredkindenumrequiredone of "shift", "rest"
datestringrequiredstartsAtstring | nullrequiredendsAtstring | nullrequiredstartstring | nullrequiredendstring | nullrequiredbreakMinutesnumberrequiredpaidMinutesnumberrequiredtemplateIdstring (uuid) or nullrequiredtemplateCodestring | nullrequiredcolourenumrequiredone of "plain", "kuning", "biru", "oren", "ink"
notestring | nullrequiredupdatedAtstringrequiredconflictsarray of objectrequiredkindenumrequiredone of "overlap", "on_leave", "outside_employment", "pending_leave", "public_holiday", "rest_day", "daily_hours", "overtime", "weekly_hours", "no_rest_day", "ot_cap"
severityenumrequiredone of "block", "ack", "warning", "hint"
labelstringrequiredmessagestringrequiredsourcestring | nullrequired
pendingSwapbooleanrequired
toAcknowledgearray of objectrequiredshiftIdstring (uuid)requiredkindstringrequiredemployeeNamestringrequireddatestringrequiredmessagestringrequired
- 400
validation_failed - 401
session_expired,session_revoked,unauthenticated - 403
forbidden,mfa_enrolment_required - 404
not_found
POST/api/v1/scheduling/rosters
Open (or create) the draft roster for a scope and week
Request body
application/json, object, required
weekStartstringrequiredlocationIdstring (uuid) or nulldepartmentIdstring (uuid) or null
Responses
200 Success. object
idstring (uuid)required
- 400
validation_failed - 401
session_expired,session_revoked,unauthenticated - 403
csrf_rejected,forbidden,mfa_enrolment_required - 404
not_found
GET/api/v1/scheduling/rosters/{id}
A roster week by id
Parameters
| Name | In | Type | Required |
|---|---|---|---|
id | path | string (uuid) | yes |
Responses
200 Success. object
rosterobjectrequiredidstring (uuid) or nullrequiredweekStartstringrequiredlocationIdstring (uuid) or nullrequireddepartmentIdstring (uuid) or nullrequiredscopeLabelstringrequiredstatusenumrequiredone of "none", "draft", "published"
versionnumberrequiredhasChangesbooleanrequiredpublishedAtstring | nullrequired
modeenumrequiredone of "edit", "published"
canEditbooleanrequireddaysarray of objectrequireddatestringrequiredholidaystring | nullrequiredminutesnumberrequired
employeesarray of objectrequiredidstring (uuid)requirednamestringrequiredemployeeNumberstringrequiredscheduleenum or nullrequiredone of "fixed", "shift"
editablebooleanrequiredminutesnumberrequiredrestDayAssumedstring | nullrequiredwarningsarray of objectrequiredkindenumrequiredone of "overlap", "on_leave", "outside_employment", "pending_leave", "public_holiday", "rest_day", "daily_hours", "overtime", "weekly_hours", "no_rest_day", "ot_cap"
severityenumrequiredone of "block", "ack", "warning", "hint"
labelstringrequiredmessagestringrequiredsourcestring | nullrequired
shiftsarray of objectrequiredidstring (uuid)requiredemployeeIdstring (uuid) or nullrequiredkindenumrequiredone of "shift", "rest"
datestringrequiredstartsAtstring | nullrequiredendsAtstring | nullrequiredstartstring | nullrequiredendstring | nullrequiredbreakMinutesnumberrequiredpaidMinutesnumberrequiredtemplateIdstring (uuid) or nullrequiredtemplateCodestring | nullrequiredcolourenumrequiredone of "plain", "kuning", "biru", "oren", "ink"
notestring | nullrequiredupdatedAtstringrequiredconflictsarray of objectrequiredkindenumrequiredone of "overlap", "on_leave", "outside_employment", "pending_leave", "public_holiday", "rest_day", "daily_hours", "overtime", "weekly_hours", "no_rest_day", "ot_cap"
severityenumrequiredone of "block", "ack", "warning", "hint"
labelstringrequiredmessagestringrequiredsourcestring | nullrequired
pendingSwapbooleanrequired
toAcknowledgearray of objectrequiredshiftIdstring (uuid)requiredkindstringrequiredemployeeNamestringrequireddatestringrequiredmessagestringrequired
- 400
validation_failed - 401
session_expired,session_revoked,unauthenticated - 403
forbidden,mfa_enrolment_required - 404
not_found
POST/api/v1/scheduling/rosters/{id}/clear
Remove every shift you may edit from this week's working copy
Parameters
| Name | In | Type | Required |
|---|---|---|---|
id | path | string (uuid) | yes |
Responses
200 Success. object
removednumberrequired
- 400
validation_failed - 401
session_expired,session_revoked,unauthenticated - 403
csrf_rejected,forbidden,mfa_enrolment_required - 404
not_found
POST/api/v1/scheduling/rosters/{id}/copy-previous
Copy last week's shifts into this roster, skipping people who left or moved
Parameters
| Name | In | Type | Required |
|---|---|---|---|
id | path | string (uuid) | yes |
Responses
200 Success. object
copiednumberrequiredskippedarray of objectrequiredemployeeNamestringrequireddatestringrequiredreasonstringrequired
messagestringrequired
- 400
validation_failed - 401
session_expired,session_revoked,unauthenticated - 403
csrf_rejected,forbidden,mfa_enrolment_required - 404
not_found
GET/api/v1/scheduling/rosters/{id}/export.csv
Roster week as CSV (one row per shift, with conflicts)
Parameters
| Name | In | Type | Required |
|---|---|---|---|
id | path | string (uuid) | yes |
Responses
200 CSV file text/csv
- 400
validation_failed - 401
session_expired,session_revoked,unauthenticated - 403
forbidden,mfa_enrolment_required - 404
not_found
POST/api/v1/scheduling/rosters/{id}/publish
Publish the working copy: staff, attendance, leave and payroll see it; changed staff are notified
Every `on_leave` and `outside_employment` conflict must be listed in `acknowledge`, or the call answers 409 `unacknowledged_conflicts` with the list.
Parameters
| Name | In | Type | Required |
|---|---|---|---|
id | path | string (uuid) | yes |
Request body
application/json, object, required
acknowledgearray of objectdefault []
shiftIdstring (uuid)requiredkindstringrequiredmin length 1 · max length 40
Responses
200 Success. object
versionnumberrequiredpublishedAtstringrequirednotifiednumberrequiredchangedEmployeesnumberrequired
- 400
validation_failed - 401
session_expired,session_revoked,unauthenticated - 403
csrf_rejected,forbidden,mfa_enrolment_required - 404
not_found - 409
shift_overlap,unacknowledged_conflicts
POST/api/v1/scheduling/rosters/{id}/shifts
Add a shift, an open shift or a rest day to the working copy
Parameters
| Name | In | Type | Required |
|---|---|---|---|
id | path | string (uuid) | yes |
Request body
application/json, object, required
employeeIdstring (uuid) or nullrequireddatestringrequiredkindenumone of "shift", "rest" · default "shift"
templateIdstring (uuid) or nullstartTimestringendTimestringbreakMinutesintegermin 0 · max 240
notestring or nullmax length 200
Responses
201 Success. object
idstring (uuid)requiredrosterIdstring (uuid)requiredupdatedAtstringrequired
- 400
validation_failed - 401
session_expired,session_revoked,unauthenticated - 403
csrf_rejected,forbidden,mfa_enrolment_required - 404
not_found - 409
conflict,shift_overlap - 422
not_eligible
GET/api/v1/scheduling/scopes
Locations and departments a roster can be built for, and the caller's own
Responses
200 Success. object
locationsarray of objectrequiredidstring (uuid)requirednamestringrequired
departmentsarray of objectrequiredidstring (uuid)requirednamestringrequired
mineobjectrequiredlocationIdstring (uuid) or nullrequireddepartmentIdstring (uuid) or nullrequired
canEditbooleanrequired
- 401
session_expired,session_revoked,unauthenticated - 403
forbidden,mfa_enrolment_required
PATCH/api/v1/scheduling/shifts/{id}
Change or move a shift in the working copy (409 stale when someone else changed it)
Parameters
| Name | In | Type | Required |
|---|---|---|---|
id | path | string (uuid) | yes |
Request body
application/json, object, required
employeeIdstring (uuid) or nullrequireddatestringrequiredkindenumone of "shift", "rest" · default "shift"
templateIdstring (uuid) or nullstartTimestringendTimestringbreakMinutesintegermin 0 · max 240
notestring or nullmax length 200
expectedUpdatedAtstring
Responses
200 Success. object
idstring (uuid)requiredrosterIdstring (uuid)requiredupdatedAtstringrequired
- 400
validation_failed - 401
session_expired,session_revoked,unauthenticated - 403
csrf_rejected,forbidden,mfa_enrolment_required - 404
not_found - 409
conflict,shift_overlap,stale - 422
not_eligible
DELETE/api/v1/scheduling/shifts/{id}
Remove a shift from the working copy (open swap requests on it are cancelled)
Parameters
| Name | In | Type | Required |
|---|---|---|---|
id | path | string (uuid) | yes |
Responses
204 No content.
- 400
validation_failed - 401
session_expired,session_revoked,unauthenticated - 403
csrf_rejected,forbidden,mfa_enrolment_required - 404
not_found
GET/api/v1/scheduling/swaps
My swap and pickup requests (sent and received)
Responses
200 Success. object
itemsarray of objectrequiredidstring (uuid)requiredkindenumrequiredone of "swap", "giveaway", "pickup"
statusenumrequiredone of "pending_peer", "pending_approval", "approved", "rejected", "declined", "cancelled", "expired"
directionenumrequiredone of "outgoing", "incoming", "other"
requesterobjectrequiredidstring (uuid)requirednamestringrequired
peerobject or nullrequiredidstring (uuid)requirednamestringrequired
shiftobjectrequiredidstring (uuid)requireddatestringrequiredtimestringrequired
peerShiftobject or nullrequiredidstring (uuid)requireddatestringrequiredtimestringrequired
notestring | nullrequiredreasonstring | nullrequiredapprovalRequestIdstring (uuid) or nullrequiredcreatedAtstringrequiredexpiresAtstringrequired
- 401
session_expired,session_revoked,unauthenticated - 403
mfa_enrolment_required
POST/api/v1/scheduling/swaps
Offer a shift to a colleague (swap or give-away), or ask for an open shift
Request body
application/json, object, required
kindenumrequiredone of "swap", "giveaway", "pickup"
shiftIdstring (uuid)requiredpeerEmployeeIdstring (uuid) or nullpeerShiftIdstring (uuid) or nullnotestring or nullmax length 200
Responses
201 Success. object
idstring (uuid)requiredkindenumrequiredone of "swap", "giveaway", "pickup"
statusenumrequiredone of "pending_peer", "pending_approval", "approved", "rejected", "declined", "cancelled", "expired"
directionenumrequiredone of "outgoing", "incoming", "other"
requesterobjectrequiredidstring (uuid)requirednamestringrequired
peerobject or nullrequiredidstring (uuid)requirednamestringrequired
shiftobjectrequiredidstring (uuid)requireddatestringrequiredtimestringrequired
peerShiftobject or nullrequiredidstring (uuid)requireddatestringrequiredtimestringrequired
notestring | nullrequiredreasonstring | nullrequiredapprovalRequestIdstring (uuid) or nullrequiredcreatedAtstringrequiredexpiresAtstringrequired
- 400
validation_failed - 401
session_expired,session_revoked,unauthenticated - 403
csrf_rejected,forbidden,mfa_enrolment_required - 404
not_found - 409
conflict,shift_overlap,stale - 422
not_eligible
POST/api/v1/scheduling/swaps/{id}/accept
Accept a colleague's swap offer (sends it for approval)
Parameters
| Name | In | Type | Required |
|---|---|---|---|
id | path | string (uuid) | yes |
Responses
200 Success. object
idstring (uuid)requiredkindenumrequiredone of "swap", "giveaway", "pickup"
statusenumrequiredone of "pending_peer", "pending_approval", "approved", "rejected", "declined", "cancelled", "expired"
directionenumrequiredone of "outgoing", "incoming", "other"
requesterobjectrequiredidstring (uuid)requirednamestringrequired
peerobject or nullrequiredidstring (uuid)requirednamestringrequired
shiftobjectrequiredidstring (uuid)requireddatestringrequiredtimestringrequired
peerShiftobject or nullrequiredidstring (uuid)requireddatestringrequiredtimestringrequired
notestring | nullrequiredreasonstring | nullrequiredapprovalRequestIdstring (uuid) or nullrequiredcreatedAtstringrequiredexpiresAtstringrequired
- 400
validation_failed - 401
session_expired,session_revoked,unauthenticated - 403
csrf_rejected,mfa_enrolment_required - 404
not_found - 409
conflict,shift_overlap,stale
POST/api/v1/scheduling/swaps/{id}/cancel
Cancel my swap or pickup request before it is approved
Parameters
| Name | In | Type | Required |
|---|---|---|---|
id | path | string (uuid) | yes |
Responses
200 Success. object
idstring (uuid)requiredkindenumrequiredone of "swap", "giveaway", "pickup"
statusenumrequiredone of "pending_peer", "pending_approval", "approved", "rejected", "declined", "cancelled", "expired"
directionenumrequiredone of "outgoing", "incoming", "other"
requesterobjectrequiredidstring (uuid)requirednamestringrequired
peerobject or nullrequiredidstring (uuid)requirednamestringrequired
shiftobjectrequiredidstring (uuid)requireddatestringrequiredtimestringrequired
peerShiftobject or nullrequiredidstring (uuid)requireddatestringrequiredtimestringrequired
notestring | nullrequiredreasonstring | nullrequiredapprovalRequestIdstring (uuid) or nullrequiredcreatedAtstringrequiredexpiresAtstringrequired
- 400
validation_failed - 401
session_expired,session_revoked,unauthenticated - 403
csrf_rejected,mfa_enrolment_required - 404
not_found - 409
conflict
POST/api/v1/scheduling/swaps/{id}/decline
Decline a colleague's swap offer
Parameters
| Name | In | Type | Required |
|---|---|---|---|
id | path | string (uuid) | yes |
Responses
200 Success. object
idstring (uuid)requiredkindenumrequiredone of "swap", "giveaway", "pickup"
statusenumrequiredone of "pending_peer", "pending_approval", "approved", "rejected", "declined", "cancelled", "expired"
directionenumrequiredone of "outgoing", "incoming", "other"
requesterobjectrequiredidstring (uuid)requirednamestringrequired
peerobject or nullrequiredidstring (uuid)requirednamestringrequired
shiftobjectrequiredidstring (uuid)requireddatestringrequiredtimestringrequired
peerShiftobject or nullrequiredidstring (uuid)requireddatestringrequiredtimestringrequired
notestring | nullrequiredreasonstring | nullrequiredapprovalRequestIdstring (uuid) or nullrequiredcreatedAtstringrequiredexpiresAtstringrequired
- 400
validation_failed - 401
session_expired,session_revoked,unauthenticated - 403
csrf_rejected,mfa_enrolment_required - 404
not_found - 409
conflict,shift_overlap,stale
GET/api/v1/scheduling/templates
Shift templates (active; add includeArchived=true for all)
Parameters
| Name | In | Type | Required |
|---|---|---|---|
includeArchived | query | enum | no |
Responses
200 Success. object
itemsarray of objectrequiredidstring (uuid)requirednamestringrequiredcodestringrequiredstartTimestringrequiredendTimestringrequiredbreakMinutesnumberrequiredpaidMinutesnumberrequiredovernightbooleanrequiredlocationIdstring (uuid) or nullrequiredlocationNamestring | nullrequiredcolourenumrequiredone of "plain", "kuning", "biru", "oren", "ink"
archivedbooleanrequiredinUsebooleanrequired
- 400
validation_failed - 401
session_expired,session_revoked,unauthenticated - 403
forbidden,mfa_enrolment_required
POST/api/v1/scheduling/templates
Create a shift template
Request body
application/json, object, required
namestringrequiredmin length 1 · max length 60
codestringrequiredmin length 1 · max length 6
startTimestringrequiredendTimestringrequiredbreakMinutesintegerrequiredmin 0 · max 240
locationIdstring (uuid) or nullrequiredcolourenumrequiredone of "plain", "kuning", "biru", "oren", "ink"
Responses
201 Success. object
idstring (uuid)required
- 400
validation_failed - 401
session_expired,session_revoked,unauthenticated - 403
csrf_rejected,forbidden,mfa_enrolment_required - 404
not_found - 409
conflict
PUT/api/v1/scheduling/templates/{id}
Update a shift template (existing shifts keep their times)
Parameters
| Name | In | Type | Required |
|---|---|---|---|
id | path | string (uuid) | yes |
Request body
application/json, object, required
namestringrequiredmin length 1 · max length 60
codestringrequiredmin length 1 · max length 6
startTimestringrequiredendTimestringrequiredbreakMinutesintegerrequiredmin 0 · max 240
locationIdstring (uuid) or nullrequiredcolourenumrequiredone of "plain", "kuning", "biru", "oren", "ink"
Responses
204 No content.
- 400
validation_failed - 401
session_expired,session_revoked,unauthenticated - 403
csrf_rejected,forbidden,mfa_enrolment_required - 404
not_found - 409
conflict
DELETE/api/v1/scheduling/templates/{id}
Delete a shift template no roster has used (otherwise archive it)
Parameters
| Name | In | Type | Required |
|---|---|---|---|
id | path | string (uuid) | yes |
Responses
204 No content.
- 400
validation_failed - 401
session_expired,session_revoked,unauthenticated - 403
csrf_rejected,forbidden,mfa_enrolment_required - 404
not_found - 409
in_use
POST/api/v1/scheduling/templates/{id}/archive
Archive a shift template (shifts using it are kept)
Parameters
| Name | In | Type | Required |
|---|---|---|---|
id | path | string (uuid) | yes |
Responses
204 No content.
- 400
validation_failed - 401
session_expired,session_revoked,unauthenticated - 403
csrf_rejected,forbidden,mfa_enrolment_required - 404
not_found
POST/api/v1/scheduling/templates/{id}/restore
Restore an archived shift template
Parameters
| Name | In | Type | Required |
|---|---|---|---|
id | path | string (uuid) | yes |
Responses
204 No content.
- 400
validation_failed - 401
session_expired,session_revoked,unauthenticated - 403
csrf_rejected,forbidden,mfa_enrolment_required - 404
not_found - 409
conflict