PKCE mandatory from 2026-09-30 — Details
Employment Hero LogoEmployment Hero

Timesheet Entry

This endpoint retrieves a list of all timesheet entries for a specific employee.

GET
https://api.employmenthero.com/api/v1/organisations/:organisation_id/employees/:employee_id/timesheet_entries

Path Parameters

organisation_iduuidrequired

The ID of the organisation to retrieve

employee_iduuidrequired

The ID of the employee to retrieve, we also support the wildcard collection id "-" for searching for all timesheet across all employees

Query Parameters

start_datestring

The start date of time range for date field (dd/mm/yyyy)

end_datestring

The end date of time range for date field (dd/mm/yyyy)

page_indexnumber

Current page index

Default1
Min1
item_per_pagenumber

Number of items per page

Default20
Max100

Response Body

A hash with a data property that contains an array of up to the limit of timesheets. Each entry in the array is a separate timesheet object. If there are no more timesheets, the resulting array will be empty.

dataobject
itemsobject[]
iduuid

Unique identifier for the object.

datedatetime

The date of your employee timesheet object.

start_timedatetime

The start time of timesheet.

end_timedatetime

The end time of timesheet.

statusenum<string>

The status of timesheet

unitsnumber

The number of productive working hours for this timesheet record. This represents actual work time and excludes any break periods.

unit_typeenum<string>

The unit type for this timesheet

break_unitsnumber

The total number of break hours for this timesheet record

breaksobject[]

Array of break objects containing start_time, end_time, and paid for each break

reasonstring

The reason of timesheet.

commentstring

The comment of timesheet

timenumber

The time of timesheet (milliseconds), if start_time is empty or end_time is empty then this field will have the value

cost_centreobject

The cost centre associated with the timesheet

work_site_iduuid

ID of the work site associated with the timesheet

work_site_namestring

Name of the work site associated with the timesheet

position_iduuid

ID of the position associated with the timesheet

position_namestring

Name of the position associated with the timesheet

page_indexnumber

Current page index

Default1
Min1
item_per_pagenumber

Number of items per page

Default20
Max100
total_itemsnumber

Total items

total_pagesnumber

Total pages

Example

curl -X GET \  "https://api.employmenthero.com/api/v1/organisations/:organisation_id/employees/:employee_id/timesheet_entries" \  -H "Authorization: Bearer AUXJ3123xyrj123fdsjkl124aAJKQ"

Response

{  "data": {    "items": [      {        "id": "16a62c0d-bb91-45e4-ad47-a325117c87eb",        "date": "2018-12-17T00:00:00+00:00",        "start_time": "2018-12-17T01:00:00+11:00",        "end_time": "2018-12-17T07:00:00+11:00",        "status": "pending",        "units": 6,        "unit_type": "hours",        "break_units": 0.5,        "breaks": [          {            "start_time": "2018-12-17T03:00:00+11:00",            "end_time": "2018-12-17T03:30:00+11:00",            "paid": false          }        ],        "reason": null,        "comment": "Working hard",        "time": 21600,        "cost_centre": {          "id": "1b9caf3d-ebdd-4a35-9606-659501cf5629",          "name": "Main Cost Centre"        },        "work_site_id": "cfe11859-e9c6-46dc-867c-d47119bcda84",        "work_site_name": "Downtown Office",        "position_id": "a4f1a78c-c877-46f3-829f-e3921ab0a007",        "position_name": "Software Engineer"      }    ],    "page_index": 1,    "item_per_page": 20,    "total_items": 1,    "total_pages": 1  }}

This endpoint allows you to create multiple timesheet entries for different employees in a single request. The endpoint supports bulk creation with validation and will return both successful creations and any failures. Each entry can optionally set require_approval to force it to be created pending manager approval, regardless of the calling account's access level.

POST
https://api.employmenthero.com/api/v1/organisations/:organisation_id/timesheet_entries

Path Parameters

organisation_iduuidrequired

The ID of the organisation

Request Body

timesheetsobject[]

