Project member fields and account responses change in 1.58. See API migration 1.57 → 1.58 before upgrading your integration.
Viewer, Commenter, Editor, Admin, and Owner.
Project member responses use the workspace member ID in id and include the related account as account.
Basic request and response
List current members withGET /api/v1/app/project/{projectId}/member.
Endpoint parameters
Endpoint parameters
| Type | Name | Required | Notes |
|---|---|---|---|
| Path | projectID | Yes | Project identifier. |
| Query | page | No | Absolute page number to fetch, 1-based. |
| Query | page_size | No | Number of items per page. Default is 20. |
| Query | page_order | No | ASC or DESC. Default is ASC. |
| Query | after | No | Cursor or value to paginate after. |
| Query | before | No | Cursor or value to paginate before. |
| Query | first | No | Limit to the first N items after a cursor. |
| Query | last | No | Limit to the last N items before a cursor. |
| Query | total_count | No | Include total count in the response. |
curl "https://{BASE_URL}/api/v1/app/project/{projectID}/member?page=1&page_size=50&total_count=true" \
-H "Authorization: Bearer {API_TOKEN}" \
-H "x-org: {org_slug}"
Example response
Example response
{
"data": [
{
"id": "{wsMemberId}",
"role": "Owner",
"account": {
"id": "{accountId}",
"state": "Active",
"email": "sasha@example.com",
"name": "Sasha Patel",
"profile_picture": "https://{BASE_URL}/files/profile-picture.png",
"provider": "Credentials",
"roles": ["Workspace"],
"created_at": "2026-01-10T09:00:00Z",
"updated_at": "2026-02-08T14:12:45Z"
},
"is_project_member": true
}
],
"has_next_page": false,
"has_previous_page": false,
"total_count": 1
}
Add members
Endpoint parameters
Endpoint parameters
| Type | Name | Required | Notes |
|---|---|---|---|
| Path | projectID | Yes | Project identifier. |
| Body | members | Yes | Array of members to add. |
| Body | members[].ws_member_id | Yes | Workspace member identifier. |
| Body | members[].role | Yes | Viewer, Commenter, Editor, Admin, or Owner. |
curl -X POST "https://{BASE_URL}/api/v1/app/project/{projectID}/member" \
-H "Authorization: Bearer {API_TOKEN}" \
-H "x-org: {org_slug}" \
-H "Content-Type: application/json" \
-d '{
"members": [
{ "ws_member_id": "{wsMemberId}", "role": "Editor" }
]
}'
Example response
Example response
[
{
"id": "{wsMemberId}",
"role": "Editor",
"account": {
"id": "{accountId}",
"state": "Active",
"email": "jordan@example.com",
"name": "Jordan Lee",
"profile_picture": "https://{BASE_URL}/files/profile-picture.png",
"provider": "Credentials",
"roles": ["Workspace"],
"created_at": "2026-01-10T09:00:00Z",
"updated_at": "2026-02-07T09:20:12Z"
},
"is_project_member": true
}
]
Update member roles
Endpoint parameters
Endpoint parameters
| Type | Name | Required | Notes |
|---|---|---|---|
| Path | projectID | Yes | Project identifier. |
| Body | members | Yes | Array of members to update. |
| Body | members[].ws_member_id | Yes | Workspace member identifier. |
| Body | members[].role | No | Viewer, Commenter, Editor, Admin, or Owner. |
| Body | members[].is_pinned | No | Pins or unpins the project for that member. |
curl -X PUT "https://{BASE_URL}/api/v1/app/project/{projectID}/member" \
-H "Authorization: Bearer {API_TOKEN}" \
-H "x-org: {org_slug}" \
-H "Content-Type: application/json" \
-d '{
"members": [
{ "ws_member_id": "{wsMemberId}", "role": "Admin", "is_pinned": true }
]
}'
Example response
Example response
[
{
"id": "{wsMemberId}",
"role": "Admin",
"account": {
"id": "{accountId}",
"state": "Active",
"email": "jordan@example.com",
"name": "Jordan Lee",
"profile_picture": "https://{BASE_URL}/files/profile-picture.png",
"provider": "Credentials",
"roles": ["Workspace"],
"created_at": "2026-01-10T09:00:00Z",
"updated_at": "2026-02-07T09:20:12Z"
},
"is_project_member": true
}
]
Get or remove a member
Useme in place of wsMemberId to target the authenticated workspace member.
Endpoint parameters
Endpoint parameters
| Type | Name | Required | Notes |
|---|---|---|---|
| Path | projectID | Yes | Project identifier. |
| Path | wsMemberId | Yes | Workspace-member ID, or me for the authenticated member. |
- Get member
- Remove member
curl "https://{BASE_URL}/api/v1/app/project/{projectID}/member/{wsMemberId}" \
-H "Authorization: Bearer {API_TOKEN}" \
-H "x-org: {org_slug}"
Example response
Example response
{
"id": "{wsMemberId}",
"role": "Admin",
"account": {
"id": "{accountId}",
"state": "Active",
"email": "jordan@example.com",
"name": "Jordan Lee",
"profile_picture": "https://{BASE_URL}/files/profile-picture.png",
"provider": "Credentials",
"roles": ["Workspace"],
"created_at": "2026-01-10T09:00:00Z",
"updated_at": "2026-02-07T09:20:12Z"
},
"is_project_member": true
}
curl -X DELETE "https://{BASE_URL}/api/v1/app/project/{projectID}/member/{wsMemberId}" \
-H "Authorization: Bearer {API_TOKEN}" \
-H "x-org: {org_slug}"
Example response
Example response
{
"id": "{wsMemberId}",
"role": "Admin",
"account": {
"id": "{accountId}",
"state": "Active",
"email": "jordan@example.com",
"name": "Jordan Lee",
"profile_picture": "https://{BASE_URL}/files/profile-picture.png",
"provider": "Credentials",
"roles": ["Workspace"],
"created_at": "2026-01-10T09:00:00Z",
"updated_at": "2026-02-07T09:20:12Z"
},
"is_project_member": true
}
Errors and edge cases
- 403: not allowed to manage members.
- 404: project or workspace member not found.