Time Entries
Log and manage tracked time. Entries flow through an approval workflow and can be rolled up into invoices.
All endpoints require authentication with an API key via Authorization: Bearer anch_... — see Authentication. A :write scope implicitly includes its :read scope.
Quick example
curl "https://your-domain.com/api/time-entries?dealId=dl_123&approvalStatus=approved" \
-H "Authorization: Bearer anch_your_api_key"Endpoints
/api/time-entries/api/time-entries/api/time-entries/{id}/api/time-entries/{id}/api/time-entries/{id}/api/time-entries/{id}/approve/api/time-entries/{id}/payGET/api/time-entries
Query parameters
| Field | Type | Description |
|---|---|---|
taskId | string | Filter to a specific task |
dealId | string | Filter to a specific deal |
deliverableId | string | Filter to a specific deliverable |
userId | string | Filter to entries logged by a user |
approvalStatus | string | pending, approved, or rejected |
startDate | integer | Only entries on/after this time (Unix ms) |
endDate | integer | Only entries on/before this time (Unix ms) |
sortOrder | string | asc or desc |
limit | integer | Page size (default: 50) |
offset | integer | Pagination offset (default: 0) |
Response (200)
{
"data": [ { "id": "te_...", "durationMinutes": 90, "billable": true, ... } ],
"meta": { "total": 210, "limit": 50, "offset": 0 }
}POST/api/time-entries
Body fields
| Field | Type | Description |
|---|---|---|
durationMinutesrequired | integer | Duration in minutes |
userId | string | User the entry belongs to (defaults to key owner context) |
taskId | string | Associated task |
dealId | string | Associated deal |
deliverableId | string | Associated deliverable |
description | string | What the time was spent on |
startTime | integer | string | Start time — Unix ms or ISO string |
endTime | integer | string | End time — Unix ms or ISO string |
billable | boolean | Whether the time is billable (default: true) |
hourlyRateCents | integer | Override rate in cents |
Response (201)
{ "id": "te_V1StGXR8Z5jdHi6B" }GET/api/time-entries/{id}
Response (200)
{
"data": {
"id": "te_V1StGXR8Z5jdHi6B",
"organizationId": "org_4f90...",
"userId": "usr_...",
"taskId": "tsk_...",
"dealId": "dl_...",
"durationMinutes": 90,
"description": "Implementation work",
"billable": true,
"hourlyRateCents": 15000,
"approvalStatus": "pending",
"createdAt": 1736899200000,
"updatedAt": 1736899200000,
"deletedAt": null
}
}PATCH/api/time-entries/{id}
PUT is also accepted. All fields are optional; only provided fields are updated.
Body fields
| Field | Type | Description |
|---|---|---|
durationMinutes | integer | Duration in minutes |
userId | string | User the entry belongs to (defaults to key owner context) |
taskId | string | Associated task |
dealId | string | Associated deal |
deliverableId | string | Associated deliverable |
description | string | What the time was spent on |
startTime | integer | string | Start time — Unix ms or ISO string |
endTime | integer | string | End time — Unix ms or ISO string |
billable | boolean | Whether the time is billable (default: true) |
hourlyRateCents | integer | Override rate in cents |
Response (200)
{ "ok": true }DELETE/api/time-entries/{id}
Soft delete. With session auth this requires a manager or admin role.
Response (200)
{ "ok": true }POST/api/time-entries/{id}/approve
Requires a manager or admin role. Sets the entry's approval status.
Body fields
| Field | Type | Description |
|---|---|---|
approvalStatusrequired | string | pending, approved, or rejected |
rejectionReason | string | Reason shown to the submitter when rejecting |
Response (200)
{ "id": "te_...", "approvalStatus": "approved", ... }This endpoint returns the raw updated time entry object rather than the { data } envelope.
POST/api/time-entries/{id}/pay
Requires a manager or admin role. Records how the time was paid out.
Body fields
| Field | Type | Description |
|---|---|---|
paymentMethod | string | cash, check, business_account, personal_card, or other |
Response (200)
{ "ok": true }Enumerations
Approval statuses
pendingapprovedrejected
Notes
- The URL segment is hyphenated: /api/time-entries.