List activities
Operation ID: activities
Group: PSA › Activities
Open in the interactive reference
GET /psa/activities
Read-only: Reads and returns; changes nothing.
Lists activities. Each activity appears once in the list. The list does not say who is assigned to each activity.
You can't filter activities by name or description, and there is no search endpoint for activities.
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, likebillable— filter by eq, ne, gt, gte, lt, lte, in, notIn, betweeninvoiced— filter by eq, ne, gt, gte, lt, lte, in, notIn, betweenstartDate— filter by eq, ne, gt, gte, lt, lte, in, notIn, betweenendDate— filter by eq, ne, gt, gte, lt, lte, in, notIn, betweenbillingType— filter by eq, ne, gt, gte, lt, lte, in, notIn, between, likecategory— filter by eq, ne, gt, gte, lt, lte, in, notIn, between, likepsaProjectId— filter by eq, ne, gt, gte, lt, lte, in, notIn, betweenlastModifiedDate— filter by eq, ne, gt, gte, lt, lte, in, notIn, between- Orderable: id, name, startDate, endDate, hoursBudget, billingType, category, psaProjectId, lastModifiedDate
- Selectable: id, name, description, hoursBudget, billable, invoiced, startDate, endDate, billingType, category, milestoneId, fixedFeeId, activityStatusId, statusName, parentActivityId, psaProjectId, lastModifiedDate
page[size]— Page sizepage[cursor]— Opaque continuation cursor
Response
200 Success
Under data, an array of activitiesRow:
| 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 activity. Example: "c4a91b07-6e52-4d38-9a1f-83b7de20c5f6". |
name |
string | no | no | yes | The display name of the activity. Example: "Discovery workshop". |
description |
string | null | no | no | no | A free-form description of the activity. Absent when none was set. Example: "Two-day onsite requirements workshop.". |
hoursBudget |
decimal | null | no | no | yes | The budgeted hours for this activity, as a count of hours. It is not a monetary amount. Example: "40.00". |
billable |
boolean | null | no | Exact (eq, ne), Range (gt, gte, lt, lte, between), Any of (in, notIn) |
no | Whether the activity is billable to a customer. Derived from category being 'ClientBillable'. Example: true. |
invoiced |
boolean | null | no | Exact (eq, ne), Range (gt, gte, lt, lte, between), Any of (in, notIn) |
no | Whether the activity has been invoiced. Example: false. |
startDate |
date | null | no | Exact (eq, ne), Range (gt, gte, lt, lte, between), Any of (in, notIn) |
yes | 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 | null | no | Exact (eq, ne), Range (gt, gte, lt, lte, between), Any of (in, notIn) |
yes | The activity's end date. Format YYYY-MM-DD. Example: "2026-09-02". |
billingType |
string | no | Exact (eq, ne), Range (gt, gte, lt, lte, between), Any of (in, notIn), Pattern (like) |
yes | The activity's billing type. Possible values: 'Hours', 'Milestone', 'FixedFee'. Example: "Hours". |
category |
string | null | no | Exact (eq, ne), Range (gt, gte, lt, lte, between), Any of (in, notIn), Pattern (like) |
yes | The activity's category. Possible values: 'ClientBillable', 'NonBillable', 'NonValuable', 'Valuable'. Example: "ClientBillable". |
milestoneId |
number | null | no | no | 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 | null | no | no | 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 | null | no | no | 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 | null | no | no | no | The name of the activity's progress status, for example 'In progress'. Absent when no status is set. Example: "In progress". |
parentActivityId |
number | null | no | no | 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 | null | no | Exact (eq, ne), Range (gt, gte, lt, lte, between), Any of (in, notIn) |
yes | 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 | null | no | Exact (eq, ne), Range (gt, gte, lt, lte, between), Any of (in, notIn) |
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"
}
],
"pagination": {
"hasMore": true,
"nextCursor": "<nextCursor>"
}
}
Statuses
400— Invalid request or business failure401— 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