---
title: "List workspace members"
method: POST
path: "/api/workspace/members/list"
---

# List workspace members

`POST /api/workspace/members/list`

## Request

- Base URL: `https://app.base44.com`
- URL: `https://app.base44.com/api/workspace/members/list`
- Auth: HTTP bearer

<Info>This API is in beta. Endpoints, fields, and behavior may still change, so avoid depending on it in production.</Info>

Returns one page of a workspace's members and pending invitations, with each person's role, credit use, credit limit, and the apps and agents they have.

Filter with `roles`, `invite_statuses`, `credit_limit_set`, `apps_owned`, `agents_owned`, and `last_active`. A member must match every filter you set. `search` and `search_terms` match part of an email, name, role, or status, and a member matches when any term does.

Set both `sort_by` and `sort_dir` to sort. Otherwise, and to break ties, joined members come before pending invitations, then by role from owner to guest, then by email. Sorting by `last_active` puts members who never used credits last in either direction.

To page, send the same body with `cursor` set to the previous response's `next_cursor`, until `has_more` is `false`. `total` counts every match. A `cursor` that Base44 didn't return starts again from the first page.

Owners and admins see everyone's `credits_used` and `last_seen`. Other members see them only on their own row and get `null` for everyone else, and sorting by `credits` falls back to the default order for them. Active guests with a Base44 staff email aren't listed.

<Warning>Results come from a cached copy that lasts 2 minutes for workspaces up to 200 people, 15 minutes up to 10,000, and 30 minutes above that, so `credits_used`, `last_active`, and `last_seen` can be that old. Changing members through Base44 starts a fresh copy, and positions in it can shift, so a page read with an older `cursor` can skip or repeat people. After you change members, page again from the start.</Warning>

This is limited to 30 requests per minute. A signed-in session has its own limit, and every personal access token for the workspace shares one. Some workspaces have a different limit.

<Note>Call this as any member of the workspace other than a guest, with a personal access token for that workspace sent as a Bearer token, or from a signed-in session. Read-only tokens work. Workspace API keys aren't accepted.</Note>

## Query parameters

- `workspaceId` string: ID of the workspace. With a personal access token, use the token's workspace, which is also the default. From a signed-in session it defaults to your active workspace. Get it from `organization_id` in [Get app](/api-reference/get-app).

## Request body