Array of timesheet entries to create (maximum 10 per request)

employee_iduuidrequired

The ID of the employee for this timesheet entry

datestringrequired

The date of the timesheet entry in YYYY-MM-DD format

start_timedatetime

The start time in ISO 8601 format

end_timedatetime

The end time in ISO 8601 format

commentstring

Optional comment for the timesheet entry

breaksobject[]

Optional array of break periods consisting of start_time, end_time, and optionally paid

unitsnumber

The number of productive working hours for this timesheet entry. Overwritten if a start_time and end_time is provided, as units will be calculated automatically

position_iduuid

Required if your organisation uses worksites and positions. The ID of the position associated with this timesheet entry

require_approvalboolean

When true, the entry is created pending manager approval regardless of the caller's access level. Absent or false preserves existing auto-approve behaviour.

Notes

  • Maximum 10 timesheet entries per request
  • Start time and end time must be on the same date as the timesheet date, unless overnight timesheet is enabled by your organisation
  • Break times must be within the timesheet start and end times
  • Breaks cannot overlap with each other
  • Timesheet entries cannot overlap with existing entries for the same employee
  • All employees must exist in the organisation
  • require_approval forces the entry to be created as pending instead of auto-approved

Response Body

The endpoint returns a 201 status code even when some entries fail, allowing for partial success scenarios.

dataobject
itemsobject[]
iduuid

Unique identifier for the object.

datedatetime

The date of your employee timesheet object.

start_timedatetime

The start time of timesheet.

end_timedatetime

The end time of timesheet.

statusenum<string>

The status of timesheet

unitsnumber

The number of productive working hours for this timesheet record. This represents actual work time and excludes any break periods.

unit_typeenum<string>

The unit type for this timesheet

break_unitsnumber

The total number of break hours for this timesheet record

breaksobject[]

Array of break objects containing start_time, end_time, and paid for each break

reasonstring

The reason of timesheet.

commentstring

The comment of timesheet

timenumber

The time of timesheet (milliseconds), if start_time is empty or end_time is empty then this field will have the value

cost_centreobject

The cost centre associated with the timesheet

work_site_iduuid

ID of the work site associated with the timesheet

work_site_namestring

Name of the work site associated with the timesheet

position_iduuid

ID of the position associated with the timesheet

position_namestring

Name of the position associated with the timesheet

summaryobject

Summary of the timesheet entries creation

errorsobject[]

Array of failed timesheet entries with error details

Example

curl -X POST \  "https://api.employmenthero.com/api/v1/organisations/:organisation_id/timesheet_entries" \  -H "Authorization: Bearer AUXJ3123xyrj123fdsjkl124aAJKQ" \  -H "Content-Type: application/json" \  -d '{    "timesheets": [      {        "employee_id": "001c20e3-c752-4a46-81a1-a5e476e42d06",        "date": "2024-01-15",        "start_time": "2024-01-15T09:00:00+11:00",        "end_time": "2024-01-15T17:00:00+11:00",        "comment": "Regular work day",        "breaks": [          {            "start_time": "2024-01-15T12:00:00+11:00",            "end_time": "2024-01-15T13:00:00+11:00",            "paid": false          }        ],        "units": 7.5,        "position_id": "87f926ac-1a21-45aa-a86e-302815e7e781"      }    ]  }'

Response

{  "data": {    "items": [      {        "id": "16a62c0d-bb91-45e4-ad47-a325117c87eb",        "date": "2018-12-17T00:00:00+00:00",        "start_time": "2018-12-17T01:00:00+11:00",        "end_time": "2018-12-17T07:00:00+11:00",        "status": "pending",        "units": 6,        "unit_type": "hours",        "break_units": 0.5,        "breaks": [          {            "start_time": "2018-12-17T03:00:00+11:00",            "end_time": "2018-12-17T03:30:00+11:00",            "paid": false          }        ],        "reason": null,        "comment": "Working hard",        "time": 21600,        "cost_centre": {          "id": "1b9caf3d-ebdd-4a35-9606-659501cf5629",          "name": "Main Cost Centre"        },        "work_site_id": "cfe11859-e9c6-46dc-867c-d47119bcda84",        "work_site_name": "Downtown Office",        "position_id": "a4f1a78c-c877-46f3-829f-e3921ab0a007",        "position_name": "Software Engineer"      }    ],    "summary": {      "total_created": 1,      "total_failed": 0    },    "errors": []  }}

