Skip to content

Change a member’s role

PATCH
/v1/members/{id}
curl --request PATCH \
--url https://beta-api.plune.ai/v1/members/example \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '{ "role": "reader" }'

Owner only (api.tssetMemberRole, the role select on a row). The id is the member’s user id, as GET /v1/members lists it. The same role again is a no-op that answers 200. The one refusal that is not about who asked: the last owner cannot be demoted, because a project nobody can manage is a project nobody can leave either — make somebody else an owner first (409).

id
required
string

The member’s userId

X-Plune-Project
string

Which of your projects to act in — an id from GET /v1/projects. Absent, your default project. A project you are not a member of answers 404, the same as one that does not exist. Ignored under a bearer token, which is bound to the project it was minted in.

Media type application/json
object
role
required

What a member may do (B8-team). owner runs the project — members, roles, its name; member does everything else; reader is refused every write at the boundary, before a handler runs.

string
Allowed values: owner member reader
Example
{
"role": "reader"
}

The member as they are now

Media type application/json
object
userId
required
string format: uuid
email
required
string format: email
name
required

The display name, once people have one (T3); null until then.

string
nullable
role
required

What a member may do (B8-team). owner runs the project — members, roles, its name; member does everything else; reader is refused every write at the boundary, before a handler runs.

string
Allowed values: owner member reader
joinedAt
required
string format: date-time
invitedBy
required

Who invited them (a userId); null for the person the project was created by.

string
nullable
Example
{
"userId": "6f1c2b3a-0000-4000-8000-0000000000a2",
"email": "[email protected]",
"name": null,
"role": "reader",
"joinedAt": "2026-09-16T09:12:04.151Z",
"invitedBy": "u-shop"
}

Invalid body — one of the three roles

Media type application/json
object
error
required
string
Example generated
{
"error": "example"
}

No / invalid token or session

A member or a reader asked

Media type application/json
object
error
required
string
Example
{
"error": "project owner only"
}

No such member in this project

Media type application/json
object
error
required
string
Example
{
"error": "member '6f1c2b3a-0000-4000-8000-0000000000a2' not found"
}

The last owner

Media type application/json
object
error
required
string
Example
{
"error": "a project needs an owner — make somebody else one first"
}

Rate-limited: either the per-route throttle or a tenant quota. Retry-After carries the seconds until the window rolls over.

Media type application/json
object
error
required
string
Example generated
{
"error": "example"
}
Retry-After
integer

Seconds until the window rolls over