# Directory

> The workspace's members (ids, names, roles, avatars — never email addresses) and groups, the ids that assignments, Members fields and assignee filters use.

Source: https://developers.processcart.com/guides/directory

Operations: [Directory endpoints](https://developers.processcart.com/reference/directory).

The directory is read-only through the API (scope `users:read`). Its user ids are what every `assignees[].userId`, `startedByUserId`, `completedByUserId`, Members-field value and `assignee=u:<id>` filter refers to; its group ids are what `{ "kind": "group" }` assignees and `assignee=g:<id>` use.

## Members

`GET /v1/users` lists the workspace's members in the order they joined:

```json
{ "id": "11111111-…", "name": "Ada Lovelace", "role": "builder", "avatarUrl": "https://…/avatars/…", "joinedAt": "2026-06-22T15:00:00.000Z" }
```

- `role` is `member`, `builder` or `admin`.
- **Email addresses are not exposed.** Addresses live only in the authentication store, which is not scoped to a workspace; a member is identified to an integration by id and display name. Match your own records to Process Cart members by id, captured once (from a Members field, an assignee or this list).
- `name` is null for a member who has not set one; `avatarUrl` null when there is no avatar.

## Groups

`GET /v1/groups` lists the workspace's groups by name, each with the ids of its current members:

```json
{ "id": "g2h3…", "name": "Fulfillment", "memberIds": ["11111111-…", "22222222-…"], "createdAt": "2026-08-08T20:00:00.000Z" }
```

Groups are managed by Admins in Settings → Groups. Through the API they are the way to resolve a group assignee into people, and to filter runs by `assignee=g:<id>`.

Both lists page with `limit` (up to 200) and `cursor`.
