Time tracking
With the time tracking API, you can manage the time worked by employees, and add, update, retrieve and delete their shifts.
The time tracking API only works for Global Payroll.
Independent contractors use timesheets to track their time. For more information, see Timesheets.
Before you begin
Before managing shifts, note the following:
Retrieve your contract ID
Shifts are linked to contracts. Retrieve the contract ID from the GET list of contracts endpoint.
Understand payroll cycles
Shifts are processed and compensated at the end of each payroll cycle. For more information, see Shifts and payroll cycles.
Late shift behavior
Shifts submitted for a past payroll cycle are compensated at the end of the current cycle without date validation.
Compensation calculation
Shifts are compensated based on the shift rate and the worker’s hourly base salary.
Shift types
Shifts can be submitted in two formats:
Shifts with known pay codes and rates defined in Deel.
Granular shifts capturing start time, end time, and break information.
Categorized shifts
Categorized shifts are suited for when shifts are categorized outside Deel and the shift rates (pay codes/category) are known. To use this API, you must first create shift rates in Deel and then reference those shift rates when submitting categorized shifts.
Following is an example of a categorized shift:
Uncategorized (raw) shifts
Uncategorized shifts are used to capture the shift information in a more granular way. Unlike categorized shifts, which capture summary information such as total hours worked, uncategorized shifts capture granular start time, end time, and break information. There is no need to set up a shift rate for uncategorized shifts.
Shifts and payroll cycles
When you submit a shift, the shift is automatically associated to the relevant payroll cycle based on the submission timestamp and the cycle’s cutoff date. The cutoff date is the last day for the manager to approve the submitted shifts to be processed within the current payroll cycle.
- If the shift is approved before the cutoff date, the submission is processed within the current cycle
- If the shift is approved after the cutoff date, the submission is processed in the next cycle
The payroll calendar is configured per entity by your Deel representative when you onboard. That is when you decide the cutoff dates. If you have questions about your cutoff dates, contact your Deel representative. For more information, see Understanding the Deel Global Payroll Calendar.

