PSOhub API: Timesheets
Learn how to retrieve and create timesheet entries in PSOhub via the API
Published: 1 June 2026
Audience
-
Admin
Objective
This reference article covers the PSOhub API endpoints for retrieving and creating timesheet entries. Use these endpoints to query time bookings for a project or user and to create new timesheet entries programmatically.
Prerequisites
You must have Admin user access in PSOhub.
You must have API access enabled for your PSOhub account.
ProjectID, ContractLineID, AccountID, and RoleID must be known. These can be retrieved via the relevant API endpoints or from the PSOhub OData feed.How to Get Timesheets
Steps
-
Use this endpoint to retrieve timesheet entries filtered by project and/or user.
Endpoint
GET https://www.psohubapp.com/rest/psohubapi/v1/timesheets?projectid=693467340
2. Use the limit parameter to control the number of records returned. If not specified, the API returns a maximum of 50 timesheets per request. Use date filtering to retrieve additional sets of records beyond this limit.
⚠️ Important: Timesheets are always connected to both a project and a user. You must filter on at least one of the two parameters (projectid or accountid) for the request to be valid.
Example response
json
[ { "DateTimeFrom": "2024-08-14T08:00:00.000Z", "DateTimeTo": "2024-08-14T12:00:00.000Z", "NumberOfHours": 4, "AccountID": 39406496739494241, "ProjectID": 13229323915858894, "ContractLineID": 7036874429341080, "RoleID": 9851624184876568, "AccountName": "Martijn vd Hoeden", "ProjectName": "Advice Hours Vd Hoeden", "ContractLineName": "10.002 - Tax Services", "RoleName": "Project Manager", "Description": "vpb meeting", "InvoiceNumber": "INV-2025-03", "ExternalInvoiceNumber": "231", "TaskID": "232362356236231", "CreationDateTime": "2024-08-14T08:00:00.000Z" } ]
Response fields
| Name | Type | Description |
|---|---|---|
| DateTimeFrom | DateTime | Start date and time of the time booking. |
| DateTimeTo | DateTime | End date and time of the time booking. |
| NumberOfHours | Decimal | Total number of hours booked. |
| AccountID | Integer/Long | The PSOhub ID of the user account that logged the time entry. |
| ProjectID | Integer/Long | The ID of the project. |
| ContractLineID | Integer/Long | The ID of the contract line. |
| RoleID | Integer/Long | The ID of the project role for the user. |
| AccountName | String | The name of the user who logged the time entry. |
| ProjectName | String | The name of the project, for easy reference. |
| ContractLineName | String | The name of the contract line, for easy reference. |
| RoleName | String | The name of the project role, for easy reference. |
| Description | String | The description the user added for the booking. |
| InvoiceNumber | String | The PSOhub invoice number. Draft invoices return Draft as the number. |
| ExternalInvoiceNumber | String | Invoice number from a connected financial integration, or set via the API. Only appears when a financial integration is connected or if updated via API. |
| TaskID | Integer/Long | The ID of the task the time was booked against, if applicable. |
| CreationDateTime | DateTime | The date and time the timesheet entry was created. |
| ApprovedDatePM | DateTime | The date the project manager approved the timesheet. |
| ApprovedByPM | Boolean | Whether the entry has been approved by the project manager. |
| ApprovedDateTL | DateTime | The date the team lead approved the timesheet. |
| ApprovedByTL | Boolean | Whether the entry has been approved by the team lead. |
| SalesRate | Decimal | The selling rate for this time entry, based on the resource and role combination on the project. |
| CostRate | Decimal | The cost rate for this time entry, based on the resource and role combination on the project. |
How to Create a Timesheet
Steps
-
Use this endpoint to create a new timesheet entry on a project.
Endpoint
POST https://www.psohubapp.com/rest/psohubapi/v1/timesheets
Request fields
| Name | Required | Type | Description |
|---|---|---|---|
| DateTimeFrom | Yes | DateTime | Start date and time of the booking. |
| DateTimeTo | Yes | DateTime | End date and time of the booking. |
| NumberOfHours | Yes | Decimal | Total number of hours booked. |
| AccountID | Yes | Integer/Long | The PSOhub ID of the user account booking the time. |
| ProjectID | Yes | Integer/Long | The ID of the project. |
| ContractLineID | Yes | Integer/Long | The ID of the contract line. |
| RoleID | Yes | Integer/Long | The ID of the project role for the user. |
| Description | No | String | An optional description for the booking. |
Example request body
json
{ "DateTimeFrom": "2024-09-23T08:00:00.000Z", "DateTimeTo": "2024-09-23T16:00:00.000Z", "NumberOfHours": 8, "AccountID": 39406496739494241, "ProjectID": 13229323915858894, "ContractLineID": 7036874429341080, "RoleID": 9851624184876568, "Description": "Booked via API" }
Response
On success, the API returns the unique TimesheetID for the created entry.
json
{ "TimesheetID": "ef2e44e2-9126-4012-9e02-25c1eb12e98d" }