post
https://{subdomain}.workable.com/spi/v3/time-tracking/time-entries
Bulk creates complete time entries for one or more employees (max 500). Required scope: w_time_tracking.
Recent Requests
Log in to see full request history
| Time | Status | User Agent | |
|---|---|---|---|
Retrieving recent requests… | |||
Loading…
This endpoint uses thew_time_trackingscope, which must be enabled through the Integrations section found within the Settings menu.
This endpoint supports both user tokens and account tokens.
Unlike the single-entry endpoint, bulk creation only supports complete entries where bothclock_in_timeandclock_out_timeare provided for each item.
A maximum of 500 entries can be submitted per request.
Validation rules
- Time format: ISO 8601 with a timezone designator — UTC (
Z) or a numeric offset (e.g.2024-09-27T09:00:00Z,2024-09-27T11:00:00+02:00). Times are stored in UTC. - Seconds and milliseconds: Truncated to the start of the minute server-side.
- Clock-out time: Must be greater than or equal to clock-in time, and on the same date as clock-in or exactly at the start of the next day in the employee's timezone.
- Employee start date: Time entries prior to an employee's start date are not permitted.
- Future entries: Clock-out time cannot be after the end of the current day in the employee's timezone.
- Active clocks: Active clocks are treated as conflicting entries if they overlap with the new entry. Use
override_overlapping: trueto archive them automatically.
Response
Returns an array of the created entries. clock_in_time and clock_out_time are returned as ISO 8601 in UTC (with the Z suffix) — see GET /time-tracking/time-entries.
[
{
"uuid": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"employee_id": "3fc9a811",
"clock_in_time": "2024-01-15T09:00:00.000Z",
"clock_out_time": "2024-01-15T17:30:00.000Z",
"note": "Regular shift"
},
{
"uuid": "b2c3d4e5-f6a7-8901-bcde-f12345678901",
"employee_id": "4ad7b922",
"clock_in_time": "2024-01-15T08:00:00.000Z",
"clock_out_time": "2024-01-15T16:00:00.000Z",
"note": null
}
]Error responses
| Status | Code | Description |
|---|---|---|
| 400 | Invalid request body (e.g. invalid format, too many entries) | |
| 400 | timeEntry.bulkValidationFailed | One or more entries failed validation. See below for the error response format. |
Validation error response
When validation fails for one or more entries, the response includes a structured errors array with details for each failed entry. Entries are processed as a transaction — if any entry fails, the entire request fails.
{
"error": "Validation failed for one or more time entries.",
"code": "timeEntry.bulkValidationFailed",
"errors": [
{
"index": 0,
"employee_id": "12345",
"code": "clockIn.conflictingEntriesExist",
"error": "There already exists an active clock."
},
{
"index": 2,
"employee_id": "67890",
"code": "timeEntry.previousToEmployeeStartDateNotPermitted",
"error": "Employees may not enter worked hours prior to their start date."
}
]
}Validation error codes
| Code | Description |
|---|---|
employee.notExists | Employee does not exist or is not active |
timeTrackingPolicy.notAssigned | Employee does not have a time tracking policy assigned |
timeTracking.erganiRestriction | This operation is not available for Ergani-related time tracking |
timeEntry.previousToEmployeeStartDateNotPermitted | Time entry is prior to employee's start date |
timeEntryCreate.futureDayNotPermitted | Entries after the end of day (in employee's timezone) are not allowed |
clockIn.conflictingEntriesExist | Cannot create entry when the employee already has an active clock |
clockOut.isBeforeClockIn | Clock-out time is before clock-in time |
timeEntryCreate.conflictingEntriesExist | Overlapping time entries exist (when override_overlapping is false) |
timeTracking.lockError | Concurrent modification error |
