Attendance API
15 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.
POST/api/v1/attendance/corrections
Add a missing punch to someone's timesheet, with a reason (audited)
Request body
application/json, object, required
employeeIdstring (uuid)requiredkindenumrequiredone of "in", "out"
timestring (date-time)requiredreasonstringrequiredmin length 3 · max length 300
Responses
201 Success. object
idstring (uuid)requiredemployeeIdstring (uuid)requiredkindenumrequiredone of "in", "out"
sourceenumrequiredone of "web", "mobile_web", "ios", "android", "correction"
deviceTimestringrequiredsentAtstringrequiredserverTimestringrequiredrecordedAtstringrequiredworkDatestringrequiredskewSecondsnumberrequiredqueuedbooleanrequiredstatusenumrequiredone of "accepted", "flagged"
flagsarray of enumrequiredlocationobject or nullrequiredlatitudenumberrequiredlongitudenumberrequiredaccuracyMetresnumber | nullrequired
reasonstring | nullrequiredvoidedbooleanrequiredvoidReasonstring | nullrequired
- 400
validation_failed - 401
session_expired,session_revoked,unauthenticated - 403
csrf_rejected,forbidden,mfa_enrolment_required,self_change_requires_approval - 404
not_found
GET/api/v1/attendance/me
Clock-in status: today's punches, whether you are clocked in, and the location notice
Responses
200 Success. object
employeeIdstring (uuid) or nullrequiredserverTimestringrequiredclockedInbooleanrequiredlastPunchobject or nullrequiredidstring (uuid)requiredemployeeIdstring (uuid)requiredkindenumrequiredone of "in", "out"
sourceenumrequiredone of "web", "mobile_web", "ios", "android", "correction"
deviceTimestringrequiredsentAtstringrequiredserverTimestringrequiredrecordedAtstringrequiredworkDatestringrequiredskewSecondsnumberrequiredqueuedbooleanrequiredstatusenumrequiredone of "accepted", "flagged"
flagsarray of enumrequiredlocationobject or nullrequiredlatitudenumberrequiredlongitudenumberrequiredaccuracyMetresnumber | nullrequired
reasonstring | nullrequiredvoidedbooleanrequiredvoidReasonstring | nullrequired
todayarray of objectrequiredidstring (uuid)requiredemployeeIdstring (uuid)requiredkindenumrequiredone of "in", "out"
sourceenumrequiredone of "web", "mobile_web", "ios", "android", "correction"
deviceTimestringrequiredsentAtstringrequiredserverTimestringrequiredrecordedAtstringrequiredworkDatestringrequiredskewSecondsnumberrequiredqueuedbooleanrequiredstatusenumrequiredone of "accepted", "flagged"
flagsarray of enumrequiredlocationobject or nullrequiredlatitudenumberrequiredlongitudenumberrequiredaccuracyMetresnumber | nullrequired
reasonstring | nullrequiredvoidedbooleanrequiredvoidReasonstring | nullrequired
locationobjectrequiredmodeenumrequiredone of "off", "optional", "required"
pdpaNoticestring | nullrequiredofficesarray of objectrequirednamestringrequiredradiusMetresnumberrequired
networkRestrictedbooleanrequired
- 401
session_expired,session_revoked,unauthenticated - 403
mfa_enrolment_required
GET/api/v1/attendance/overtime
List overtime claims you can see
Parameters
| Name | In | Type | Required |
|---|---|---|---|
employeeId | query | string (uuid) | no |
from | query | string | no |
to | query | string | no |
status | query | enum | no |
Responses
200 Success. object
itemsarray of objectrequiredidstring (uuid)requiredemployeeobjectrequiredidstring (uuid)requirednamestringrequired
datestringrequiredcomputedMinutesnumberrequiredclaimedMinutesnumberrequiredapprovedMinutesnumber | nullrequiredstatutorybooleanrequiredreasonstring | nullrequiredstatusenumrequiredone of "pending", "approved", "rejected", "withdrawn"
approvalRequestIdstring (uuid) or nullrequiredcreatedAtstringrequireddecidedAtstring | nullrequired
- 400
validation_failed - 401
session_expired,session_revoked,unauthenticated - 403
forbidden,mfa_enrolment_required
POST/api/v1/attendance/overtime
Claim overtime for a day (up to the timesheet's OT; warns past 72 hours a month)
Request body
application/json, object, required
employeeIdstring (uuid)datestringrequiredminutesintegerrequiredmin 1 · max 1440
reasonstring or nullmax length 300
Responses
201 Success. object
claimobjectrequiredidstring (uuid)requiredemployeeobjectrequiredidstring (uuid)requirednamestringrequired
datestringrequiredcomputedMinutesnumberrequiredclaimedMinutesnumberrequiredapprovedMinutesnumber | nullrequiredstatutorybooleanrequiredreasonstring | nullrequiredstatusenumrequiredone of "pending", "approved", "rejected", "withdrawn"
approvalRequestIdstring (uuid) or nullrequiredcreatedAtstringrequireddecidedAtstring | nullrequired
warningsarray of stringrequired
- 400
validation_failed - 401
session_expired,session_revoked,unauthenticated - 403
csrf_rejected,forbidden,mfa_enrolment_required - 404
not_found - 409
conflict
GET/api/v1/attendance/overtime/{id}
Get an overtime claim
Parameters
| Name | In | Type | Required |
|---|---|---|---|
id | path | string (uuid) | yes |
Responses
200 Success. object
idstring (uuid)requiredemployeeobjectrequiredidstring (uuid)requirednamestringrequired
datestringrequiredcomputedMinutesnumberrequiredclaimedMinutesnumberrequiredapprovedMinutesnumber | nullrequiredstatutorybooleanrequiredreasonstring | nullrequiredstatusenumrequiredone of "pending", "approved", "rejected", "withdrawn"
approvalRequestIdstring (uuid) or nullrequiredcreatedAtstringrequireddecidedAtstring | nullrequired
- 400
validation_failed - 401
session_expired,session_revoked,unauthenticated - 403
forbidden,mfa_enrolment_required - 404
not_found
POST/api/v1/attendance/overtime/{id}/withdraw
Withdraw a pending overtime claim
Parameters
| Name | In | Type | Required |
|---|---|---|---|
id | path | string (uuid) | yes |
Responses
200 Success. object
idstring (uuid)requiredemployeeobjectrequiredidstring (uuid)requirednamestringrequired
datestringrequiredcomputedMinutesnumberrequiredclaimedMinutesnumberrequiredapprovedMinutesnumber | nullrequiredstatutorybooleanrequiredreasonstring | nullrequiredstatusenumrequiredone of "pending", "approved", "rejected", "withdrawn"
approvalRequestIdstring (uuid) or nullrequiredcreatedAtstringrequireddecidedAtstring | nullrequired
- 400
validation_failed - 401
session_expired,session_revoked,unauthenticated - 403
csrf_rejected,forbidden,mfa_enrolment_required - 404
not_found - 409
conflict
GET/api/v1/attendance/payroll-overtime
Approved overtime per claim for a pay period (payroll's OvertimeSource)
Parameters
| Name | In | Type | Required |
|---|---|---|---|
periodStart | query | string | yes |
periodEnd | query | string | yes |
Responses
200 Success. object
itemsarray of objectrequiredsourceIdstring (uuid)requiredemployeeIdstring (uuid)requiredminutesnumberrequiredperiodStartstringrequiredperiodEndstringrequired
- 400
validation_failed - 401
session_expired,session_revoked,unauthenticated - 403
forbidden,mfa_enrolment_required
POST/api/v1/attendance/punches
Clock in or out (idempotent: a retried key returns the original punch with 200)
Send `deviceTime` (the tap) and `sentAt` (device clock when sending). The server records its own time and the corrected time, and flags clock skew and late sync. Queued offline punches are sent in order with `queued: true`.
Request body
application/json, object, required
kindenumrequiredone of "in", "out"
idempotencyKeystringrequiredmin length 8 · max length 100
deviceTimestring (date-time)requiredsentAtstring (date-time)requiredqueuedbooleandefault false
sourceenumone of "web", "mobile_web", "ios", "android" · default "web"
elapsedMsintegerNative apps: milliseconds between the tap and sending, from the device's monotonic clock. Leave out if the device restarted in between.
min 0 · max 691200000
locationobject or nulllatitudenumberrequiredmin -90 · max 90
longitudenumberrequiredmin -180 · max 180
accuracyMetresnumbermin 0 · max 100000
Responses
200 Success. object
idstring (uuid)requiredemployeeIdstring (uuid)requiredkindenumrequiredone of "in", "out"
sourceenumrequiredone of "web", "mobile_web", "ios", "android", "correction"
deviceTimestringrequiredsentAtstringrequiredserverTimestringrequiredrecordedAtstringrequiredworkDatestringrequiredskewSecondsnumberrequiredqueuedbooleanrequiredstatusenumrequiredone of "accepted", "flagged"
flagsarray of enumrequiredlocationobject or nullrequiredlatitudenumberrequiredlongitudenumberrequiredaccuracyMetresnumber | nullrequired
reasonstring | nullrequiredvoidedbooleanrequiredvoidReasonstring | nullrequiredreplayedbooleanrequired
201 Success. object
idstring (uuid)requiredemployeeIdstring (uuid)requiredkindenumrequiredone of "in", "out"
sourceenumrequiredone of "web", "mobile_web", "ios", "android", "correction"
deviceTimestringrequiredsentAtstringrequiredserverTimestringrequiredrecordedAtstringrequiredworkDatestringrequiredskewSecondsnumberrequiredqueuedbooleanrequiredstatusenumrequiredone of "accepted", "flagged"
flagsarray of enumrequiredlocationobject or nullrequiredlatitudenumberrequiredlongitudenumberrequiredaccuracyMetresnumber | nullrequired
reasonstring | nullrequiredvoidedbooleanrequiredvoidReasonstring | nullrequiredreplayedbooleanrequired
- 400
validation_failed - 401
session_expired,session_revoked,unauthenticated - 403
csrf_rejected,forbidden,mfa_enrolment_required - 422
ip_not_allowed,outside_location,punch_rejected
POST/api/v1/attendance/punches/{id}/void
Void a wrong punch, with a reason (the original is kept; audited)
Parameters
| Name | In | Type | Required |
|---|---|---|---|
id | path | string (uuid) | yes |
Request body
application/json, object, required
reasonstringrequiredmin length 3 · max length 300
Responses
200 Success. object
idstring (uuid)requiredemployeeIdstring (uuid)requiredkindenumrequiredone of "in", "out"
sourceenumrequiredone of "web", "mobile_web", "ios", "android", "correction"
deviceTimestringrequiredsentAtstringrequiredserverTimestringrequiredrecordedAtstringrequiredworkDatestringrequiredskewSecondsnumberrequiredqueuedbooleanrequiredstatusenumrequiredone of "accepted", "flagged"
flagsarray of enumrequiredlocationobject or nullrequiredlatitudenumberrequiredlongitudenumberrequiredaccuracyMetresnumber | nullrequired
reasonstring | nullrequiredvoidedbooleanrequiredvoidReasonstring | nullrequired
- 400
validation_failed - 401
session_expired,session_revoked,unauthenticated - 403
csrf_rejected,forbidden,mfa_enrolment_required,self_change_requires_approval - 404
not_found - 409
conflict
GET/api/v1/attendance/reports/summary
Attendance summary per employee for a period (up to 62 days)
Parameters
| Name | In | Type | Required |
|---|---|---|---|
from | query | string | yes |
to | query | string | yes |
Responses
200 Success. object
itemsarray of objectrequiredemployeeIdstring (uuid)requirednamestringrequireddaysWorkednumberrequiredworkedMinutesnumberrequiredlateCountnumberrequiredlateMinutesnumberrequiredearlyOutCountnumberrequiredmissingPunchesnumberrequiredcomputedOtMinutesnumberrequiredapprovedOtMinutesnumberrequiredleaveDaysnumberrequired
- 400
validation_failed - 401
session_expired,session_revoked,unauthenticated - 403
forbidden,mfa_enrolment_required
GET/api/v1/attendance/reports/summary.csv
Attendance summary as CSV
Parameters
| Name | In | Type | Required |
|---|---|---|---|
from | query | string | yes |
to | query | string | yes |
Responses
200 CSV file text/csv
- 400
validation_failed - 401
session_expired,session_revoked,unauthenticated - 403
forbidden,mfa_enrolment_required
GET/api/v1/attendance/settings
Attendance settings (location, offices, IP ranges, start time, grace, OT rounding)
Responses
200 Success. object
locationModeenumrequiredone of "off", "optional", "required"
officesarray of objectrequiredidstringrequirednamestringrequiredlatitudenumberrequiredlongitudenumberrequiredradiusMetresnumberrequired
locationEnforcementenumrequiredone of "flag", "block"
allowedIpsarray of stringrequiredipEnforcementenumrequiredone of "flag", "block"
pdpaNoticestring or nullrequiredmax length 2000
defaultStartTimestringrequiredscheduleStartTimesobjectrequiredbreakMinutesintegerrequiredmin 0 · max 240
lateGraceMinutesintegerrequiredmin 0 · max 120
earlyOutGraceMinutesintegerrequiredmin 0 · max 120
skewThresholdSecondsintegerrequiredmin 10 · max 3600
otBlockMinutesintegerrequiredmin 1 · max 60
otMinimumMinutesintegerrequiredmin 0 · max 240
effectivePdpaNoticestringrequired
- 401
session_expired,session_revoked,unauthenticated - 403
forbidden,mfa_enrolment_required
PUT/api/v1/attendance/settings
Update attendance settings
Request body
application/json, object, required
locationModeenumrequiredone of "off", "optional", "required"
officesarray of objectrequiredidstringmin length 1 · max length 64
namestringrequiredmin length 1 · max length 80
latitudenumberrequiredmin -90 · max 90
longitudenumberrequiredmin -180 · max 180
radiusMetresintegerrequiredmin 20 · max 5000
locationEnforcementenumrequiredone of "flag", "block"
allowedIpsarray of stringrequiredipEnforcementenumrequiredone of "flag", "block"
pdpaNoticestring or nullrequiredmax length 2000
defaultStartTimestringrequiredscheduleStartTimesobjectrequiredbreakMinutesintegerrequiredmin 0 · max 240
lateGraceMinutesintegerrequiredmin 0 · max 120
earlyOutGraceMinutesintegerrequiredmin 0 · max 120
skewThresholdSecondsintegerrequiredmin 10 · max 3600
otBlockMinutesintegerrequiredmin 1 · max 60
otMinimumMinutesintegerrequiredmin 0 · max 240
Responses
200 Success. object
locationModeenumrequiredone of "off", "optional", "required"
officesarray of objectrequiredidstringrequirednamestringrequiredlatitudenumberrequiredlongitudenumberrequiredradiusMetresnumberrequired
locationEnforcementenumrequiredone of "flag", "block"
allowedIpsarray of stringrequiredipEnforcementenumrequiredone of "flag", "block"
pdpaNoticestring or nullrequiredmax length 2000
defaultStartTimestringrequiredscheduleStartTimesobjectrequiredbreakMinutesintegerrequiredmin 0 · max 240
lateGraceMinutesintegerrequiredmin 0 · max 120
earlyOutGraceMinutesintegerrequiredmin 0 · max 120
skewThresholdSecondsintegerrequiredmin 10 · max 3600
otBlockMinutesintegerrequiredmin 1 · max 60
otMinimumMinutesintegerrequiredmin 0 · max 240
effectivePdpaNoticestringrequired
- 400
validation_failed - 401
session_expired,session_revoked,unauthenticated - 403
csrf_rejected,forbidden,mfa_enrolment_required
GET/api/v1/attendance/team
Timesheets of everyone you can see (your reports; everyone for admins) over up to 31 days
Parameters
| Name | In | Type | Required |
|---|---|---|---|
from | query | string | yes |
to | query | string | yes |
Responses
200 Success. object
itemsarray of objectrequiredemployeeobjectrequiredidstring (uuid)requirednamestringrequired
daysarray of objectrequireddatestringrequireddayTypeenumrequiredone of "working", "half", "off", "rest", "public_holiday", "leave", "shift", "not_employed"
holidaystring | nullrequiredleaveobject or nullrequiredsessionenumrequiredone of "full", "am", "pm"
labelstringrequired
scheduledMinutesnumberrequiredscheduledStartstring | nullrequiredfirstInstring | nullrequiredlastOutstring | nullrequiredworkedMinutesnumberrequiredbreakMinutesnumberrequiredlateMinutesnumberrequiredearlyOutMinutesnumberrequiredmissingPunchesnumberrequiredopenbooleanrequiredflagsarray of enumrequiredotMinutesnumberrequiredpunchesarray of objectrequiredidstring (uuid)requiredemployeeIdstring (uuid)requiredkindenumrequiredone of "in", "out"
sourceenumrequiredone of "web", "mobile_web", "ios", "android", "correction"
deviceTimestringrequiredsentAtstringrequiredserverTimestringrequiredrecordedAtstringrequiredworkDatestringrequiredskewSecondsnumberrequiredqueuedbooleanrequiredstatusenumrequiredone of "accepted", "flagged"
flagsarray of enumrequiredlocationobject or nullrequiredlatitudenumberrequiredlongitudenumberrequiredaccuracyMetresnumber | nullrequired
reasonstring | nullrequiredvoidedbooleanrequiredvoidReasonstring | nullrequired
otClaimobject or nullrequiredidstring (uuid)requiredstatusenumrequiredone of "pending", "approved", "rejected", "withdrawn"
claimedMinutesnumberrequiredapprovedMinutesnumber | nullrequired
totalsobjectrequireddaysWorkednumberrequiredworkedMinutesnumberrequiredlateCountnumberrequiredlateMinutesnumberrequiredearlyOutCountnumberrequiredmissingPunchesnumberrequiredotMinutesnumberrequiredleaveDaysnumberrequired
- 400
validation_failed - 401
session_expired,session_revoked,unauthenticated - 403
forbidden,mfa_enrolment_required
GET/api/v1/attendance/timesheet
Daily timesheet for an employee (default: yours) over up to 62 days
Parameters
| Name | In | Type | Required |
|---|---|---|---|
employeeId | query | string (uuid) | no |
from | query | string | yes |
to | query | string | yes |
Responses
200 Success. object
employeeobjectrequiredidstring (uuid)requirednamestringrequired
daysarray of objectrequireddatestringrequireddayTypeenumrequiredone of "working", "half", "off", "rest", "public_holiday", "leave", "shift", "not_employed"
holidaystring | nullrequiredleaveobject or nullrequiredsessionenumrequiredone of "full", "am", "pm"
labelstringrequired
scheduledMinutesnumberrequiredscheduledStartstring | nullrequiredfirstInstring | nullrequiredlastOutstring | nullrequiredworkedMinutesnumberrequiredbreakMinutesnumberrequiredlateMinutesnumberrequiredearlyOutMinutesnumberrequiredmissingPunchesnumberrequiredopenbooleanrequiredflagsarray of enumrequiredotMinutesnumberrequiredpunchesarray of objectrequiredidstring (uuid)requiredemployeeIdstring (uuid)requiredkindenumrequiredone of "in", "out"
sourceenumrequiredone of "web", "mobile_web", "ios", "android", "correction"
deviceTimestringrequiredsentAtstringrequiredserverTimestringrequiredrecordedAtstringrequiredworkDatestringrequiredskewSecondsnumberrequiredqueuedbooleanrequiredstatusenumrequiredone of "accepted", "flagged"
flagsarray of enumrequiredlocationobject or nullrequiredlatitudenumberrequiredlongitudenumberrequiredaccuracyMetresnumber | nullrequired
reasonstring | nullrequiredvoidedbooleanrequiredvoidReasonstring | nullrequired
otClaimobject or nullrequiredidstring (uuid)requiredstatusenumrequiredone of "pending", "approved", "rejected", "withdrawn"
claimedMinutesnumberrequiredapprovedMinutesnumber | nullrequired
totalsobjectrequireddaysWorkednumberrequiredworkedMinutesnumberrequiredlateCountnumberrequiredlateMinutesnumberrequiredearlyOutCountnumberrequiredmissingPunchesnumberrequiredotMinutesnumberrequiredleaveDaysnumberrequired
- 400
validation_failed - 401
session_expired,session_revoked,unauthenticated - 403
forbidden,mfa_enrolment_required