List personal time entries
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: opaquenextCursorfrom 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, ornullif 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, ornull.startedAt: ISO 8601 timestamp with timezone offset, normally UTCZ.endedAt: timestamp ornullfor an unfinished entry.durationSeconds: nonnegative integer recorded duration, ornullif 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 ornull. 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.