Timesheets API
Endpoints for managing weekly timesheets and individual time entries.
List My Timesheets
Returns timesheets owned by the current user.
GET /timesheets?status={status}&limit={limit}
Query Parameters:
status(optional): Filter byPending,Submitted,Approved, orRejectedlimit(optional): Maximum results (default 50)
Response: 200 OK
{
"data": [
{
"id": 42,
"employee": 5,
"date_start": "2026-04-05",
"date_end": "2026-04-11",
"status": "Pending",
"total_time": "32:30",
"total_minutes": 1950
}
],
"total": 10,
"page": 1,
"nextPage": null
}
Create Current Week Timesheet
Creates a timesheet for the current week (Sunday–Saturday). If one already exists, the existing one is returned.
POST /timesheets/create-current
Response: 201 Created (newly created) or 200 OK (already exists)
{
"timesheet": {
"id": 43,
"employee": 5,
"date_start": "2026-04-05",
"date_end": "2026-04-11",
"status": "Pending",
"days": [
{"date": "2026-04-05", "display": "(Sun) 05 Apr"},
{"date": "2026-04-06", "display": "(Mon) 06 Apr"}
]
},
"created": true
}
Create Previous Week Timesheet
Creates a timesheet for the week before the reference timesheet.
POST /timesheets/{timesheetId}/create-previous
Response: 201 Created or 200 OK if the previous week's timesheet already exists.
Create Next Week Timesheet
Creates a timesheet for the week after the reference timesheet.
POST /timesheets/{timesheetId}/create-next
Response: 201 Created or 200 OK if the next week's timesheet already exists.
Get Timesheet Details
Returns a single timesheet with all of its time entries.
GET /timesheets/{timesheetId}
Response: 200 OK
{
"timesheet": {
"id": 42,
"date_start": "2026-04-05",
"date_end": "2026-04-11",
"status": "Pending",
"total_time": "16:30",
"total_minutes": 990,
"days": [
{"date": "2026-04-05", "display": "(Sun) 05 Apr"}
]
},
"entries": [
{
"id": 156,
"timesheet": 42,
"project": {"type": "Project", "id": 3, "display": "Mobile App Development"},
"date_start": "2026-04-06 09:00:00",
"date_end": "2026-04-06 17:30:00",
"details": "Implemented timesheet API",
"duration_minutes": 510,
"duration_hours": 8.5
}
],
"employee": {
"id": 5,
"name": "John Smith"
}
}
Submit Timesheet for Approval
Submits a timesheet for supervisor approval. If the user is an admin without a supervisor, the timesheet is auto-approved.
POST /timesheets/{timesheetId}/submit
Response: 200 OK
{
"message": "Timesheet Submitted",
"timesheet": {
"id": 42,
"status": "Submitted",
"total_time": "40:00"
}
}
Add Time Entry
Adds a new time entry to a timesheet. The date must fall within the timesheet period.
POST /timesheets/{timesheetId}/entries
Request Body:
{
"date": "2026-04-07",
"start_time": "09:00:00",
"end_time": "17:30:00",
"project": 3,
"details": "Implemented new API endpoints"
}
Required Fields: date, start_time, end_time
Response: 201 Created
Error Response: 400 Bad Request for invalid times or dates outside the timesheet period. Cannot add entries to approved timesheets.
Update Time Entry
Updates an existing time entry. Cannot modify entries in approved timesheets.
POST /timesheets/entries/{entryId}/update
Request Body: Any subset of date, start_time, end_time, project, details.
Response: 200 OK
Delete Time Entry
Deletes a time entry. Cannot delete entries from approved timesheets.
POST /timesheets/entries/{entryId}/delete
Response: 200 OK
Get Direct Reports' Timesheets
Returns timesheets from employees who report to the current user. Use for managers reviewing their team's timesheets.
GET /timesheets/direct-reports?status={status}&limit={limit}
Response: 200 OK
{
"data": [
{
"id": 44,
"employee": 8,
"employee_name": "Jane Doe",
"date_start": "2026-04-05",
"date_end": "2026-04-11",
"status": "Submitted",
"total_time": "42:15"
}
],
"total": 5,
"page": 1,
"nextPage": null
}
Get Pending Timesheets for Approval
Convenience endpoint that returns timesheets with Submitted status from direct reports.
GET /timesheets/direct-reports/pending
Response: 200 OK
Approve Timesheet
Approves a subordinate's submitted timesheet. Only supervisors or admins can approve.
POST /timesheets/{timesheetId}/approve
Response: 200 OK
{
"message": "Timesheet Approved",
"timesheet": {
"id": 44,
"status": "Approved",
"total_time": "42:15"
}
}
Error Response: 403 Forbidden if not the supervisor.
Reject Timesheet
Rejects a subordinate's submitted timesheet. The employee can resubmit after corrections.
POST /timesheets/{timesheetId}/reject
Response: 200 OK
Get Available Projects
Returns projects available for time entries. Returns only assigned projects unless the "Make All Projects Available to Employees" setting is enabled.
GET /timesheets/projects
Response: 200 OK
{
"data": [
{"id": 1, "name": "Website Redesign"},
{"id": 3, "name": "Mobile App Development"}
]
}
Timesheet Status Values
- Pending: Draft, owner can still edit entries
- Submitted: Awaiting supervisor approval
- Approved: Approved by supervisor; entries are locked
- Rejected: Rejected by supervisor; owner can correct and resubmit