Time Entries API
Endpoints
Section titled “Endpoints”GET /api/time-entries
Section titled “GET /api/time-entries”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" } ]}GET /api/time-entries/summary
Section titled “GET /api/time-entries/summary”Weekly summary grouped by date with total/billable hours.
Permission: view:time
Query params: user_id, date_from, date_to
GET /api/time-entries/pending-count
Section titled “GET /api/time-entries/pending-count”Count of draft entries pending approval for the current user’s team.
Permission: view:time
Response:
{ "pending_count": 5 }POST /api/time-entries
Section titled “POST /api/time-entries”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)"}PUT /api/time-entries/:id
Section titled “PUT /api/time-entries/:id”Update a time entry. Cannot edit approved entries (except executives). Editing a rejected entry resets it to draft.
Permission: update:time
DELETE /api/time-entries/:id
Section titled “DELETE /api/time-entries/:id”Delete a time entry. Cannot delete approved entries (except executives).
Permission: update:time
POST /api/time-entries/:id/approve
Section titled “POST /api/time-entries/:id/approve”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
draftstatus - Cannot approve your own entries
- Managers can only approve direct reports
POST /api/time-entries/:id/reject
Section titled “POST /api/time-entries/:id/reject”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.
POST /api/time-entries/approve-bulk
Section titled “POST /api/time-entries/approve-bulk”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 }