# Returns a list of position assignments on PSA project teams.

`GET /psa/team-member-positions`

Group: PSA › Team Members · Operation ID: `teamMemberPositions`

Each row is one position assignment: a person or a placeholder mapped to a project position. To read the team roster regardless of position, use GET psa/team-members. There is no endpoint to match an assignment by position name.

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

## 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`. |

## Query surface

- `psaProjectId` — filter by eq, ne, gt, gte, lt, lte, in, notIn, between, like
- `projectPositionId` — filter by eq, ne, gt, gte, lt, lte, in, notIn, between, like
- `teamMemberId` — filter by eq, ne, gt, gte, lt, lte, in, notIn, between, like
- `placeholderId` — filter by eq, ne, gt, gte, lt, lte, in, notIn, between, like
- `invoiced` — filter by eq, ne, gt, gte, lt, lte, in, notIn, between, like
- `lastModifiedDate` — filter by eq, ne, gt, gte, lt, lte, in, notIn, between, like
- Orderable: psaProjectId, lastModifiedDate
- Selectable: id, psaProjectId, projectPositionId, positionName, teamMemberId, placeholderId, invoiced, lastModifiedDate

## Response

`200` Success

Under `data`, an array of teamMemberPositionsRow:

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `id` | string | no | The unique identifier for the position assignment. |
| `psaProjectId` | number | no | The id of the PSA project this record belongs to. It is a numeric package-layer key you can filter on here, not the UUID that GET psa/projects/:id takes. |
| `projectPositionId` | number or null | no | The id of the project position this row assigns. It is a numeric package-layer key you can filter on here, not the UUID that GET psa/positions/:id takes. |
| `positionName` | string or null | no | The name of the project position, paired with projectPositionId. It is returned but cannot be filtered or sorted on, and there is no endpoint to find an assignment by position name. |
| `teamMemberId` | number or null | no | The id of the assigned person's team-roster row. Absent for placeholder-only assignments. It is a numeric package-layer key, not the UUID that GET psa/team-members/:id takes. |
| `placeholderId` | number or null | no | The id of the placeholder filling this position, when it is filled by a placeholder rather than a person. It is a numeric package-layer key, not the UUID that GET psa/placeholders/:id takes. |
| `invoiced` | boolean or null | no | Whether this assignment's work has been invoiced. An invoiced assignment cannot be deleted. |
| `lastModifiedDate` | string (date-time) or null | no | The date and time this assignment last changed, in UTC. Format YYYY-MM-DDTHH:mm:ss.sssZ. |

## Statuses

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