- MembersListRequest: One page of a members list.
  - `search` string, nullable: Text to match, ignoring case, anywhere in a member's email, name, role, or status.
  - `search_terms` string[], nullable: More text to match the same way as `search`, up to 200 terms. A member matches when any term does.
  - `sort_by` 'member' | 'credits' | 'apps' | 'agents' | 'last_active' | 'role', nullable: Column to sort by: `member` (name, or email when there's no name), `credits` (`credits_used`), `apps` and `agents` (owned plus shared), `last_active`, or `role` (owner, admin, editor, viewer, guest). Needs `sort_dir`.
  - `sort_dir` 'asc' | 'desc', nullable: Sort direction. Needs `sort_by`.
  - `roles` string[], nullable: Only members with one of these roles: `owner`, `admin`, `editor`, `viewer`, or `guest`.
  - `invite_statuses` string[], nullable: Only people in one of these states: `joined`, `pending` (invited and not yet joined), or `expired` (the invitation lapsed).
  - `credit_limit_set` boolean, nullable: `true` for only members with their own credit limit, `false` for only members without one. A member on the workspace default counts as not having their own.
  - `apps_owned` MembersNumberRangeFilter: Inclusive bounds on a count. Set either bound, or both.
    - `gte` number, nullable: Lowest count to include.
    - `lte` number, nullable: Highest count to include.
  - `agents_owned` MembersNumberRangeFilter: Inclusive bounds on a count. Set either bound, or both.
    - `gte` number, nullable: Lowest count to include.
    - `lte` number, nullable: Highest count to include.
  - `last_active` MembersDateRangeFilter: Inclusive bounds on a time. Set either bound, or both.
    - `gte` string, date-time, nullable: Earliest time to include, in ISO 8601.
    - `lte` string, date-time, nullable: Latest time to include, in ISO 8601.
  - `cursor` string, nullable: `next_cursor` from the previous page. Leave it out for the first page.
  - `page_size` integer: How many people to return, 1 to 100. Defaults to 50.

## Response `200`

One page of members.

- MembersListPage: One page of workspace members.
  - `members` WorkspaceMemberRow[], required: The people on this page.
    - `email` string, required: Email of the member or invitee, in the casing it was added with. Pass it as is to the endpoints that take a member's email.
    - `full_name` string, nullable, required: Full name, or `null` when there isn't one, as for an invitee without a Base44 account.
    - `user_id` string, nullable, required: ID of the person's Base44 account, or `null` for an invitee without one.
    - `role` string, required: Role in the workspace: `owner`, `admin`, `editor`, `viewer`, or `guest`.
    - `status` string, required: `active` for a member, `pending` for someone invited who hasn't joined.
    - `assigned_via` string, required: `group` when a group grants the role, so it can only change at the group. `direct` otherwise.
    - `access_state` string, required: `blocked` when a group with no access blocks the member, so `role` grants nothing. `granted` otherwise.
    - `invitation_expires_at` string, nullable, required: When a pending invitation expires, in ISO 8601 UTC without an offset. `null` for members who joined.
    - `credits_used` number, nullable, required: Credits the member used in the workspace this month. `null` on other members' rows when you aren't an owner or admin.
    - `credit_limit` integer, nullable, required: The member's monthly credit limit, their own or the workspace default. `null` when neither is set.
    - `is_default_limit` boolean, required: `true` when `credit_limit` is the workspace default.
    - `apps_owned` integer, required: Apps the member owns in the workspace.
    - `agents_owned` integer, required: Agents the member owns in the workspace.
    - `apps_shared` integer, required: Apps a guest was invited to collaborate on. Always `0` for other roles.
    - `agents_shared` integer, required: Agents a guest was invited to collaborate on. Always `0` for other roles.
    - `last_active` string, nullable, required: When the member last used credits in the workspace, in ISO 8601 UTC without an offset, or `null` if never.
    - `last_seen` string, nullable, required: When the member last used Base44 in this workspace, in ISO 8601 UTC without an offset, or `null` if not recorded. `null` on other members' rows when you aren't an owner or admin.
  - `next_cursor` string, nullable, required: Pass as `cursor` to get the next page. `null` on the last page.
  - `has_more` boolean, required: `true` when there's another page.
  - `total` integer, required: Number of people matching the filters, across all pages.
  - `monthly_limit` integer, nullable, required: The workspace's monthly credits, or `null` when they're unlimited.
  - `default_member_credit_limit` integer, nullable, required: The workspace's default member credit limit, or `null` when none is set.

## Other responses

- `400`: You left out `workspaceId` and your session has no active workspace.
- `401`: Missing or invalid credentials.
- `403`: You aren't a member of the workspace, you're a guest, your token is for a different workspace, or your credential can't be used on this endpoint.
- `409`: Your workspace requires an unlocked SSO session.
- `422`: Validation Error
- `429`: Rate limit exceeded.

## Changes

- **2026-10-21** `c23775445de2`: 2 breaking, 1 info
  - `query` request parameter `workspaceId` list-of-types was narrowed by removing types `null`
  - for the `query` request parameter `workspaceId`, the minLength was increased from `0` to `1`
  - for the `query` request parameter `workspaceId`, the type was generalized from no type to `string`
- **2026-10-11** `80287813ab84`: 1 info
  - the endpoint scheme security `PersonalAccessTokenAuth` was added to the API
- **2026-10-07** `dddf17e0f9f0`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/base44/apis/base44-app-management-api/changes/api/workspace/members/list/post.md)

---

[API](https://skmtc.dev/base44/apis/base44-app-management-api.md) - [All operations](https://skmtc.dev/base44/apis/base44-app-management-api/llms.txt) - [OpenAPI document](https://skmtc.dev/base44/apis/base44-app-management-api/revisions/c534f09cf314?raw)
