Retrieve an activity
Operation ID: getActivity
Group: PSA › Activities
Open in the interactive reference
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". |
{
"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_FOUND401— The request carries no valid access token.403— Not authorized404— Not found429— Too many requests from this client address. The response has no body and noRetry-Afterheader.500— Internal server error