# Returns the activity with the given identifier.

`GET /psa/activities/{id}`

Group: PSA › Activities · Operation ID: `getActivity`

An activity is a project task. This route returns the activity itself, not who is assigned to it: assignment is a separate concern with its own cardinality, and no assignment fields are published here.

[Open in the interactive reference](https://docs.api.lensing.ai/?op=getActivity)

## Parameters

| Name | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `Api-Version` | header | `"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 for the activity to return. |

## Response

`200` Success

Under `data` (getActivityOutput):

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `id` | string | yes | The unique identifier for the activity. |
| `name` | string | yes | The display name of the activity. |
| `description` | string | no | A free-form description of the activity. Absent when none was set. |
| `hoursBudget` | string (decimal) | no | The budgeted hours for this activity, as a count of hours. It is not a monetary amount. |
| `billable` | boolean | no | Whether the activity is billable to a customer. Derived from category being 'ClientBillable'. |
| `invoiced` | boolean | no | Whether the activity has been invoiced. |
| `startDate` | string (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. |
| `endDate` | string (date) | no | The activity's end date. Format YYYY-MM-DD. |
| `billingType` | string | yes | The activity's billing type. Possible values: 'Hours', 'Milestone', 'FixedFee'. |
| `category` | string | no | The activity's category. Possible values: 'ClientBillable', 'NonBillable', 'NonValuable', 'Valuable'. |
| `milestoneId` | number | no | The id of the milestone this activity is billed against. Absent unless billingType is 'Milestone'. It is a numeric package-layer 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 package-layer 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. |
| `statusName` | string | no | The name of the activity's progress status, for example 'In progress'. Absent when no status is set. |
| `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 package-layer 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. |
| `lastModifiedDate` | string (date-time) | yes | The date and time this activity last changed, in UTC. Format YYYY-MM-DDTHH:mm:ss.sssZ. |

## Errors

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

## Statuses

- `400` — Invalid request or business failure. Codes: NOT_FOUND
- `401` — Missing or invalid access token
- `403` — Not authorized
- `404` — Not found
- `429` — Too many requests
- `500` — Internal server error
