---
title: "Change a member's role (owner-protected)"
method: PATCH
path: "/members/{id}"
tags: ["Members"]
---

# Change a member's role (owner-protected)

`PATCH /members/{id}`

## Request

- Base URL: `https://api.customdomain.ai/v1`
- URL: `https://api.customdomain.ai/v1/members/{id}`
- Auth: HTTP bearer

## Path parameters

- `id` string, required

## Request body

- object
  - `role` 'owner' | 'admin' | 'member' | 'viewer', required

## Response `200`

Updated

- Member
  - `id` string, required
  - `tenant_id` string, required
  - `email` string, required
  - `role` 'owner' | 'admin' | 'member' | 'viewer', required
  - `status` 'active' | 'pending' | 'expired', required: `active` once accepted, `pending` while the invite link works, `expired` once it has lapsed.
  - `invited_by` string: The accepting user's id in the calling application, when one was supplied at accept.
  - `inviter_email` string: Who sent (or last re-sent) the invite, resolved from the sending credential.
  - `inviter_name` string: The sender's display name, when one was supplied.
  - `invite_sent_at` string, date-time: When the current invite link was issued.
  - `invite_expires_at` string, date-time: When the current invite link stops working. Absent for members never invited by link.
  - `invite_token` string: The single-use invite token. Present only in the invite, resend and get-invite responses, never in the roster.
  - `accepted_at` string, date-time
  - `created_at` string, date-time, required

## Other responses

- `400`: Error envelope: {code, title, details}.
- `401`: Error envelope: {code, title, details}.
- `403`: Error envelope: {code, title, details}.
- `404`: Error envelope: {code, title, details}.

---

[API](https://skmtc.dev/customdomain/apis/customdomain-control-plane-api.md) · [All operations](https://skmtc.dev/customdomain/apis/customdomain-control-plane-api/llms.txt) · [OpenAPI document](https://skmtc.dev/customdomain/apis/customdomain-control-plane-api/revisions/34d89cb7a7cd?raw)
