Time Tracking
Public API

Bulk Upsert Employee Enrollments

Changed on

Bulk enables, disables, or reassigns employee enrollments. The body is a top-level JSON array of between 1 and 1000 upsert records; each record requires employeeId and applies the same merge-patch semantics as the single-employee PATCH. Request-level validation (payload shape, record cap, missing employeeId) runs synchronously; the records themselves are applied asynchronously, so the response is 202 with a requestId for log correlation rather than the resulting enrollments. Confirm the final state by reading the enrollments back through GET /api/v1/time-tracking/employees. Per-record processing errors, such as an unknown employeeId or configurationId, do not surface in the response. Send atomic=true to commit the whole batch as one unit instead, in which case any per-record failure aborts the batch and returns 422 with nothing applied.

OAuth Scopes: time_tracking:employees.write

post/api/v1/time-tracking/employees/bulk-upsert

Request

Query parameters

atomicboolean

When true, the whole batch is committed as a single transaction and any per-record failure returns 422 with nothing applied. Defaults to false, which keeps the successful records and silently drops the failing ones.

Headers

Idempotency-Keystring

Optional client-supplied key for safe retries. Replaying the same key with the same body and the same atomic mode returns the original response; reusing it with either changed is a conflict.

Request body

employeeIdinteger required

The employee the record applies to.

enabledboolean

True to enable time tracking for the employee, false to disable it. Disabling retains the enrollment record for history.

configurationIdinteger nullable

The configuration to enroll the employee in. Null falls back to the company's GLOBAL configuration. Cannot be sent in the same record that sets enabled to false.

enabledOnstring date

Effective date for the enable, in YYYY-MM-DD format. Only honored while enabled is being set to true; defaults to today.

Example request

[
  {
    "employeeId": 101,
    "enabled": true,
    "configurationId": 3,
    "enabledOn": "2026-06-01"
  }
]

Response

The batch has been accepted.

requestIdstring required

Correlation id for the accepted batch. Returned for log correlation only; there is no status polling endpoint.

messagestring required

How to confirm the final enrollment state.

Example response

{
  "requestId": "8b3e1c2a-6b1f-4f0e-9a2b-2c8f0a1d3e4f",
  "message": "Your bulk upsert has been accepted and is being processed. Verify final enrollment state via GET /api/v1/time-tracking/employees."
}

Changes