Update any editable field on an existing timesheet entry. Only include the fields you want to change — omitted fields retain their current values. Entries that have been exported to payroll (processed: true) cannot be updated and return a 409 Conflict.

PATCH
https://api.employmenthero.com/api/v1/organisations/:organisation_id/timesheet_entries/:id

Path Parameters

organisation_iduuidrequired

The ID of the organisation.

iduuidrequired

The ID of the timesheet entry to update.

Request Body

employee_iduuid

UUID of the employee to reassign the entry to.

datestring

Date of the timesheet entry in YYYY-MM-DD format.

start_timedatetime

Start time of the shift in ISO 8601 format.

end_timedatetime

End time of the shift in ISO 8601 format.

unitsnumber

Number of hours worked. Must be greater than 0 and no more than 24. Used for hours-based entries only.

commentstring

Optional comment for the timesheet entry.

position_iduuid

UUID of the HR position associated with the entry.

work_type_iduuid

UUID of the work type associated with the entry.

breaksobject[]

Array of break periods. Fully replaces the existing break list on the entry.

Response Body

The fully updated timesheet entry object.

dataobject
iduuid

Unique identifier for the object.

datedatetime

The date of your employee timesheet object.

start_timedatetime

The start time of timesheet.

end_timedatetime

The end time of timesheet.

statusenum<string>

The status of timesheet

unitsnumber

The number of productive working hours for this timesheet record. This represents actual work time and excludes any break periods.

unit_typeenum<string>

The unit type for this timesheet

break_unitsnumber

The total number of break hours for this timesheet record

breaksobject[]

Array of break objects containing start_time, end_time, and paid for each break

reasonstring

The reason of timesheet.

commentstring

The comment of timesheet

timenumber

The time of timesheet (milliseconds), if start_time is empty or end_time is empty then this field will have the value

cost_centreobject

The cost centre associated with the timesheet

work_site_iduuid

ID of the work site associated with the timesheet

work_site_namestring

Name of the work site associated with the timesheet

position_iduuid

ID of the position associated with the timesheet

position_namestring

Name of the position associated with the timesheet

Example

curl -X PATCH \  "https://api.employmenthero.com/api/v1/organisations/:organisation_id/timesheet_entries/:id" \  -H "Authorization: Bearer AUXJ3123xyrj123fdsjkl124aAJKQ" \  -H "Content-Type: application/json" \  -d '{    "date": "2025-05-01",    "start_time": "2025-05-01T09:00:00+10:00",    "end_time": "2025-05-01T17:00:00+10:00",    "comment": "Updated shift hours",    "breaks": [      {        "start_time": "2025-05-01T12:00:00+10:00",        "end_time": "2025-05-01T12:30:00+10:00"      }    ]  }'

Response

{  "data": {    "id": "16a62c0d-bb91-45e4-ad47-a325117c87eb",    "date": "2018-12-17T00:00:00+00:00",    "start_time": "2018-12-17T01:00:00+11:00",    "end_time": "2018-12-17T07:00:00+11:00",    "status": "pending",    "units": 6,    "unit_type": "hours",    "break_units": 0.5,    "breaks": [      {        "start_time": "2018-12-17T03:00:00+11:00",        "end_time": "2018-12-17T03:30:00+11:00",        "paid": false      }    ],    "reason": null,    "comment": "Working hard",    "time": 21600,    "cost_centre": {      "id": "1b9caf3d-ebdd-4a35-9606-659501cf5629",      "name": "Main Cost Centre"    },    "work_site_id": "cfe11859-e9c6-46dc-867c-d47119bcda84",    "work_site_name": "Downtown Office",    "position_id": "a4f1a78c-c877-46f3-829f-e3921ab0a007",    "position_name": "Software Engineer"  }}

