# Retrieve an activity

Operation ID: `getActivity`

Group: PSA › Activities

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

`GET /psa/activities/{id}`

Read-only: Reads and returns; changes nothing.

Retrieves an activity. The response does not include who is assigned to the activity, and no endpoint returns activity assignments.

## 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 activity you want to retrieve. Example: `"c4a91b07-6e52-4d38-9a1f-83b7de20c5f6"`. |

## Response

`200` Success

Under `data` (getActivityOutput):

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `id` | string | yes | The unique identifier for the activity. Example: `"c4a91b07-6e52-4d38-9a1f-83b7de20c5f6"`. |
| `name` | string | yes | The display name of the activity. Example: `"Discovery workshop"`. |
| `description` | string | no | A free-form description of the activity. Absent when none was set. Example: `"Two-day onsite requirements workshop."`. |
| `hoursBudget` | decimal | no | The budgeted hours for this activity, as a count of hours. It is not a monetary amount. Example: `"40.00"`. |
| `billable` | boolean | no | Whether the activity is billable to a customer. Derived from category being 'ClientBillable'. Example: `true`. |
| `invoiced` | boolean | no | Whether the activity has been invoiced. Example: `false`. |
| `startDate` | date | no | The activity's start date. Format YYYY-MM-DD. It is within the owning project's date range when the project's enforceActivityDateRange setting is on. Example: `"2026-09-01"`. |
| `endDate` | date | no | The activity's end date. Format YYYY-MM-DD. Example: `"2026-09-02"`. |
| `billingType` | string | yes | The activity's billing type. Possible values: 'Hours', 'Milestone', 'FixedFee'. Example: `"Hours"`. |
| `category` | string | no | The activity's category. Possible values: 'ClientBillable', 'NonBillable', 'NonValuable', 'Valuable'. Example: `"ClientBillable"`. |
| `milestoneId` | number | no | The id of the milestone this activity is billed against. Absent unless billingType is 'Milestone'. It is a numeric key, not the UUID that GET psa/milestones/:id takes. |
| `fixedFeeId` | number | no | The id of the fixed fee this activity is billed against. Absent unless billingType is 'FixedFee'. It is a numeric key, not the UUID that GET psa/fixed-fees/:id takes. |
| `activityStatusId` | number | no | The id of the activity's progress status. Absent when no status is set. Status values are tenant-configured, and there is no endpoint that lists them. Use statusName for the label. Example: `3`. |
| `statusName` | string | no | The name of the activity's progress status, for example 'In progress'. Absent when no status is set. Example: `"In progress"`. |
| `parentActivityId` | number | no | The id of the parent activity when this is a sub-task. Absent when the activity is top-level. It is a numeric key, not the UUID that GET psa/activities/:id takes. |
| `psaProjectId` | number | no | The id of the PSA project that owns this activity. Absent for a timetracking project with no PSA layer. It is a numeric key you can filter on here, but not the UUID that GET psa/projects/:id takes. Example: `32341`. |
| `lastModifiedDate` | date-time | yes | The date and time this activity last changed, in UTC. Format YYYY-MM-DDTHH:mm:ss.sssZ. Example: `"2026-08-14T11:20:31.004Z"`. |

```json
{
  "data": {
    "id": "c4a91b07-6e52-4d38-9a1f-83b7de20c5f6",
    "name": "Discovery workshop",
    "description": "Two-day onsite requirements workshop.",
    "hoursBudget": "40.00",
    "billable": true,
    "invoiced": false,
    "startDate": "2026-09-01",
    "endDate": "2026-09-02",
    "billingType": "Hours",
    "category": "ClientBillable",
    "milestoneId": 0,
    "fixedFeeId": 0,
    "activityStatusId": 3,
    "statusName": "In progress",
    "parentActivityId": 0,
    "psaProjectId": 32341,
    "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
