---
title: "List workspace members"
method: GET
path: "/v1/workspaces/{workspace_id}/members"
tags: ["members-access"]
---

# List workspace members

`GET /v1/workspaces/{workspace_id}/members`

**Plan:** `Enterprise`

Returns a paginated list of workspace members, filtered by role and status.

## Path parameters

- `workspace_id` string, required — Workspace ID

## Query parameters

- `limit` integer — Maximum results per page.
- `cursor` string — Opaque cursor from a prior response. Omit on the first page.
- `query` string — Substring filter applied to display name, username, and email tokens (matching the workspace member search backend).
- `roles` string — Comma-separated role filter. Valid values: owner, admin, member, viewer, collaborator. Empty = all roles. Unknown values return 400.
- `status` 'all' | 'active' | 'pending' — Filter by membership status. Default 'active' excludes pending invites.
- `sort_by` 'name' | 'joined_at' | 'role' | 'relevance' — Sort field. Defaults to relevance when query is set, otherwise role + recency.
- `sort_order` 'asc' | 'desc' — Sort direction. Only applied when sort_by is set; the default-sort case has a fixed direction baked into the underlying query.
- `scim_managed` 'managed' | 'unmanaged' — Filter by SCIM provisioning status. Empty = all members, 'managed' = only SCIM-provisioned members, 'unmanaged' = only members not managed by SCIM.

## Response `200`

OK

- CursorListResponseV1WorkspaceMember
  - `data` V1WorkspaceMember[], nullable, required
    - `display_name` string — User display name as stored on the membership.
    - `email` string — Member email as stored on the membership. For pending invites this is the invited email. May be absent on legacy membership rows.
    - `invited_at` string, date-time — When the user was invited.
    - `joined_at` string, date-time — When the user accepted the invitation. Absent on pending invites.
    - `monthly_credit_limit` number, double — Explicit monthly credit cap for this member. Absent means no per-member cap is set and the workspace default applies. Visible for yourself; visible for other members only with permission to view member usage.
    - `role` string, required — Workspace role. One of: owner, admin, member, viewer, collaborator.
    - `user_id` string, required — Stable opaque identifier for the entry. For active members this is the user ID; for pending invites this is the Spanner-generated membership row id (never an email-derived value).
    - `workspace_id` string, required — Workspace the membership belongs to.
  - `pagination` Pagination, required
    - `has_more` boolean, required — Whether more results are available beyond this page
    - `next_cursor` string, nullable, required — Cursor for the next page; null when there are no more results

## Other responses

- `401` — Missing or invalid API key.
- `402` — This operation or requested configuration requires a workspace plan that includes this feature.
- `403` — The key or caller lacks the required scope or permission.
- `406` — The Accept header excludes every media type this endpoint produces.
- `429` — Too many requests. Retry after the interval in Retry-After when present.
- `default` — Error. The response body uses the standard error envelope; status matches the HTTP status code and type is a machine-readable error code.

---

[API](https://skmtc.net/lovable/apis/lovable-api.md) · [All operations](https://skmtc.net/lovable/apis/lovable-api/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/lovable/lovable-api/revisions/aa8d44585147/schema)
