Members
Manage project team members. Invite collaborators, assign roles, and control access permissions.
Role permissions
| Permission | admin | member | viewer |
|---|---|---|---|
| View test cases & runs | |||
| Create & edit test cases | |||
| Execute test runs | |||
| Manage milestones | |||
| Invite & remove members | |||
| Change member roles | |||
| Project settings | |||
| Delete project |
GET
/v1/projects/:project_id/membersList members
Retrieve all members of a project including their role, email, and join date.
Query parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
| role | string | No | Filter by role: admin, member, or viewer |
| page | number | No | Page number for pagination (default: 1) |
| per_page | number | No | Items per page (default: 20, max: 100) |
Request
curl -H "Authorization: Bearer YOUR_API_TOKEN" \
"https://api.testably.app/v1/projects/proj_abc123/members"Response 200 OK
{
"data": [
{
"id": "user_42",
"email": "alice@example.com",
"name": "Alice Kim",
"avatar_url": "https://cdn.testably.app/avatars/user_42.png",
"role": "admin",
"joined_at": "2026-01-15T08:00:00Z"
},
{
"id": "user_43",
"email": "bob@example.com",
"name": "Bob Park",
"avatar_url": null,
"role": "member",
"joined_at": "2026-02-01T10:30:00Z"
},
{
"id": "user_44",
"email": "carol@example.com",
"name": "Carol Lee",
"avatar_url": null,
"role": "viewer",
"joined_at": "2026-03-10T14:00:00Z"
}
],
"meta": { "page": 1, "per_page": 20, "total": 3 }
}POST
/v1/projects/:project_id/members/inviteInvite member
Send an invitation to join the project. The invited user receives an email with a join link. Requires admin role.
Request body
| Parameter | Type | Required | Description |
|---|---|---|---|
| string | Yes | Email address to invite | |
| role | string | Yes | Assigned role: admin, member, or viewer |
Request
curl -X POST \
-H "Authorization: Bearer YOUR_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"email": "dave@example.com",
"role": "member"
}' \
"https://api.testably.app/v1/projects/proj_abc123/members/invite"Response 201 Created
{
"id": "inv_001",
"email": "dave@example.com",
"role": "member",
"status": "pending",
"invited_by": "user_42",
"expires_at": "2026-04-05T09:00:00Z",
"created_at": "2026-03-29T09:00:00Z"
}PATCH
/v1/projects/:project_id/members/:user_idChange member role
Update a member's role. Requires admin role. You cannot change your own role if you are the last admin.
Request body
| Parameter | Type | Required | Description |
|---|---|---|---|
| role | string | Yes | New role: admin, member, or viewer |
Request
curl -X PATCH \
-H "Authorization: Bearer YOUR_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{ "role": "admin" }' \
"https://api.testably.app/v1/projects/proj_abc123/members/user_43"Response 200 OK
{
"id": "user_43",
"email": "bob@example.com",
"name": "Bob Park",
"role": "admin",
"joined_at": "2026-02-01T10:30:00Z",
"updated_at": "2026-03-29T09:15:00Z"
}DELETE
/v1/projects/:project_id/members/:user_idRemove member
Remove a member from the project. Requires admin role. You cannot remove yourself if you are the last admin.
Request
curl -X DELETE \
-H "Authorization: Bearer YOUR_API_TOKEN" \
"https://api.testably.app/v1/projects/proj_abc123/members/user_44"Response 204 No Content
(empty response body)
Error responses
| Status | Description |
|---|---|
| 400 | Invalid request body (e.g., invalid role value) |
| 401 | Missing or invalid API token |
| 403 | Insufficient permissions (admin role required) |
| 404 | Project or member not found |
| 409 | User already a member or pending invitation exists |
| 422 | Cannot remove or demote the last admin |
| 429 | Rate limit exceeded (60 req/min) |