Time Tracking
Public API

Execute Time Tracking Import

Changed on

Executes a DRAFT time tracking import: every row is committed as a time tracking record and the import moves to COMPLETE. The work runs synchronously in one transaction, so either every row is committed or none is and the import is left in DRAFT; retrying after a 5xx is therefore safe. Every row must be free of validation errors first - correct them through the row endpoints, or the request is rejected and names the rows still failing.

OAuth Scopes: time_tracking:imports.write

post/api/v1/time-tracking/imports/{id}/execute

Request

Path parameters

idinteger required

The import ID.

Response

The import was executed. The import is returned in COMPLETE, with completedAt populated; the row endpoints report the timeTrackingId each row created.

idinteger

Identifier for the import.

status'DRAFT' | 'COMPLETE' | 'DELETED'

Where the import is in its lifecycle. DRAFT imports have not been executed yet.

fileSizeinteger

Size of the stored file in bytes.

rowCountinteger

Total number of data rows parsed out of the file.

errorRowCountinteger

Number of rows currently failing validation.

columnMappingobject

BambooHR field name to zero-indexed CSV column position. Unmapped optional fields are omitted.

createdAtstring date-time

When the import was created.

updatedAtstring date-time nullable

When the import was last modified. Null if it has not been modified since creation.

completedAtstring date-time nullable

When the import was executed. Null while DRAFT, and for imports completed before completion times were recorded.

deletedAtstring date-time nullable

When the import was soft-deleted. Null for active imports.

Example response

{
  "id": 77,
  "status": "DRAFT",
  "fileSize": 721,
  "rowCount": 25,
  "errorRowCount": 3,
  "columnMapping": {
    "employeeNumber": 0,
    "dateWorked": 1,
    "payRate": 2,
    "rateType": 3,
    "hoursWorked": 4
  },
  "createdAt": "2026-05-12T22:13:26Z"
}

Changes