Skip to content

Time Entries API

List time entries with optional filters. Data scoped by access level.

Permission: view:time

Query params: user_id, task_id, budget_id, date_from, date_to, week_of, status

Response:

{
"time_entries": [
{
"id": "uuid",
"user_id": "user-id",
"task_id": "task-id",
"budget_id": "budget-id",
"date": "2026-03-10",
"hours": 2.5,
"description": "Worked on feature",
"billable": 1,
"billable_hours": 2.5,
"status": "draft",
"approved_by": null,
"approved_at": null,
"rejected_by": null,
"rejected_at": null,
"rejection_reason": null,
"user_name": "Jane Smith",
"user_picture": "https://...",
"person_id": "person-id",
"task_title": "Build login page",
"budget_name": "Project Alpha"
}
]
}

Weekly summary grouped by date with total/billable hours.

Permission: view:time

Query params: user_id, date_from, date_to

Count of draft entries pending approval for the current user’s team.

Permission: view:time

Response:

{ "pending_count": 5 }

Create a time entry. Status is auto-set based on access level (draft for leads/employees, approved for managers+).

Permission: update:time

Body:

{
"date": "2026-03-10",
"hours": 2.5,
"description": "Optional description",
"task_id": "optional-task-id",
"budget_id": "optional-budget-id",
"billable": true,
"user_id": "optional-target-user (managers+ only)"
}

Update a time entry. Cannot edit approved entries (except executives). Editing a rejected entry resets it to draft.

Permission: update:time

Delete a time entry. Cannot delete approved entries (except executives).

Permission: update:time

Approve a single draft time entry. Optionally override billable status and billable hours.

Permission: manage:time

Body (optional):

{
"billable": true,
"billable_hours": 2.0
}

Validation:

  • Entry must be in draft status
  • Cannot approve your own entries
  • Managers can only approve direct reports

Reject a single draft time entry.

Permission: manage:time

Body:

{ "reason": "Please add more detail to the description" }

Validation: Same as approve, plus reason is required.

Approve multiple entries at once. Skips entries that are not draft, are the approver’s own, or not in the approver’s team.

Permission: manage:time

Body:

{ "ids": ["entry-id-1", "entry-id-2"] }

Response:

{ "approved_count": 2 }