Skip to content
TTrackTimer
API documentation

List personal time entries

View Markdown

Read personal workspace history with project filtering and cursor pagination.

GET /api/v1/time-entries

Required scope: timers:read

Returns the key user's entries in its workspace: active, completed, and voided. Historical entries include archived projects or projects the user is no longer assigned to. This is not organization-wide history.

Request

Requires bearer authentication and timers:read. No body. Optional query parameters:

  • projectId: project UUID filtering the user's history.
  • limit: integer from 1 through 100, default 20.
  • cursor: opaque nextCursor from the preceding page; omit initially. Maximum 1,024 base64url characters.

There are no date, status, offset, or user filters. Unknown parameters are not supported filters. Entries sort by start time descending, then ID descending.

curl "https://www.tracktimer.app/api/v1/time-entries?limit=20&projectId=22222222-2222-4222-8222-222222222222" \
  --header "Authorization: Bearer $TRACKTIMER_API_KEY"

Response — 200

  • entries: array, possibly empty.
  • nextCursor: next-page string, or null if none was found.

Each entry contains:

  • id: entry UUID.
  • clientId, projectId: client and project UUIDs.
  • clientName, projectName: nonempty display names.
  • status: "active", "completed", or "voided".
  • billable: boolean. Nonbillable entries can still produce member earnings.
  • note: string up to 500 characters, or null.
  • startedAt: ISO 8601 timestamp with timezone offset, normally UTC Z.
  • endedAt: timestamp or null for an unfinished entry.
  • durationSeconds: nonnegative integer recorded duration, or null if not finalized. This is not a live elapsed value.
  • payRateCents: nonnegative integer hourly pay rate in cents, snapshotted on the entry.
  • earnings: decimal-dollar string or null. Completed entry earnings use duration and pay rate independently of billability. Active entries and entries without duration return null. Voided entries with recorded duration return "0".
  • currency: always "USD".

Duration and pay-rate integers are bounded by 2,147,483,647. Earnings strings have up to 12 fractional places, not necessarily two. Preserve decimal precision. Client billing rates and organizational profit fields are not included.

{
  "entries": [
    {
      "id": "33333333-3333-4333-8333-333333333333",
      "clientId": "11111111-1111-4111-8111-111111111111",
      "clientName": "Northstar",
      "projectId": "22222222-2222-4222-8222-222222222222",
      "projectName": "Website refresh",
      "billable": true,
      "note": "Homepage revisions",
      "startedAt": "2026-09-10T16:00:00.000Z",
      "payRateCents": 5000,
      "currency": "USD",
      "status": "completed",
      "endedAt": "2026-09-10T17:30:00.000Z",
      "durationSeconds": 5400,
      "earnings": "75"
    }
  ],
  "nextCursor": null
}

A valid project UUID with no matching personal history returns an empty list. Invalid limit, ID, or cursor text returns 400 INVALID_REQUEST; an undecodable payload returns 400 INVALID_CURSOR. Read pagination before requesting subsequent pages and shared errors for other failures.