BlueSuite Developers
REST API v1

Timesheets and time entries

Timesheets and time entries in the BlueSuite REST API

List timesheets, inspect their entries, and update approval status. There is no timesheet creation endpoint; create time entries instead. Both resources use timesheets:read / timesheets:write scopes.

Time entries can use explicit start/end times or total_time without invented clock times. total_time is an integer number of minutes, from 0 to 1,440. Dates must be real calendar dates; time inputs must be valid clock times. The create route defaults the user to the authenticated acting user when user_id is omitted. Resolve other users through Users. An explicit hourly_rate override requires a manager or higher; omitting it lets the stored labor rate apply, while null leaves the entry uncosted.

Associate an entry with a job, request, quote, or service-plan subscription as supported by the fields below. Do not supply conflicting parent associations. Updates preserve omitted fields and recalculate duration when timing changes.

GET /api/v1/time-entries

GET /api/v1/time-entries

Required scopes: timesheets:read.

Query parameters

FieldType / accepted valuesRequiredDetails
pageintegerNoPage number, starting at 1. Default: 1.
per_pageintegerNoRecords per page, from 1 to 100. Default: 25. minimum: 1. maximum: 100.
searchstringNoSearch text. maxLength: 100.
sort_bystringNoSort column. See the supported columns below when listed.
sort_direction"asc", "desc"NoSort direction. Default: "desc".
start_datestringNoInclusive start date, YYYY-MM-DD.
end_datestringNoInclusive end date, YYYY-MM-DD.
user_idstringNoFilter by user UUID from GET /users.
job_idstringNoFilter by job ID.
request_idstringNoFilter by request ID.
quote_idstringNoFilter by quote ID.
service_plan_subscription_idstringNoFilter by subscription ID.

Response

200 with { "success": true, "data": [...], "pagination": { "page": 1, "per_page": 25, "total_pages": 1 } }.

See response conventions and errors.

POST /api/v1/time-entries

POST /api/v1/time-entries

Required scopes: timesheets:write.

JSON body

FieldType / accepted valuesRequiredDetails
start_datestringYesFormat: date.
end_datestringYesFormat: date.
start_timestring or nullNo
end_timestring or nullNo
total_timeintegerNominimum: 0. maximum: 1440.
user_idstring or nullNo
hourly_ratenumber or nullNo
descriptionstring or nullNo
job_idinteger or nullNo
request_idinteger or nullNo
quote_idinteger or nullNo
service_plan_subscription_idinteger or nullNo

Unknown body fields are rejected. Conditional requirements are explained above.

Response

201 with { "success": true, "data": ... }. The data contains the result of the operation.

See response conventions and errors.

GET /api/v1/timesheets

GET /api/v1/timesheets

Required scopes: timesheets:read.

Query parameters

FieldType / accepted valuesRequiredDetails
pageintegerNoPage number, starting at 1. Default: 1.
per_pageintegerNoRecords per page, from 1 to 100. Default: 25. minimum: 1. maximum: 100.
searchstringNoSearch text. maxLength: 100.
sort_bystringNoSort column. See the supported columns below when listed.
sort_direction"asc", "desc"NoSort direction. Default: "desc".
start_datestringNoInclusive start date, YYYY-MM-DD.
end_datestringNoInclusive end date, YYYY-MM-DD.
user_idstringNoFilter by user UUID from GET /users.
statusstringNoFilter by status.

Response

200 with { "success": true, "data": [...], "pagination": { "page": 1, "per_page": 25, "total_pages": 1 } }.

See response conventions and errors.

PUT /api/v1/time-entries/:id

PUT /api/v1/time-entries/:id

Required scopes: timesheets:write.

Path parameters: id. Use positive integer record IDs from this workspace.

JSON body

FieldType / accepted valuesRequiredDetails
start_datestringNoFormat: date.
end_datestringNoFormat: date.
start_timestring or nullNo
end_timestring or nullNo
total_timeintegerNominimum: 0. maximum: 1440.
user_idstring or nullNo
hourly_ratenumber or nullNo
descriptionstring or nullNo
job_idinteger or nullNo
request_idinteger or nullNo
quote_idinteger or nullNo
service_plan_subscription_idinteger or nullNo

Unknown body fields are rejected. Conditional requirements are explained above.

Response

200 with { "success": true, "data": ... }. The data contains the result of the operation.

See response conventions and errors.

DELETE /api/v1/time-entries/:id

DELETE /api/v1/time-entries/:id

Required scopes: timesheets:write.

Path parameters: id. Use positive integer record IDs from this workspace.

No request body.

Response

200 with { "success": true, "data": ... }. The data contains the result of the operation.

See response conventions and errors.

GET /api/v1/timesheets/:id

GET /api/v1/timesheets/:id

Required scopes: timesheets:read.

Path parameters: id. Use positive integer record IDs from this workspace.

Response

200 with { "success": true, "data": ... }. The data contains the result of the operation.

See response conventions and errors.

PUT /api/v1/timesheets/:id/status

PUT /api/v1/timesheets/:id/status

Required scopes: timesheets:write.

Path parameters: id. Use positive integer record IDs from this workspace.

JSON body

FieldType / accepted valuesRequiredDetails
status"draft", "pending", "approved", "rejected"Yes

Unknown body fields are rejected. Conditional requirements are explained above.

Response

200 with { "success": true, "data": ... }. The data contains the result of the operation.

See response conventions and errors.

On this page