List workspace members

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

post/api/workspace/members/list

Query parameters

workspaceIdstring nullable

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.

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.

Request body

searchstring nullable

Text to match, ignoring case, anywhere in a member's email, name, role, or status.

search_termsstring[] 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.

rolesstring[] nullable

Only members with one of these roles: owner, admin, editor, viewer, or guest.

invite_statusesstring[] nullable

Only people in one of these states: joined, pending (invited and not yet joined), or expired (the invitation lapsed).

credit_limit_setboolean 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.

cursorstring nullable

next_cursor from the previous page. Leave it out for the first page.

page_sizeinteger

How many people to return, 1 to 100. Defaults to 50.

Example request

{
  "search": "acme.com",
  "search_terms": [
    "dana@acme.com",
    "sam@acme.com"
  ],
  "sort_by": "last_active",
  "sort_dir": "desc",
  "roles": [
    "admin",
    "editor"
  ],
  "invite_statuses": [
    "joined"
  ],
  "credit_limit_set": true,
  "apps_owned": {
    "gte": 1,
    "lte": 10
  },
  "agents_owned": {
    "gte": 1,
    "lte": 10
  },
  "last_active": {
    "gte": "2026-09-01T00:00:00Z",
    "lte": "2026-09-30T23:59:59Z"
  },
  "cursor": "NTA=",
  "page_size": 50
}

Response

One page of members.

next_cursorstring nullable required

Pass as cursor to get the next page. null on the last page.

has_moreboolean required

true when there's another page.

totalinteger required

Number of people matching the filters, across all pages.

monthly_limitinteger nullable required

The workspace's monthly credits, or null when they're unlimited.

default_member_credit_limitinteger nullable required

The workspace's default member credit limit, or null when none is set.

Example response

{
  "members": [
    {
      "access_state": "granted",
      "agents_owned": 1,
      "agents_shared": 0,
      "apps_owned": 4,
      "apps_shared": 0,
      "assigned_via": "direct",
      "credit_limit": 500,
      "credits_used": 128.5,
      "email": "dana@acme.com",
      "full_name": "Dana Levi",
      "is_default_limit": false,
      "last_active": "2026-10-03T14:12:08.512000",
      "last_seen": "2026-10-05T08:41:22.004000",
      "role": "editor",
      "status": "active",
      "user_id": "66f1c2a9b7e3d4001f8a2c55"
    }
  ],
  "next_cursor": "NTA=",
  "has_more": true,
  "total": 137,
  "monthly_limit": 10000,
  "default_member_credit_limit": 300
}

Changes

Changed in 1 of the 40 revisions of this API.1