List team members
Operation ID: teamMembers
Group: PSA › Team Members
Open in the interactive reference
GET /psa/team-members
Read-only: Reads and returns; changes nothing.
Lists team members. Each team member is one person on one PSA project's team. To find who fills which project position, use GET psa/team-member-positions.
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
psaProjectId— filter by eq, ne, gt, gte, lt, lte, in, notIn, betweenemployeeId— filter by eq, ne, gt, gte, lt, lte, in, notIn, betweenisTeamLead— 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, betweenlastModifiedDate— filter by eq, ne, gt, gte, lt, lte, in, notIn, between- Orderable: psaProjectId, startDate, endDate, lastModifiedDate
- Selectable: id, psaProjectId, employeeId, isTeamLead, startDate, endDate, allocation, name, displayName, lastModifiedDate
page[size]— Page sizepage[cursor]— Opaque continuation cursor
Response
200 Success
Under data, an array of teamMembersRow:
| Field | Type | Required | Filter | Sort | Description |
|---|---|---|---|---|---|
id |
string | no | no | no | The unique identifier for the team-roster row. |
psaProjectId |
number | no | Exact (eq, ne), Range (gt, gte, lt, lte, between), Any of (in, notIn) |
yes | The id of the PSA project this record belongs to. It is a numeric key you can filter on here, not the UUID that GET psa/projects/:id takes. |
employeeId |
number | null | no | Exact (eq, ne), Range (gt, gte, lt, lte, between), Any of (in, notIn) |
no | The id of the employee this roster record is for. It is a numeric key, not a UUID any public endpoint returns as a fetchable id. |
isTeamLead |
boolean | null | no | Exact (eq, ne), Range (gt, gte, lt, lte, between), Any of (in, notIn) |
no | Whether this team member is the team lead. |
startDate |
date | null | no | Exact (eq, ne), Range (gt, gte, lt, lte, between), Any of (in, notIn) |
yes | The first day of this person's membership of the team. Format YYYY-MM-DD. Absent when not set. |
endDate |
date | null | no | Exact (eq, ne), Range (gt, gte, lt, lte, between), Any of (in, notIn) |
yes | The last day of this person's membership of the team. Format YYYY-MM-DD. Absent when not set. |
allocation |
decimal | null | no | no | no | The share of the person's capacity allocated to this team, as a percentage. For example, 50 means 50%. |
name |
string | null | no | no | no | The full name of the team member. It is returned but cannot be filtered or sorted on, and there is no endpoint to find a member by name. |
displayName |
string | null | no | no | no | The preferred display name of the team member. Like name, it cannot be filtered or sorted on. |
lastModifiedDate |
date-time | null | no | Exact (eq, ne), Range (gt, gte, lt, lte, between), Any of (in, notIn) |
yes | The date and time this roster row last changed, in UTC. Format YYYY-MM-DDTHH:mm:ss.sssZ. |
{
"data": [
{
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"psaProjectId": 0,
"employeeId": 0,
"isTeamLead": true,
"startDate": "2026-01-15",
"endDate": "2026-01-15",
"allocation": "19.99",
"name": "<name>",
"displayName": "<displayName>",
"lastModifiedDate": "2026-01-15T09:30:00.000Z"
}
],
"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