> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://developer.projectmanager.com/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://developer.projectmanager.com/_mcp/server.

# Query Time Entries

GET https://api.projectmanager.com/api/data/timesheets

Retrieve a list of time entries that match an [OData formatted query](https://www.odata.org/).
            
A Timesheet is a collection of time entries for a particular Resource for a specific week.  Each time
entry records the number of whole minutes spent by this Resource on an activity. An activity can be a Task
in any project that Resource can access, or the activity can be an administrative task such as "Sick
Leave" or "Meetings".  When a time entry is linked to a Task, the number of minutes spent on the time entry
are recorded as time spent on the Task.  Time entries linked to an administrative tasks are grouped for
reporting but are not added to any Task within your Workspace.
            
Time entries are recorded in whole minutes.  If you specify a time entry in fractional hours, either using
the API or via the web application, the amount you specify will be converted to minutes and rounded to the
nearest neighbor using the rounding algorithm Midpoint-Away-From-Zero.
            
When a Timesheet is submitted for approval or approved, users are no longer permitted to create, update, or
delete time entries for that week.  Users with Global Admin level access can override this restriction and
continue to make changes to a Timesheet after approval.

Reference: https://developer.projectmanager.com/api-reference/timesheet/query-time-entries

## Authentication

- `Authorization` header (bearer token, required) — Bearer authentication of the form `Bearer <token>`, where token is your auth token.

## Request

### Query parameters

- `$top` (integer, optional) — The number of records to return
- `$skip` (integer, optional) — Skips the given number of records and then returns $top records
- `$filter` (string, optional) — Filter the expression according to oData queries
- `$orderby` (string, optional) — Order collection by this field.
- `$expand` (string, optional) — Include related data in the response

### Headers

- `x-integration-name` (string, optional) — The name of the calling system passed along as a header parameter

## Response

### 200

Success

- `error` (AstroError, optional, nullable) — If the API call failed, this will contain information about the error that occurred.
- `success` (boolean, optional) — True if the API call succeeded; false otherwise.
- `hasError` (boolean, optional) — True if the API call failed.
- `statusCode` (enum, optional) — The HTTP code of the response.
  - Allowed values: `Continue`, `SwitchingProtocols`, `Processing`, `EarlyHints`, `OK`, `Created`, `Accepted`, `NonAuthoritativeInformation`, `NoContent`, `ResetContent`, `PartialContent`, `MultiStatus`, `AlreadyReported`, `IMUsed`, `MultipleChoices`, `MovedPermanently`, `Found`, `SeeOther`, `NotModified`, `UseProxy`, `Unused`, `TemporaryRedirect`, `PermanentRedirect`, `BadRequest`, `Unauthorized`, `PaymentRequired`, `Forbidden`, `NotFound`, `MethodNotAllowed`, `NotAcceptable`, `ProxyAuthenticationRequired`, `RequestTimeout`, `Conflict`, `Gone`, `LengthRequired`, `PreconditionFailed`, `RequestEntityTooLarge`, `RequestUriTooLong`, `UnsupportedMediaType`, `RequestedRangeNotSatisfiable`, `ExpectationFailed`, `MisdirectedRequest`, `UnprocessableEntity`, `Locked`, `FailedDependency`, `UpgradeRequired`, `PreconditionRequired`, `TooManyRequests`, `RequestHeaderFieldsTooLarge`, `UnavailableForLegalReasons`, `InternalServerError`, `NotImplemented`, `BadGateway`, `ServiceUnavailable`, `GatewayTimeout`, `HttpVersionNotSupported`, `VariantAlsoNegotiates`, `InsufficientStorage`, `LoopDetected`, `NotExtended`, `NetworkAuthenticationRequired`
- `data` (list of TimesheetDto, optional) — If the API call succeeded, this will contain the results.

## Types

### AstroError

Information about an error that occurred within the ProjectManager API.

- `technicalError` (string, optional, nullable) — A technical description of the error that occurred. Not suitable for display to end users.
- `additionalErrors` (list of string, optional, nullable) — If additional errors beyond the main error in `Message` occurred, they will be listed here as individual messages.
- `validationErrors` (map from string to list of string, optional, nullable) — This contains a dictionary of validation errors. The key is the name of the field
- `message` (string, optional, nullable) — A description of the error that occurred. If your application has a user interface, show this message to explain what went wrong.

### TimesheetDto

A Timesheet entry is a single record that contains information about time spent by a person on a task. Each Timesheet entry object contains information about one task/day/person combination. A fully completed Timesheet will often contain multiple records for the same date range which must be combined to produce a finished Timesheet.

- `id` (string, optional) — A unique identifier of a timesheet data entry
- `resourceId` (string, optional) — The unique identifier of the resource who is preparing this Timesheet. You can filter on this value to measure the total work performed by this specific Resource.
- `taskId` (string, optional) — The unique identifier of the task worked on for this Timesheet. You can filter on this value to measure the total work performed against a specific Task.
- `projectId` (string, optional) — The unique identifier of the project worked on for this Timesheet. You can filter on this value to measure the total work performed against a specific Project.
- `date` (string, optional) — The date of this time entry record. You can filter on this value to obtain Timesheet data for a specific date range.
- `notes` (string, optional, nullable) — Notes associated with this Timesheet, if any
- `approved` (boolean, optional) — True if this Timesheet was approved by a person with the role of a Timesheet approver
- `approvalStatusId` (integer, optional) — Approval status of the timesheet entry. 1 = New (not submitted for approval) 2 = Submitted (submitted for approval, pending review) 3 = Approved (approved by the approver) 4 = Declined (declined by the approver)
- `hours` (double, optional) — Total Hours spent on this Task by this Resource on this specific Date
- `minutes` (integer, optional) — Total minutes spent on this Task by this Resource on this specific Date
- `modifiedDate` (string, optional) — Date and time (in UTC) that this timesheet entry was last modified.
- `task` (TimesheetTaskDto, optional, nullable) — The task associated with this timesheet entry
- `project` (TimeSheetProjectDto, optional, nullable) — The project associated with this timesheet entry
- `resource` (TimesheetResourceDto, optional, nullable) — The resource associated with this timesheet entry
- `adminType` (TimesheetAdminTypeDto, optional, nullable) — The administration type associated with this timesheet entry
- `files` (list of TimesheetFileDto, optional, nullable) — The list of files associated with this Timesheet, if any. This field will be present when you fetch a single object. When you query for multiple objects, this field is not included in results by default. To expand this field, specify the name of this field in the `$expand` parameter.
- `isCopied` (boolean, optional) — Indicates if the timesheet entry is copied from another week.

### TimesheetTaskDto

A Task is an individual element of work that must be performed to complete a Project. A Task can have one or more Resources assigned to it. Tasks can be linked to other Tasks to indicate whether they have a dependency or a connection.

- `id` (string, optional) — The unique identifier of this Task.
- `projectId` (string, optional) — The unique identifier of the Project to which this Task belongs.
- `shortId` (string, optional) — A short ID that can be used to refer to this Task. This short ID is guaranteed to be unique within your Workspace.
- `name` (string, optional) — The common name of this Task.
- `description` (string, optional) — A description of the work to be performed in this Task.
- `plannedStartDate` (string, optional, nullable) — The date when work on this Task is planned to begin. This value contains only the date in year-month-day format. For display, this date will always be shown as this same year-month-day regardless of time zone. For reporting purposes, this date is calculated against the official time zone of the Workspace. For example: A Task has a planned completion date of July 5, 2023 in a Workspace that has a time zone of US Pacific Time (GMT-7 or GMT-8, depending on daylight savings time). This project is considered overdue on 12:01 AM July 6th 2023 in US Pacific time.
- `plannedFinishDate` (string, optional, nullable) — The date when work on this Task is expected to complete. This value contains only the date in year-month-day format. For display, this date will always be shown as this same year-month-day regardless of time zone. For reporting purposes, this date is calculated against the official time zone of the Workspace. For example: A Task has a planned completion date of July 5, 2023 in a Workspace that has a time zone of US Pacific Time (GMT-7 or GMT-8, depending on daylight savings time). This project is considered overdue on 12:01 AM July 6th 2023 in US Pacific time.
- `actualStartDate` (string, optional, nullable) — If set, this is the actual date when work began on the Task. This value contains only the date in year-month-day format. For display, this date will always be shown as this same year-month-day regardless of time zone. For reporting purposes, this date is calculated against the official time zone of the Workspace. For example: A Task has a planned completion date of July 5, 2023 in a Workspace that has a time zone of US Pacific Time (GMT-7 or GMT-8, depending on daylight savings time). This project is considered overdue on 12:01 AM July 6th 2023 in US Pacific time.
- `actualFinishDate` (string, optional, nullable) — If set, this is the actual date when work was completed on this Task. This value contains only the date in year-month-day format. For display, this date will always be shown as this same year-month-day regardless of time zone. For reporting purposes, this date is calculated against the official time zone of the Workspace. For example: A Task has a planned completion date of July 5, 2023 in a Workspace that has a time zone of US Pacific Time (GMT-7 or GMT-8, depending on daylight savings time). This project is considered overdue on 12:01 AM July 6th 2023 in US Pacific time.
- `modifyDate` (string, optional) — The timestamp in UTC when this Task was most recently modified.
- `createDate` (string, optional) — The timestamp in UTC when this Task was created.
- `percentComplete` (integer, optional) — The numerical percentage, from 0-100, representing the percentage completion for this Task. Any numbers below zero or above 100 will be clamped to the minimum or maximum value. This value can be edited manually in the Gantt chart view of the application, or can be selected on the Task Detail page within the Kanban board.
- `isSummary` (boolean, optional) — True if this Task is the parent of multiple Tasks underneath it. A parent Task is a "rolled-up" view of multiple children that allows you to view a section of work at a glance. You can create a summary Task in the Gantt chart view of the application by adding child tasks underneath a parent Task.
- `priorityId` (integer, optional, nullable) — Return the priority of a task
- `wbs` (string, optional, nullable) — The WBS (Work Breakdown Structure) number for this task within the Gantt chart hierarchy. See [What Is a Work Breakdown Structure (WBS)?](https://www.projectmanager.com/guides/work-breakdown-structure) on Project Manager for more information. The WBS number is an outline number in the form `#.#.#.#` which indicates how tasks are organized and sorted. The WBS value is only available to users at certain edition levels. This value can only be changed if you are a Project Editor.
- `color` (string, optional, nullable) — Task Color as set in the Gantt
- `actualCost` (double, optional, nullable) — The actual cost of this Task, if known.
- `actualResourceCost` (double, optional, nullable) — The actual resource cost of this Task
- `actualEffort` (integer, optional, nullable) — The actual effort (in minutes) of this task, if known.
- `plannedCost` (double, optional, nullable) — The planned cost for this Task. Cannot be negative.
- `plannedResourceCost` (double, optional, nullable) — The planned resource cost of this Task
- `plannedEffort` (integer, optional, nullable) — The planned effort (in minutes) of this task, if known.

### TimeSheetProjectDto

A Project is a collection of Tasks that contributes towards a goal. Within a Project, Tasks represent individual items of work that team members must complete. The sum total of Tasks within a Project represents the work to be completed for that Project.

- `id` (string, optional) — The unique identifier of the Project.
- `name` (string, optional) — The name of the Project.
- `description` (string, optional, nullable) — An optional description of the Project
- `shortCode` (string, optional) — A shortened name that will be used when reporting on Projects. This short name can be edited in the Project Settings page within the application and can be any text you wish.
- `shortId` (string, optional) — A short identifier that uniquely identifies this Project within your Workspace using a single letter followed by a number. This code can be used for APIs that accept Project unique identifiers. You can observe the short ID within the application by observing the URL of the page you visit when you click on this project. The page's URL will appear in the form `https://pm.app.projectmanager.com/project/board/D16` - in this example, the `ShortId` is `D16`. This code is automatically assigned for you and cannot be changed.
- `startDate` (string, optional, nullable) — The earliest planned or actual start date of tasks on the project. This field is calculated automatically and cannot be changed.
- `endDate` (string, optional, nullable) — The latest planned or actual finish date of tasks on the project. This field is calculated automatically and cannot be changed.
- `targetDate` (string, optional, nullable) — The target planned completion date for this Project, or null if one has not been selected. This value can be updated in the Project Settings page or the Portfolio Project page within the application.
- `budget` (double, optional, nullable) — The proposed budget for this Project.
- `hourlyRate` (double, optional, nullable) — The default hourly rate for work on this Project. This rate will be used if an assignee working on this Project does not have an hourly rate configured in their profile.
- `statusUpdate` (string, optional, nullable) — Contains an optional status update for Projects that can be used to summarize the status of multiple Projects at a glance. You can edit the StatusUpdate field on the Portfolio page of the application.
- `modifyDate` (string, optional) — The timestamp in UTC when the Project was most recently modified.
- `createDate` (string, optional) — The timestamp in UTC when the Project was created.
- `isTemplate` (boolean, optional) — True if this Project is a template that will be reused as a framework for future Projects.

### TimesheetResourceDto

A Resource represents a person, material, or tool that is used within your Projects. When you attach a Resources to more than one Task, the software will schedule the usage of your Resource so that it is not allocated to more than one Task at the same time. The users in your Workspace are also considered Resources. To invite a new User to your Workspace, create a new Resource for that user.

- `id` (string, optional) — The unique identifier of this Resource.
- `firstName` (string, optional) — The first name of the person Resource. Applies to personnel Resources only.
- `lastName` (string, optional) — The last name of the person Resource. Applies to personnel Resources only.
- `email` (string, optional) — The email address of this Resource.
- `hourlyRate` (double, optional, nullable) — The default hourly rate of the resource.

### TimesheetAdminTypeDto

Represents admin task to track time

- `id` (string, optional) — admin task id
- `name` (string, optional) — admin task name

### TimesheetFileDto

Represents information about a file attached to a Timesheet.

- `id` (string, optional) — The identifier for this file
- `name` (string, optional) — The name of the file
- `url` (string, optional) — The url of the file which can be used for downloading

## Examples

**Response**

```json
{
  "error": {
    "technicalError": "string",
    "additionalErrors": [
      "string"
    ],
    "validationErrors": {},
    "message": "string"
  },
  "success": true,
  "hasError": true,
  "statusCode": "Continue",
  "data": [
    {
      "id": "string",
      "resourceId": "string",
      "taskId": "string",
      "projectId": "string",
      "date": "2023-01-15",
      "notes": "string",
      "approved": true,
      "approvalStatusId": 1,
      "hours": 1.1,
      "minutes": 1,
      "modifiedDate": "2024-01-15T09:30:00Z",
      "task": {
        "id": "string",
        "projectId": "string",
        "shortId": "string",
        "name": "string",
        "description": "string",
        "plannedStartDate": "2023-01-15",
        "plannedFinishDate": "2023-01-15",
        "actualStartDate": "2023-01-15",
        "actualFinishDate": "2023-01-15",
        "modifyDate": "2024-01-15T09:30:00Z",
        "createDate": "2024-01-15T09:30:00Z",
        "percentComplete": 1,
        "isSummary": true,
        "priorityId": 1,
        "wbs": "string",
        "color": "string",
        "actualCost": 1.1,
        "actualResourceCost": 1.1,
        "actualEffort": 1,
        "plannedCost": 1.1,
        "plannedResourceCost": 1.1,
        "plannedEffort": 1
      },
      "project": {
        "id": "string",
        "name": "string",
        "description": "string",
        "shortCode": "string",
        "shortId": "string",
        "startDate": "2024-01-15T09:30:00Z",
        "endDate": "2024-01-15T09:30:00Z",
        "targetDate": "2024-01-15T09:30:00Z",
        "budget": 1.1,
        "hourlyRate": 1.1,
        "statusUpdate": "string",
        "modifyDate": "2024-01-15T09:30:00Z",
        "createDate": "2024-01-15T09:30:00Z",
        "isTemplate": true
      },
      "resource": {
        "id": "string",
        "firstName": "string",
        "lastName": "string",
        "email": "string",
        "hourlyRate": 1.1
      },
      "adminType": {
        "id": "string",
        "name": "string"
      },
      "files": [
        {
          "id": "string",
          "name": "string",
          "url": "string"
        }
      ],
      "isCopied": true
    }
  ]
}
```

**SDK Code**

```python
import requests

url = "https://api.projectmanager.com/api/data/timesheets"

headers = {"Authorization": "Bearer <token>"}

response = requests.get(url, headers=headers)

print(response.json())
```

```javascript
const url = 'https://api.projectmanager.com/api/data/timesheets';
const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};

try {
  const response = await fetch(url, options);
  const data = await response.json();
  console.log(data);
} catch (error) {
  console.error(error);
}
```

```go
package main

import (
	"fmt"
	"net/http"
	"io"
)

func main() {

	url := "https://api.projectmanager.com/api/data/timesheets"

	req, _ := http.NewRequest("GET", url, nil)

	req.Header.Add("Authorization", "Bearer <token>")

	res, _ := http.DefaultClient.Do(req)

	defer res.Body.Close()
	body, _ := io.ReadAll(res.Body)

	fmt.Println(res)
	fmt.Println(string(body))

}
```

```ruby
require 'uri'
require 'net/http'

url = URI("https://api.projectmanager.com/api/data/timesheets")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'

response = http.request(request)
puts response.read_body
```

```java
import com.mashape.unirest.http.HttpResponse;
import com.mashape.unirest.http.Unirest;

HttpResponse<String> response = Unirest.get("https://api.projectmanager.com/api/data/timesheets")
  .header("Authorization", "Bearer <token>")
  .asString();
```

```php
<?php
require_once('vendor/autoload.php');

$client = new \GuzzleHttp\Client();

$response = $client->request('GET', 'https://api.projectmanager.com/api/data/timesheets', [
  'headers' => [
    'Authorization' => 'Bearer <token>',
  ],
]);

echo $response->getBody();
```

```csharp
using RestSharp;

var client = new RestClient("https://api.projectmanager.com/api/data/timesheets");
var request = new RestRequest(Method.GET);
request.AddHeader("Authorization", "Bearer <token>");
IRestResponse response = client.Execute(request);
```

```swift
import Foundation

let headers = ["Authorization": "Bearer <token>"]

let request = NSMutableURLRequest(url: NSURL(string: "https://api.projectmanager.com/api/data/timesheets")! as URL,
                                        cachePolicy: .useProtocolCachePolicy,
                                    timeoutInterval: 10.0)
request.httpMethod = "GET"
request.allHTTPHeaderFields = headers

let session = URLSession.shared
let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in
  if (error != nil) {
    print(error as Any)
  } else {
    let httpResponse = response as? HTTPURLResponse
    print(httpResponse)
  }
})

dataTask.resume()
```