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

# Users

> Manage Arize account users programmatically. List, create, update, delete, and invite users via the Python SDK.

<Note>
  The `users` client methods are currently in **BETA**. The API may change without notice. A one-time warning is emitted on first use.
</Note>

Manage account users programmatically. Unlike organizations, users are looked up by ID only — not by name — because display names are not unique within an account.

## Key Capabilities

* List users in the account with optional email and status filters
* Retrieve user details by ID
* Create new users with account-level role assignments
* Update display name and developer permission flag
* Soft-delete users individually or in bulk (cascades to memberships, API keys, and role bindings)
* Resend invitations and trigger password-reset emails

## List Users

List users in the account. Optionally filter by an email substring (case-insensitive) and one or more statuses.

```python theme={null}
resp = client.users.list(
    email="@acme.com",            # optional substring filter
    status=["active", "invited"], # optional status filter
    limit=50,
)

for user in resp.users:
    print(user.id, user.email, user.status)
```

For details on pagination, field introspection, and data conversion (to dict/JSON/DataFrame), see [Response Objects](/api-clients/python/version-8/overview#response-objects).

## Get a User

Retrieve a specific user by ID or by exact email address. When `user` contains `@` it is treated as an email and looked up case-insensitively (returns `None` if no exact match); otherwise it is treated as a user ID.

```python theme={null}
# By ID
user = client.users.get(user="your-user-id")

# By email (case-insensitive exact match)
user = client.users.get(user="ada@example.com")

print(user.id, user.email, user.role)
```

## Create a User

Create a new user and assign them an account-level role. The email is used as the idempotency key.

```python theme={null}
from arize.users.types import PredefinedUserRole

user = client.users.create(
    name="Ada Lovelace",
    email="ada@example.com",
    role=PredefinedUserRole(name="member"),  # "admin", "member", or "annotator"
    invite_mode="email_link",                 # "none", "email_link", or "temporary_password"
)

print(user.id, user.email)
```

To assign a custom RBAC role instead:

```python theme={null}
from arize.users.types import CustomUserRole

user = client.users.create(
    name="Grace Hopper",
    email="grace@example.com",
    role=CustomUserRole(id="your-custom-role-id"),
    invite_mode="email_link",
)
```

`is_developer` defaults to `True` for `admin` / `member` roles and `False` for `annotator`. You can override it explicitly:

```python theme={null}
user = client.users.create(
    name="Annotator Bot",
    email="bot@example.com",
    role=PredefinedUserRole(name="annotator"),
    invite_mode="none",
    is_developer=False,
)
```

## Update a User

Update a user's metadata. At least one of `name` or `is_developer` must be provided.

```python theme={null}
user = client.users.update(
    user_id="your-user-id",
    name="Updated Name",
    is_developer=True,
)

print(user.id, user.name, user.is_developer)
```

## Delete a User

Soft-delete a user. This cascades to organization memberships, space memberships, API keys, and role bindings.

```python theme={null}
client.users.delete(user_id="your-user-id")

print("User deleted")
```

## Bulk Delete Users

Soft-delete multiple users in a single call by ID, email, or a mix. When emails are provided, each is resolved to a user ID via a case-insensitive exact match; unresolved emails are recorded as `NOT_FOUND`. At least one of `user_ids` or `emails` must be provided.

```python theme={null}
results = client.users.bulk_delete(
    user_ids=["user-id-1", "user-id-2"],
    emails=["someone@example.com"],
)

for r in results:
    print(r.user_id, r.email, r.status, r.error)
```

Each `BulkUserDeletionResult` has a `status` of `DELETED`, `NOT_FOUND`, or `FAILED`, with an optional `error` message for failures.

## Resend an Invitation

Resend an invitation email for a pending user. The target user must currently be in the `invited` state.

```python theme={null}
client.users.resend_invitation(user_id="your-user-id")

print("Invitation resent")
```

## Reset a Password

Trigger a password-reset email for a user. The user must authenticate via password (not SSO/SAML) and must have already verified their account. The reset link is valid for 30 minutes.

```python theme={null}
client.users.reset_password(user_id="your-user-id")

print("Password reset email sent")
```
