# Retrieve a time entry

Operation ID: `getTimeEntry`

Group: PSA › Time Entries

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

`GET /psa/time-entries/{id}`

Read-only: Reads and returns; changes nothing.

Retrieves a time entry. The response has the same fields as each time entry from GET psa/time-entries.

Some time entries come back with fewer fields. That happens when the time entry's project is in the 'Planning' or 'PlanningDraft' status, or when you are not a team member of the project and not a super admin. The response then leaves out psaProjectId, projectName, psaProjectStatus, projectPositionId, projectPositionName, memberEmployeeId, memberEmployeeName, projectActivityName, billableHours, nonBillableHours, internalValuableHours, and internalNonValuableHours.

## 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`. |
| `id` | path | string | yes | The unique identifier of the time entry you want to retrieve. Example: `"9b1c7f42-3d8a-4e05-b6c1-27fa5e903d18"`. |

## Response

`200` Success

Under `data` (getTimeEntryOutput):

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `id` | string | yes | The unique identifier for the time entry. Example: `"9b1c7f42-3d8a-4e05-b6c1-27fa5e903d18"`. |
| `date` | date | no | The date the time was logged for. Format YYYY-MM-DD. Example: `"2026-08-10"`. |
| `hours` | decimal | no | The total hours logged in this entry. Example: `"8"`. |
| `billableHours` | decimal | no | The hours classified as billable to a customer, derived from projectActivityCategory. Example: `"8"`. |
| `nonBillableHours` | decimal | no | The hours classified as non-billable to a customer, derived from projectActivityCategory. |
| `internalValuableHours` | decimal | no | The hours classified as internal valuable work, derived from projectActivityCategory. |
| `internalNonValuableHours` | decimal | no | The hours classified as internal non-valuable work, derived from projectActivityCategory. |
| `invoicedHours` | decimal | no | The hours that have been invoiced, a subset of billableHours. |
| `revenue` | decimal | no | The revenue from this time entry, in the currency given by currency. Example: `"1250.00"`. |
| `cost` | decimal | no | The cost of this time entry, in the currency given by currency. Example: `"800.00"`. |
| `currency` | string | no | 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 | no | Free-form notes on the time entry. |
| `submissionStatus` | string | no | The submission and approval status of the entry. Possible values: 'draft', 'pending', 'approved', 'rejected', 'submittedForInvoicing', 'invoiced'. Example: `"draft"`. |
| `submissionDate` | date | no | The date the entry was submitted for approval. Format YYYY-MM-DD. |
| `month` | date | no | The first day of the month the entry is reported under. Format YYYY-MM-DD. Example: `"2026-08-01"`. |
| `memberId` | number | 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 | no | The numeric key of the employee who logged the time. There is no endpoint for it. Example: `3845142`. |
| `memberEmployeeName` | string | no | The name of the employee who logged the time. Example: `"Alex Rivera"`. |
| `projectActivityId` | number | 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 | no | The name of the activity the time was logged against. |
| `projectActivityCategory` | string | 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 | 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. |
| `projectPositionName` | string | no | The name of the position the time was logged against. |
| `psaProjectId` | number | 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 | no | The name of the PSA project the entry belongs to. |
| `psaProjectStatus` | string | no | The status of the PSA project this entry belongs to. |
| `lastModifiedDate` | date-time | no | 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": "19.99",
    "internalValuableHours": "19.99",
    "internalNonValuableHours": "19.99",
    "invoicedHours": "19.99",
    "revenue": "1250.00",
    "cost": "800.00",
    "currency": "USD",
    "notes": "<notes>",
    "submissionStatus": "draft",
    "submissionDate": "2026-01-15",
    "month": "2026-08-01",
    "memberId": 5001,
    "memberEmployeeId": 3845142,
    "memberEmployeeName": "Alex Rivera",
    "projectActivityId": 7001,
    "projectActivityName": "<projectActivityName>",
    "projectActivityCategory": "ClientBillable",
    "projectPositionId": 0,
    "projectPositionName": "<projectPositionName>",
    "psaProjectId": 32341,
    "projectName": "<projectName>",
    "psaProjectStatus": "<psaProjectStatus>",
    "lastModifiedDate": "2026-08-14T11:20:31.004Z"
  },
  "diagnostics": [
    {
      "code": "<code>",
      "message": "<message>",
      "severity": "error",
      "path": [
        "<path>"
      ],
      "details": "<details>"
    }
  ]
}
```

## Errors

| Code | Status |
| --- | --- |
| `NOT_FOUND` | 400 |

## Statuses

- `400` — Invalid request or business failure. Codes: NOT_FOUND
- `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
