Log a time entry
Logs time against any project the caller can read — their own or one shared with the organization by a teammate. The entry belongs to the caller and stays private to them. startedAt defaults to now. With endedAt, duration is derived; with only durationSeconds, endedAt = startedAt + duration. One of endedAt or durationSeconds is required (timers start via /v1/timer/start). Timestamps are strict RFC3339. isBillable defaults true.
View as MarkdownAuthorization
bearer In: header
Request Body
application/json
TypeScript Definitions
Use the request body type in TypeScript.
Response Body
application/json
application/json
application/json
application/json
application/json
curl -X POST "https://example.com/v1/time-entries" \ -H "Content-Type: application/json" \ -d '{ "projectId": "string" }'{ "entry": { "id": "string", "projectId": "string", "projectName": "string", "projectColor": "string", "clientName": "string", "description": "string", "startedAt": "2019-08-24T14:15:22Z", "endedAt": "2019-08-24T14:15:22Z", "durationSeconds": 0, "isRunning": true, "isBillable": true, "billingStatus": "string", "tags": [ { "id": "string", "name": "string", "color": "string", "created": "2019-08-24T14:15:22Z" } ] }}List time entries
The caller's OWN entries only — sharing a project never exposes anyone's hours, so there is no scope lens here. Ordered started_at descending, hard limit 500. from/to filter on started_at; tagId filters to entries carrying that tag.
Update an entry
Partial update. projectId must be readable by the caller (their own or an org-shared project). startedAt/endedAt are strict RFC3339; durationSeconds recomputes endedAt from startedAt (rejected on a running timer). endedAt must not precede startedAt; duration_seconds is recomputed whenever times change.