Permanently delete a single timesheet entry. Any entry in pending, approved, or rejected status may be deleted. Entries that have been exported to payroll (processed: true) cannot be deleted and return a 409 Conflict.

DELETE
https://api.employmenthero.com/api/v1/organisations/:organisation_id/timesheet_entries/:id

Path Parameters

organisation_iduuidrequired

The ID of the organisation.

iduuidrequired

The ID of the timesheet entry to delete.

Response Body

Returns HTTP 204 No Content on success. The timesheet entry is permanently removed. Entries exported to payroll (processed: true) cannot be deleted and return 409 Conflict.

Example

curl -X DELETE \  "https://api.employmenthero.com/api/v1/organisations/:organisation_id/timesheet_entries/:id" \  -H "Authorization: Bearer AUXJ3123xyrj123fdsjkl124aAJKQ"

Response

This endpoint does not return a response body.

Approve a single timesheet entry. Valid from both pending and rejected status. Calling approve on an entry that is already approved returns a 409 Conflict.

POST
https://api.employmenthero.com/api/v1/organisations/:organisation_id/timesheet_entries/:id/approve

Path Parameters

organisation_iduuidrequired

The ID of the organisation.

iduuidrequired

The ID of the timesheet entry to approve.

Response Body

The approved timesheet entry object with status set to approved.

dataobject
iduuid

Unique identifier for the object.

datedatetime

The date of your employee timesheet object.

start_timedatetime

The start time of timesheet.

end_timedatetime

The end time of timesheet.

statusenum<string>

The status of timesheet

unitsnumber

The number of productive working hours for this timesheet record. This represents actual work time and excludes any break periods.

unit_typeenum<string>

The unit type for this timesheet

break_unitsnumber

The total number of break hours for this timesheet record

breaksobject[]

Array of break objects containing start_time, end_time, and paid for each break

reasonstring

The reason of timesheet.

commentstring

The comment of timesheet

timenumber

The time of timesheet (milliseconds), if start_time is empty or end_time is empty then this field will have the value

cost_centreobject

The cost centre associated with the timesheet

work_site_iduuid

ID of the work site associated with the timesheet

work_site_namestring

Name of the work site associated with the timesheet

position_iduuid

ID of the position associated with the timesheet

position_namestring

Name of the position associated with the timesheet

Example

curl -X POST \  "https://api.employmenthero.com/api/v1/organisations/:organisation_id/timesheet_entries/:id/approve" \  -H "Authorization: Bearer AUXJ3123xyrj123fdsjkl124aAJKQ"

Response

{  "data": {    "id": "16a62c0d-bb91-45e4-ad47-a325117c87eb",    "date": "2018-12-17T00:00:00+00:00",    "start_time": "2018-12-17T01:00:00+11:00",    "end_time": "2018-12-17T07:00:00+11:00",    "status": "pending",    "units": 6,    "unit_type": "hours",    "break_units": 0.5,    "breaks": [      {        "start_time": "2018-12-17T03:00:00+11:00",        "end_time": "2018-12-17T03:30:00+11:00",        "paid": false      }    ],    "reason": null,    "comment": "Working hard",    "time": 21600,    "cost_centre": {      "id": "1b9caf3d-ebdd-4a35-9606-659501cf5629",      "name": "Main Cost Centre"    },    "work_site_id": "cfe11859-e9c6-46dc-867c-d47119bcda84",    "work_site_name": "Downtown Office",    "position_id": "a4f1a78c-c877-46f3-829f-e3921ab0a007",    "position_name": "Software Engineer"  }}

Decline a single timesheet entry with an optional reason. Valid from both pending and approved status. The optional reason is stored on the entry and visible to the employee. Calling decline on an entry that is already rejected returns a 409 Conflict.

POST
https://api.employmenthero.com/api/v1/organisations/:organisation_id/timesheet_entries/:id/decline

