> ## Documentation Index
> Fetch the complete documentation index at: https://docs.linquid.io/llms.txt
> Use this file to discover all available pages before exploring further.

# Members, Invitations, and Ownership

> Workspace team APIs for listing members, inviting users, role updates, removals, and ownership transfer

# Members, Invitations, and Ownership

These routes manage workspace team access.

## Endpoints

* `GET /api/workspaces/:workspaceId/members`
* `POST /api/workspaces/:workspaceId/members/invite`
* `PATCH /api/workspaces/:workspaceId/members/:memberId`
* `DELETE /api/workspaces/:workspaceId/members/:memberId`
* `POST /api/workspaces/:workspaceId/transfer-ownership`
* `GET /api/workspaces/invitations/pending`
* `POST /api/workspaces/invitations/:token/accept`
* `DELETE /api/workspaces/invitations/:invitationId`

## Auth and permission model

All routes are session-only and reject API-key auth.

* `members:read`: list members
* `members:invite`: invite members
* `members:update_roles`: change member role
* `members:remove`: remove member
* owner role: transfer ownership

## Invite request payload

`POST /api/workspaces/:workspaceId/members/invite`

```json theme={null}
{
  "email": "user@example.com",
  "role": "viewer"
}
```

Batch invite is also supported:

```json theme={null}
{
  "emails": ["a@example.com", "b@example.com"],
  "role": "editor"
}
```

Rules enforced by the API:

* Up to `10` emails per request.
* Role must be `admin`, `editor`, or `viewer`.
* Role escalation is blocked if actor cannot manage target role.
* Team-member plan limits include active members plus pending invites.
* Invitations expire after `7` days.

## Role updates and removals

`PATCH /api/workspaces/:workspaceId/members/:memberId`

```json theme={null}
{ "role": "admin" }
```

Safeguards:

* Self role-change is blocked.
* Non-owner users cannot modify owner role.
* Last-owner demotion is blocked.

`DELETE /api/workspaces/:workspaceId/members/:memberId`

Safeguards:

* Owner removal is blocked.
* Equal/higher-role removal is blocked unless valid by policy.
* Removal also deletes that user's workspace API keys and clears workspace session cache.

## Ownership transfer

`POST /api/workspaces/:workspaceId/transfer-ownership`

```json theme={null}
{ "newOwnerId": "usr_123" }
```

Rules:

* Caller must be current owner.
* Target must be an active member of the same workspace.
* Transfer to self is blocked.
* Previous owner is downgraded to `admin`.

## Invitation lifecycle routes

* `GET /api/workspaces/invitations/pending`: lists pending invites for current user email.
* `POST /api/workspaces/invitations/:token/accept`: accepts a tokenized invite.
* `DELETE /api/workspaces/invitations/:invitationId`: recipient can decline, inviter can cancel.

Accept endpoint safeguards:

* Token is hashed before lookup.
* Invalid/expired/wrong-email tokens return a generic invalid response.
* Workspace join cap is enforced at acceptance time.

## Common errors

* `400`: invalid role, invalid invite payload, transfer precondition failed
* `403`: missing permission, role escalation, owner protections
* `404`: workspace/member/invitation not found
* `409`: invite/member lifecycle conflict (already invited/member)
