---
title: "Change a member's role and/or status"
method: PATCH
path: "/internal/api/settings/team/members/{user_id}"
tags: ["SETTINGS"]
---

# Change a member's role and/or status

`PATCH /internal/api/settings/team/members/{user_id}`

## Request

- Base URL: `https://api.signalshq.io` (the document declares no server; this is the origin it was published from)
- URL: `https://api.signalshq.io/internal/api/settings/team/members/{user_id}`
- Auth: OAuth 2
  - Password
  - Token URL: `/auth/login`

Deactivation is effective on the target's very next request — the authentication dependency re-reads user status from the database on every call. There is deliberately no delete: a preparer who touched a return must still resolve to a name years later.

## Path parameters

- `user_id` string, uuid, required

## Request body

- MemberUpdateRequest: Change an existing member's role and/or status. Both fields optional; at least one required. Only ACTIVE and INACTIVE are settable — SUSPENDED is a platform-side action, and there is deliberately no value that deletes anybody.
  - `role` 'OWNER' | 'ADMIN' | 'USER' | 'SUPER_ADMIN' | 'REVIEWER' | 'PREPARER' | 'MANAGER'
  - `status` 'ACTIVE' | 'INACTIVE' | 'SUSPENDED' | 'INVITED' | 'EXPIRED': Roster status — the union of user status and invite lifecycle.

## Response `200`

Successful Response

- MemberUpdateResponse: NOTE: revoked_invite_count reports invitations withdrawn as a side effect of offboarding, so the admin learns that an outgoing colleague's pending grants went with them rather than discovering it from a confused invitee.
  - `member` TeamMemberResponse, required: One roster row — a real user or a pending invite.
    - `id` string, uuid, required
    - `type` 'user' | 'invite', required: Discriminates the two sources merged into one roster row. The client keys rows on ``f"{type}:{id}"`` and otherwise never needs to know that users and invites are separate tables.
    - `email` string, required
    - `name` string, nullable
    - `role` 'OWNER' | 'ADMIN' | 'USER' | 'SUPER_ADMIN' | 'REVIEWER' | 'PREPARER' | 'MANAGER', required
    - `status` 'ACTIVE' | 'INACTIVE' | 'SUSPENDED' | 'INVITED' | 'EXPIRED', required: Roster status — the union of user status and invite lifecycle.
    - `last_login_at` string, date-time, nullable
    - `created_at` string, date-time, required
    - `invited_by` InvitedByRef
      - `id` string, uuid, required
      - `name` string, nullable
    - `invite_expires_at` string, date-time, nullable
    - `is_self` boolean
  - `assigned_workflow_count` integer

## Other responses

- `422`: Validation Error

---

[API](https://skmtc.dev/signalshq/apis/signals-api.md) - [All operations](https://skmtc.dev/signalshq/apis/signals-api/llms.txt) - [OpenAPI document](https://skmtc.dev/signalshq/apis/signals-api/revisions/2c22af3b5576?raw)