Path Parameters

organisation_iduuidrequired

The ID of the organisation.

iduuidrequired

The ID of the timesheet entry to decline.

Request Body

reasonstring

Optional reason for declining the entry. Stored on the entry and visible to the employee.

Response Body

The declined timesheet entry object with status set to rejected.

dataobject
iduuid

Unique identifier for the object.

datedatetime

The date of your employee timesheet object.

start_timedatetime

The start time of timesheet.

end_timedatetime

The end time of timesheet.

statusenum<string>

The status of timesheet

unitsnumber

The number of productive working hours for this timesheet record. This represents actual work time and excludes any break periods.

unit_typeenum<string>

The unit type for this timesheet

break_unitsnumber

The total number of break hours for this timesheet record

breaksobject[]

Array of break objects containing start_time, end_time, and paid for each break

reasonstring

The reason of timesheet.

commentstring

The comment of timesheet

timenumber

The time of timesheet (milliseconds), if start_time is empty or end_time is empty then this field will have the value

cost_centreobject

The cost centre associated with the timesheet

work_site_iduuid

ID of the work site associated with the timesheet

work_site_namestring

Name of the work site associated with the timesheet

position_iduuid

ID of the position associated with the timesheet

position_namestring

Name of the position associated with the timesheet

Example

curl -X POST \  "https://api.employmenthero.com/api/v1/organisations/:organisation_id/timesheet_entries/:id/decline" \  -H "Authorization: Bearer AUXJ3123xyrj123fdsjkl124aAJKQ" \  -H "Content-Type: application/json" \  -d '{    "reason": "Incorrect hours reported"  }'

Response

{  "data": {    "id": "16a62c0d-bb91-45e4-ad47-a325117c87eb",    "date": "2018-12-17T00:00:00+00:00",    "start_time": "2018-12-17T01:00:00+11:00",    "end_time": "2018-12-17T07:00:00+11:00",    "status": "pending",    "units": 6,    "unit_type": "hours",    "break_units": 0.5,    "breaks": [      {        "start_time": "2018-12-17T03:00:00+11:00",        "end_time": "2018-12-17T03:30:00+11:00",        "paid": false      }    ],    "reason": null,    "comment": "Working hard",    "time": 21600,    "cost_centre": {      "id": "1b9caf3d-ebdd-4a35-9606-659501cf5629",      "name": "Main Cost Centre"    },    "work_site_id": "cfe11859-e9c6-46dc-867c-d47119bcda84",    "work_site_name": "Downtown Office",    "position_id": "a4f1a78c-c877-46f3-829f-e3921ab0a007",    "position_name": "Software Engineer"  }}

Approve up to 10 timesheet entries in a single request. Each entry is processed independently — a failure on one does not block the others. A 200 OK is always returned; check the errors array for entries that could not be approved. Entries in rejected status are also eligible for approval.

POST
https://api.employmenthero.com/api/v1/organisations/:organisation_id/timesheet_entries/bulk_approve

Path Parameters

organisation_iduuidrequired

The ID of the organisation.

Request Body

idsuuid[]required

Array of timesheet entry UUIDs to approve. Must contain between 1 and 10 entries.

Response Body

Always returns 200 with a partial-success response. Check errors for any entries that could not be approved.

dataobject
itemsobject[]

Array of successfully approved timesheet entry objects.

summaryobject

Summary counts for the bulk approve operation.

errorsobject[]

Array of per-entry error objects for entries that could not be approved.

Example

curl -X POST \  "https://api.employmenthero.com/api/v1/organisations/:organisation_id/timesheet_entries/bulk_approve" \  -H "Authorization: Bearer AUXJ3123xyrj123fdsjkl124aAJKQ" \  -H "Content-Type: application/json" \  -d '{    "ids": [      "16a62c0d-bb91-45e4-ad47-a325117c87eb",      "f2b3c4d5-e6f7-8901-abcd-ef2345678901"    ]  }'

Response