Contact support for late shift submissions
If the payroll cutoff date has already passed and waiting for the next cycle for the shift to be processed is not an option for you, you can contact support to process the shift in a special off-cycle payroll run. Off-cycle payroll runs have an additional fee that depends on your contract agreement.
Make sure to provide the shift details via a CSV file through the support channel.
Preventing late submissions with payroll_cycle_ref.date
To avoid accidental late submissions that result in a shift being processed in the next cycle, you can include the optional payroll_cycle_ref.date parameter when submitting a shift. This parameter ensures that the shift is only associated with the specified cycle if the submission is timely, avoiding shifts being unintentionally pushed to the next payroll cycle.
When you pass a payroll_cycle_ref.date, you’re declaring your intended payroll cycle for the shift. The system compares the request’s timestamp with the cycle’s cutoff date and checks whether the current submission falls within the specified cycle.
- If the submission timestamp is before the cutoff of the current cycle, the request succeeds
- If the submission timestamp is after the cutoff, the request is rejected
This validation ensures that the shift is only associated with the specified cycle if the submission is timely.
Without the payroll_cycle_ref.date parameter, the system automatically determines the cycle based on the submission time — which may lead to late shifts being silently pushed to the next cycle. Use this parameter when you want explicit alignment with a particular payroll cycle.
The following example shows how to use the payroll_cycle_ref.date parameter:
Format of the payroll_cycle_ref
The payroll_cycle_ref.date follows the ISO 8601 date and time format. You can use any date within the cycle’s start and end dates, but we recommend using the cycle’s end date for clarity.
Manage shifts
This section covers how to add, update, and delete shifts for an employee.
Add shifts
This section covers how to add shifts for an employee. There are different endpoints available for adding shifts based on the shift type:
Add shifts with known pay codes and rates.
Legacy method (not recommended).
Add granular shifts with detailed time information.
Add categorized shifts
You can add multiple categorized shifts for a single contract by providing an array of shifts. You can add a shift using any of the following time units: HOUR , DAY , WEEK , and MONTH.
Create a shift rate
Before submitting a categorized shift, create a shift rate and note its external_id.
Add categorized shifts (Legacy)
This method is still supported, but it is recommended to use Add categorized shifts instead.
This shift type adds a shift without requiring time_amount and time_unit in the request body. By default, time_amount is set to summary.total_payable_hours and time_unit is set to HOUR. You can perform the same operations on these shifts as you would with categorized shifts by using the same payload.
Create a shift rate
Before submitting a categorized shift, create a shift rate and note its external_id.
Add uncategorized (raw) shifts
You can add multiple uncategorized shifts for a single contract by providing an array of shifts.
List shifts in your organization
You can list the shifts in your organization and sort them by the time of creation.
Make the request
Make a GET request to the List time tracking shifts endpoint.
In the query:
Use the array syntax contract_id[]=value to filter for contract IDs. For multiple contract IDs, you can use contract_id[]=value1&contract_id[]=value2.
Retrieve a single shift
You can retrieve the information of a single shift using the external_id of the shift.
Update shifts
You can update a shift before it is processed for payroll. After a shift is processed, your ability to amend it depends on the shift type:
- You can amend a categorized shift using correction shifts
- You cannot amend uncategorized (raw) shifts
This section explains how to update shifts that have not been processed for payroll:
Update categorized shift for an employee
You can update the information of a categorized shift.
You can only update shifts that have not been processed for payroll. Shifts are processed for payroll at the cutoff date.
Make the request
Make a PATCH request to the Update a time tracking shift endpoint.
In the path:
In the body:
Update uncategorized (raw) shift for an employee
You can update the information of an uncategorized shift.
You can only update shifts that have not been processed for payroll. Shifts are processed for payroll at the cutoff date.
Make the request
Make a PATCH request to the Update a raw time tracking shift endpoint.
In the path:
In the body:
Delete shift for a contract
You can delete a shift for a contract by using the external_id of the shift.
You can only delete shifts that have not been processed for payroll. Shifts are processed for payroll at the cutoff date.
Correction shifts
When you need to adjust hours for shifts that have already been processed for payroll, you can use correction shifts. Corrections create a new shift entry that adjusts the payable hours of the original shift. The correction will be processed in the next payroll cycle, ensuring accurate compensation without modifying historical payroll data.
Before using correction shifts, keep in mind the following aspects:
- Correction shifts can only be submitted for categorized shifts, not for uncategorized shifts.
- Corrections can only be submitted for shifts that have already been processed. Unprocessed shifts can be corrected with an update.
- Correction shifts cannot be submitted for another correction shift
- Correction shifts cannot be updated but can be deleted
To submit a correction, use the same Create a time tracking shift endpoint, by specifying CORRECTION_DELTA as the shift_type and including a corrections array with additional fields to specify the correction details.
Identify the shift to correct
For example, you may have previously created a shift with 10 total payable hours and this shift has been already processed for payroll. If you later discover that the actual hours worked were 7.5, which requires a reduction of 2.5 hours, note the original shift’s external_id.
Submit the correction
Make a POST request to the Create a time tracking shift endpoint with the correction details.
In the body:
Manage shift rates
Shift rates are used in payroll calculations to define the amount of salary to be paid for a specific shift. The shift rate types are:
Create a shift rate
You can create shift rates for your organization, which you can then map to individual shifts when adding them.
Retrieve a shift rate
You can retrieve a shift rate using the external_id of the shift rate.
Make the request
Make a GET request to the Retrieve a single time tracking shift rate endpoint.
Where:
List shift rates
You can retrieve the list of shift rates for your organization.
Update a shift rate
You can update a shift rate if it’s not being used in any shift, by using the external_id of the shift rate.
Only shift rates that are not used in any shift can be updated.
Make the request
Make a PATCH request to the Update a time tracking shift rate endpoint.
In the path:
In the body:
Delete a shift rate
You can delete a shift rate if it’s not being used in any shift, by using the external_id of the shift rate.
Only shift rates that are not used in any shift can be deleted.