Time Tracking
Public API

Retrieves a single timesheet by its ID. The status is derived at read time (OPEN, PENDING_APPROVAL, or APPROVED) and type is returned in UPPER_SNAKE_CASE (SINGLE, CLOCK, MULTIPLE, or HOUR). Timesheets for pay periods that have not started yet return 404.

OAuth Scopes: time_tracking:timesheets

get/api/v1/time-tracking/timesheets/{id}

Request

Path parameters

idinteger required

The timesheet ID.

Response

Successfully retrieved the timesheet.

idinteger

Identifier for the timesheet.

employeeIdinteger

The employee this timesheet belongs to.

type'SINGLE' | 'CLOCK' | 'MULTIPLE' | 'HOUR'

Tracking method snapshotted from the configuration at period start.

startDatestring date

First date of the pay period (inclusive).

endDatestring date

Last date of the pay period (inclusive).

status'OPEN' | 'PENDING_APPROVAL' | 'APPROVED'

Derived approval state.

totalHoursnumber float

Sum of all hours across regular, overtime, holiday, and approved PTO.

overtimeHoursnumber float

Subset of totalHours that falls into the overtime rate bucket.

approvedByinteger nullable

The user who approved the timesheet. Null until approved.

approvedAtstring date-time nullable

When the timesheet was approved. Null until approved.

createdAtstring date-time

When the timesheet record was created.

updatedAtstring date-time

When the timesheet was last modified.

hoursLastChangedAtstring date-time

When the timesheet's hours were last changed. Send this value back as the approval request's lastChangedAt. Distinct from updatedAt because hours are stored separately from the timesheet row.

Example response

{
  "id": 100,
  "employeeId": 42,
  "type": "CLOCK",
  "startDate": "2026-03-16",
  "endDate": "2026-03-29",
  "status": "PENDING_APPROVAL",
  "totalHours": 80,
  "createdAt": "2026-03-16T00:00:00Z",
  "updatedAt": "2026-03-29T17:00:00Z",
  "hoursLastChangedAt": "2026-03-29T17:00:00Z"
}

Changes