# List time entries

Operation ID: `timeEntries`

Group: PSA › Time Entries

[Open in the interactive reference](https://docs.api.lensing.ai/lensing/v1/endpoints/timeEntries)

`GET /psa/time-entries`

Read-only: Reads and returns; changes nothing.

Lists time entries. Unless you are a super admin, the list includes only time entries on projects where you are a team member. It always leaves out time entries on archived projects and on projects whose status is 'Planning' or 'PlanningDraft'.

You can't filter by memberId, memberEmployeeId, projectPositionId, or psaProjectId, so there is no way to list one employee's time entries.

## Parameters

| Name | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `Api-Version` | header | string · v1 | yes | The API version this request targets, named by its public identifier. Required on every request; omitting it, or naming a version this company does not have, is answered with 400. This document describes version `v1`. |

## Query surface

- `id` — filter by eq, ne, gt, gte, lt, lte, in, notIn, between, like
- `date` — filter by eq, ne, gt, gte, lt, lte, in, notIn, between
- `currency` — filter by eq, ne, gt, gte, lt, lte, in, notIn, between, like
- `submissionStatus` — filter by eq, ne, gt, gte, lt, lte, in, notIn, between, like
- `submissionDate` — filter by eq, ne, gt, gte, lt, lte, in, notIn, between
- `month` — filter by eq, ne, gt, gte, lt, lte, in, notIn, between
- `projectActivityId` — filter by eq, ne, gt, gte, lt, lte, in, notIn, between
- `lastModifiedDate` — filter by eq, ne, gt, gte, lt, lte, in, notIn, between
- Orderable: id, date, month, hours, submissionStatus, submissionDate, currency, lastModifiedDate
- Selectable: id, date, hours, billableHours, nonBillableHours, internalValuableHours, internalNonValuableHours, invoicedHours, revenue, cost, currency, notes, submissionStatus, submissionDate, month, memberId, memberEmployeeId, memberEmployeeName, projectActivityId, projectActivityName, projectActivityCategory, projectPositionId, projectPositionName, psaProjectId, projectName, psaProjectStatus, lastModifiedDate
- `page[size]` — Page size
- `page[cursor]` — Opaque continuation cursor

## Response

`200` Success

Under `data`, an array of timeEntriesRow:

| Field | Type | Required | Filter | Sort | Description |
| --- | --- | --- | --- | --- | --- |
| `id` | string | no | Exact (`eq`, `ne`), Range (`gt`, `gte`, `lt`, `lte`, `between`), Any of (`in`, `notIn`), Pattern (`like`) | yes | The unique identifier for the time entry. Example: `"9b1c7f42-3d8a-4e05-b6c1-27fa5e903d18"`. |
| `date` | date \| null | no | Exact (`eq`, `ne`), Range (`gt`, `gte`, `lt`, `lte`, `between`), Any of (`in`, `notIn`) | yes | The date the time was logged for. Format YYYY-MM-DD. Example: `"2026-08-10"`. |
| `hours` | decimal \| null | no | no | yes | The total hours logged in this entry. Example: `"8"`. |
| `billableHours` | decimal \| null | no | no | no | The hours classified as billable to a customer, derived from projectActivityCategory. Example: `"8"`. |
| `nonBillableHours` | decimal \| null | no | no | no | The hours classified as non-billable to a customer, derived from projectActivityCategory. Example: `"0"`. |
| `internalValuableHours` | decimal \| null | no | no | no | The hours classified as internal valuable work, derived from projectActivityCategory. Example: `"0"`. |
| `internalNonValuableHours` | decimal \| null | no | no | no | The hours classified as internal non-valuable work, derived from projectActivityCategory. Example: `"0"`. |
| `invoicedHours` | decimal \| null | no | no | no | The hours that have been invoiced, a subset of billableHours. Example: `"0"`. |
| `revenue` | decimal \| null | no | no | no | The revenue from this time entry, in the currency given by currency. Example: `"1250.00"`. |
| `cost` | decimal \| null | no | no | no | The cost of this time entry, in the currency given by currency. Example: `"800.00"`. |
| `currency` | string \| null | no | Exact (`eq`, `ne`), Range (`gt`, `gte`, `lt`, `lte`, `between`), Any of (`in`, `notIn`), Pattern (`like`) | yes | The currency of revenue and cost. Format ISO 4217, for example 'USD'. It is the currency of the project position's bill rate. Example: `"USD"`. |
| `notes` | string \| null | no | no | no | Free-form notes on the time entry. Example: `"Sprint 14 backend work"`. |
| `submissionStatus` | string \| null | no | Exact (`eq`, `ne`), Range (`gt`, `gte`, `lt`, `lte`, `between`), Any of (`in`, `notIn`), Pattern (`like`) | yes | The submission and approval status of the entry. Possible values: 'draft', 'pending', 'approved', 'rejected', 'submittedForInvoicing', 'invoiced'. Example: `"draft"`. |
| `submissionDate` | date \| null | no | Exact (`eq`, `ne`), Range (`gt`, `gte`, `lt`, `lte`, `between`), Any of (`in`, `notIn`) | yes | The date the entry was submitted for approval. Format YYYY-MM-DD. Example: `"2026-08-11"`. |
| `month` | date \| null | no | Exact (`eq`, `ne`), Range (`gt`, `gte`, `lt`, `lte`, `between`), Any of (`in`, `notIn`) | yes | The first day of the month the entry is reported under. Format YYYY-MM-DD. Example: `"2026-08-01"`. |
| `memberId` | number \| null | no | no | no | The numeric key of the PSA member assignment the time was logged for. GET psa/team-members/:id takes the member's UUID, not this key, so it cannot fetch the member. Example: `5001`. |
| `memberEmployeeId` | number \| null | no | no | no | The numeric key of the employee who logged the time. There is no endpoint for it. Example: `3845142`. |
| `memberEmployeeName` | string \| null | no | no | no | The name of the employee who logged the time. Example: `"Alex Rivera"`. |
| `projectActivityId` | number \| null | no | Exact (`eq`, `ne`), Range (`gt`, `gte`, `lt`, `lte`, `between`), Any of (`in`, `notIn`) | no | The numeric key of the activity the time was logged against. GET psa/activities/:id takes the activity's UUID, not this key, so it cannot fetch the activity. Example: `7001`. |
| `projectActivityName` | string \| null | no | no | no | The name of the activity the time was logged against. Example: `"Implementation"`. |
| `projectActivityCategory` | string \| null | no | no | no | The billability category of the activity the time was logged against. The billable, non-billable and internal-hour fields are derived from it. See category on GET psa/activities/:id. Example: `"ClientBillable"`. |
| `projectPositionId` | number \| null | no | no | no | The numeric key of the position the time was logged against. GET psa/positions/:id takes the position's UUID, not this key, so it cannot fetch the position. Example: `9001`. |
| `projectPositionName` | string \| null | no | no | no | The name of the position the time was logged against. Example: `"Senior Engineer"`. |
| `psaProjectId` | number \| null | no | no | no | The numeric key of the PSA project the entry belongs to. GET psa/projects/:id takes the project's UUID, not this key, so it cannot fetch the project. Example: `32341`. |
| `projectName` | string \| null | no | no | no | The name of the PSA project the entry belongs to. Example: `"Atlas rollout"`. |
| `psaProjectStatus` | string \| null | no | no | no | The status of the PSA project this entry belongs to. Example: `"active"`. |
| `lastModifiedDate` | date-time \| null | no | Exact (`eq`, `ne`), Range (`gt`, `gte`, `lt`, `lte`, `between`), Any of (`in`, `notIn`) | yes | The date and time the entry last changed, in UTC. Format YYYY-MM-DDTHH:mm:ss.sssZ. Example: `"2026-08-14T11:20:31.004Z"`. |

```json
{
  "data": [
    {
      "id": "9b1c7f42-3d8a-4e05-b6c1-27fa5e903d18",
      "date": "2026-08-10",
      "hours": "8",
      "billableHours": "8",
      "nonBillableHours": "0",
      "internalValuableHours": "0",
      "internalNonValuableHours": "0",
      "invoicedHours": "0",
      "revenue": "1250.00",
      "cost": "800.00",
      "currency": "USD",
      "notes": "Sprint 14 backend work",
      "submissionStatus": "draft",
      "submissionDate": "2026-08-11",
      "month": "2026-08-01",
      "memberId": 5001,
      "memberEmployeeId": 3845142,
      "memberEmployeeName": "Alex Rivera",
      "projectActivityId": 7001,
      "projectActivityName": "Implementation",
      "projectActivityCategory": "ClientBillable",
      "projectPositionId": 9001,
      "projectPositionName": "Senior Engineer",
      "psaProjectId": 32341,
      "projectName": "Atlas rollout",
      "psaProjectStatus": "active",
      "lastModifiedDate": "2026-08-14T11:20:31.004Z"
    }
  ],
  "pagination": {
    "hasMore": true,
    "nextCursor": "<nextCursor>"
  }
}
```

## Statuses

- `400` — Invalid request or business failure
- `401` — The request carries no valid access token.
- `403` — Not authorized
- `404` — Not found
- `429` — Too many requests from this client address. The response has no body and no `Retry-After` header.
- `500` — Internal server error