{  "data": {    "items": [      {        "id": "16a62c0d-bb91-45e4-ad47-a325117c87eb",        "date": "2025-05-01T00:00:00+00:00",        "start_time": "2025-05-01T09:00:00+10:00",        "end_time": "2025-05-01T17:00:00+10:00",        "status": "approved",        "units": 8,        "unit_type": "hours",        "break_units": 0.5,        "breaks": [          {            "start_time": "2025-05-01T12:00:00+10:00",            "end_time": "2025-05-01T12:30:00+10:00",            "paid": false          }        ],        "reason": null,        "comment": "Regular shift",        "time": 28800,        "cost_centre": {          "id": "1b9caf3d-ebdd-4a35-9606-659501cf5629",          "name": "Main Cost Centre"        },        "work_site_id": "cfe11859-e9c6-46dc-867c-d47119bcda84",        "work_site_name": "Downtown Office",        "position_id": "a4f1a78c-c877-46f3-829f-e3921ab0a007",        "position_name": "Software Engineer"      }    ],    "summary": {      "total_approved": 1,      "total_failed": 1    },    "errors": [      {        "id": "f2b3c4d5-e6f7-8901-abcd-ef2345678901",        "errors": [          "Timesheet entry is already approved"        ]      }    ]  }}

Decline up to 10 timesheet entries in a single request with an optional shared reason. Each entry is processed independently — a failure on one does not block the others. A 200 OK is always returned; check the errors array for entries that could not be declined. Entries in pending or approved status are eligible.

POST
https://api.employmenthero.com/api/v1/organisations/:organisation_id/timesheet_entries/bulk_decline

Path Parameters

organisation_iduuidrequired

The ID of the organisation.

Request Body

idsuuid[]required

Array of timesheet entry UUIDs to decline. Must contain between 1 and 10 entries.

reasonstring

Optional reason applied uniformly to every successfully declined entry.

Response Body

Always returns 200 with a partial-success response. Check errors for any entries that could not be declined.

dataobject
itemsobject[]

Array of successfully declined timesheet entry objects.

summaryobject

Summary counts for the bulk decline operation.

errorsobject[]

Array of per-entry error objects for entries that could not be declined.

Example

curl -X POST \  "https://api.employmenthero.com/api/v1/organisations/:organisation_id/timesheet_entries/bulk_decline" \  -H "Authorization: Bearer AUXJ3123xyrj123fdsjkl124aAJKQ" \  -H "Content-Type: application/json" \  -d '{    "ids": [      "16a62c0d-bb91-45e4-ad47-a325117c87eb",      "f2b3c4d5-e6f7-8901-abcd-ef2345678901"    ],    "reason": "Incorrect hours reported"  }'

Response

{  "data": {    "items": [      {        "id": "16a62c0d-bb91-45e4-ad47-a325117c87eb",        "date": "2025-05-01T00:00:00+00:00",        "start_time": "2025-05-01T09:00:00+10:00",        "end_time": "2025-05-01T17:00:00+10:00",        "status": "rejected",        "units": 8,        "unit_type": "hours",        "break_units": 0.5,        "breaks": [          {            "start_time": "2025-05-01T12:00:00+10:00",            "end_time": "2025-05-01T12:30:00+10:00",            "paid": false          }        ],        "reason": "Incorrect hours reported",        "comment": "Regular shift",        "time": 28800,        "cost_centre": {          "id": "1b9caf3d-ebdd-4a35-9606-659501cf5629",          "name": "Main Cost Centre"        },        "work_site_id": "cfe11859-e9c6-46dc-867c-d47119bcda84",        "work_site_name": "Downtown Office",        "position_id": "a4f1a78c-c877-46f3-829f-e3921ab0a007",        "position_name": "Software Engineer"      }    ],    "summary": {      "total_declined": 1,      "total_failed": 1    },    "errors": [      {        "id": "f2b3c4d5-e6f7-8901-abcd-ef2345678901",        "errors": [          "Timesheet entry is already rejected"        ]      }    ]  }}