---
title: "Transfer firm ownership to another member"
method: POST
path: "/internal/api/settings/team/members/{user_id}/transfer-ownership"
tags: ["SETTINGS"]
---

# Transfer firm ownership to another member

`POST /internal/api/settings/team/members/{user_id}/transfer-ownership`

## 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}/transfer-ownership`
- Auth: OAuth 2
  - Password
  - Token URL: `/auth/login`

Promotes the target to Owner and demotes the current Owner to Administrator in a single transaction, so the firm is never left with zero or two owners. Owner-only.

## Path parameters

- `user_id` string, uuid, required

## Response `200`

Successful Response

- TeamListResponse
  - `data` TeamMemberResponse[], required
    - `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
  - `meta` TeamListMeta, required
    - `total` integer, required
    - `seats` SeatUsage, required: Seats consumed = ACTIVE users + PENDING invites. INACTIVE and SUSPENDED users are free on purpose: deactivating is how a firm frees capacity without destroying the attribution history that IRC §6107(b) retention depends on.
      - `used` integer, required
      - `limit` integer, required
    - `pending_invites` integer, required
    - `expired_invites` integer
    - `can_manage_team` boolean, required
    - `can_transfer_ownership` boolean, required
    - `current_user_role` 'OWNER' | 'ADMIN' | 'USER' | 'SUPER_ADMIN' | 'REVIEWER' | 'PREPARER' | 'MANAGER', required

## 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)
