---
title: "Execute Time Tracking Import"
method: POST
path: "/api/v1/time-tracking/imports/{id}/execute"
tags: ["Time Tracking", "Public API"]
---

# Execute Time Tracking Import

`POST /api/v1/time-tracking/imports/{id}/execute`

## Request

- Base URL: `https://companySubDomain.bamboohr.com`
- URL: `https://companySubDomain.bamboohr.com/api/v1/time-tracking/imports/{id}/execute`
- Auth: one of:
  - HTTP basic
  - OAuth 2
    - Authorization code: `/authorize.php`
    - Token URL: `/token.php` scopes: `time_tracking:imports.write`
- TypeScript: <https://skmtc.dev/bamboohr/apis/bamboohr-api/docs/api/v1/time-tracking/imports/:id/execute/post.ts> (a function with typed inputs; its response is checked against the schema)

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

## Path parameters

- `id` integer, required

## Response `200`

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

- TimeTrackingTimeTrackingImportV1: A time tracking import: an uploaded CSV of hours, its column mapping, and its row counts.
  - `id` integer: Identifier for the import.
  - `status` 'DRAFT' | 'COMPLETE' | 'DELETED': Where the import is in its lifecycle. `DRAFT` imports have not been executed yet.
  - `fileSize` integer: Size of the stored file in bytes.
  - `rowCount` integer: Total number of data rows parsed out of the file.
  - `errorRowCount` integer: Number of rows currently failing validation.
  - `columnMapping` object: BambooHR field name to zero-indexed CSV column position. Unmapped optional fields are omitted.
  - `createdAt` string, date-time: When the import was created.
  - `updatedAt` string, date-time, nullable: When the import was last modified. Null if it has not been modified since creation.
  - `completedAt` string, date-time, nullable: When the import was executed. Null while `DRAFT`, and for imports completed before completion times were recorded.
  - `deletedAt` string, date-time, nullable: When the import was soft-deleted. Null for active imports.

## Other responses

- `401`: Unauthorized. Missing or invalid authentication.
- `403`: Forbidden. Insufficient permissions.
- `404`: Import not found, or soft-deleted.
- `409`: The import has already been executed, or another execute of it is still running.
- `422`: The import has rows failing validation, the import ID is not a positive integer, or a row that passed validation could no longer be committed. Rows failing validation are reported with `code: IMPORT_HAS_ERRORS` and named by `errorRowIds`.

## Changes

- **2026-11-03** `922fc15f43a7`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/bamboohr/apis/bamboohr-api/changes/api/v1/time-tracking/imports/:id/execute/post.md)

---

[API](https://skmtc.dev/bamboohr/apis/bamboohr-api.md) - [All operations](https://skmtc.dev/bamboohr/apis/bamboohr-api/llms.txt) - [OpenAPI document](https://skmtc.dev/bamboohr/apis/bamboohr-api/revisions/922fc15f43a7?raw)
