<!-- # hard line break macro for HTML -->

<a id="enterprise-management-sdk"></a>

# Enterprise Management SDK

One of FiftyOne’s core design principles is that you should be able to do
everything *programmatically* if you want.

To this end, the `fiftyone.management` module provides Enterprise-specific
methods for managing users, invitations, dataset permissions, plugins, API
keys, and more.

#### NOTE
You must use an [API connection](api_connection.md#enterprise-api-connection)
(not a direct MongoDB connection) in order to use Management SDK methods.

<a id="enterprise-sdk-api-reference"></a>

## API reference

<a id="enterprise-sdk-connections"></a>

## Connections

API connection.

Copyright 2017-2026, Voxel51, Inc.
<br/>
[voxel51.com](https://voxel51.com/)
<br/>
<br/>

### *class* fiftyone.management.connection.APIClientConnection

#### instance *= None*

#### reload()

#### *property* has_principal_endpoints *: [bool](../api/fiftyone.core.stages.md#fiftyone.core.stages.Exists.bool)*

True if the connected API supports principal (user + SA) endpoints.

#### *property* client

### fiftyone.management.connection.reload_api_connection() → None

Reloads the API connection.

This is necessary if the API URI or API key are changed after the first
usage of this module.

#### NOTE
This should rarely be needed unless a script is working across deployments.

Examples:

```default
import fiftyone.management as fom
import fiftyone as fo

# https://api.dev.mycompany.org
print(fo.config.api_uri)
fom.whoami()

# Change API URI, need to reload cached connection
fo.config.api_uri = "https://api.test.mycompany.org"
fom.reload_api_connection()
fom.whoami()
```

### fiftyone.management.connection.test_api_connection()

Tests the API connection.

If the connection succeeds, a message will be printed. If the connection
failes, an exception will be raised.

Examples:

```default
import fiftyone.management as fom
fom.test_api_connection() # API connection succeeded
```

<a id="enterprise-sdk-api-keys"></a>

## API keys

API key management.

Copyright 2017-2026, Voxel51, Inc.
<br/>
[voxel51.com](https://voxel51.com/)
<br/>
<br/>

### *class* fiftyone.management.api_key.ServiceAccount

Service account information dataclass.

#### id *: str*

#### name *: str*

#### role *: [fiftyone.management.users.UserRole](#fiftyone.management.users.UserRole)*

#### description *: str | None* *= None*

#### created_at *: [datetime.datetime](../api/fiftyone.utils.data.md#fiftyone.utils.data.datetime) | None* *= None*

### fiftyone.management.api_key.resolve_service_account_id(service_account_or_id: str | [ServiceAccount](#fiftyone.management.api_key.ServiceAccount) | Dict[str, Any] | None, nullable: [bool](../api/fiftyone.core.stages.md#fiftyone.core.stages.Exists.bool) = False) → str | None

Resolves a service account ID from an ID string, ServiceAccount instance,
or a dict containing an `"id"` key.

### *class* fiftyone.management.api_key.APIKey

API key dataclass.

#### id *: str*

#### name *: str*

#### created_at *: [datetime.datetime](../api/fiftyone.utils.data.md#fiftyone.utils.data.datetime)*

### fiftyone.management.api_key.delete_api_key(key: str, user: str | [fiftyone.management.users.User](#fiftyone.management.users.User) | [fiftyone.management.service_account.ServiceAccount](#fiftyone.management.service_account.ServiceAccount) | None = None) → None

Deletes the API key for the given user or service account (default: current user).

#### NOTE
Only admins can delete keys for other users.

Examples:

```default
import fiftyone.management as fom

# Delete all keys from a user
email = "user@company.com"
for key in fom.list_api_keys(email):
    fom.delete_api_key(key.id, email)

# Delete all keys from a service account
sa = fom.get_service_account("some-id")
for key in fom.list_api_keys(sa):
    fom.delete_api_key(key.id, sa)
```

* **Parameters:**
  * **key** – the ID of the key to delete
  * **user** (*None*) – an optional user ID, email string,
    [`User`](#fiftyone.management.users.User) instance, or
    [`ServiceAccount`](#fiftyone.management.service_account.ServiceAccount)
    instance. Defaults to the current user.

### fiftyone.management.api_key.generate_api_key(key_name: str, user: str | [fiftyone.management.users.User](#fiftyone.management.users.User) | [fiftyone.management.service_account.ServiceAccount](#fiftyone.management.service_account.ServiceAccount) | None = None) → str

Generates an API key for the given user or service account (default: current user).

#### NOTE
Only admins can generate keys for other users.

#### WARNING
Once generated, this key cannot be recovered! If it’s lost,
you must generate a new key.

Examples:

```default
import fiftyone.management as fom

# 1. Generate key for myself
fom.generate_api_key("my-key")

# 2.a Generate key for user@example.com
fom.generate_api_key("your-key", "user@example.com")

# 2.b Generate key for a service account
sa = fom.get_service_account("some-id")
fom.generate_api_key("sa-key", sa)
```

* **Parameters:**
  * **key_name** – a descriptive name for the key
  * **user** (*None*) – an optional user ID, email string,
    [`User`](#fiftyone.management.users.User) instance, or
    [`ServiceAccount`](#fiftyone.management.service_account.ServiceAccount)
    instance. Defaults to the current user.
* **Returns:**
  the API key string

### fiftyone.management.api_key.list_api_keys(user: str | [fiftyone.management.users.User](#fiftyone.management.users.User) | [fiftyone.management.service_account.ServiceAccount](#fiftyone.management.service_account.ServiceAccount) | None = None)

Lists all API keys for the given user or service account (default: current user).

The returned key objects only have their name and IDs populated; the raw
key is only available at time of generation.

#### NOTE
Only admins can request keys for other users.

Examples:

```default
import fiftyone.management as fom

# 1. List my keys
fom.list_api_keys()

# 2.a List keys for user@example.com
fom.list_api_keys("user@example.com")

# 2.b List keys for a service account
sa = fom.get_service_account("some-id")
fom.list_api_keys(sa)
```

* **Parameters:**
  **user** (*None*) – an optional user ID, email string,
  [`User`](#fiftyone.management.users.User) instance, or
  [`ServiceAccount`](#fiftyone.management.service_account.ServiceAccount)
  instance. Defaults to the current user.
* **Returns:**
  a list of [`APIKey`](#fiftyone.management.api_key.APIKey) instances

<a id="enterprise-sdk-cloud-credentials"></a>

## Cloud credentials

Cloud credentials management.

Copyright 2017-2026, Voxel51, Inc.
<br/>
[voxel51.com](https://voxel51.com/)
<br/>
<br/>

### *class* fiftyone.management.cloud_credentials.CloudCredential

Cloud Credentials Info

#### created_at *: [datetime.datetime](../api/fiftyone.utils.data.md#fiftyone.utils.data.datetime)*

#### prefixes *: [List](../api/fiftyone.operators.types.md#fiftyone.operators.types.List)[str]*

#### provider *: str*

#### description *: str | None* *= None*

#### scope *: str | None* *= None*

#### sid *: str | None* *= None*

### fiftyone.management.cloud_credentials.add_cloud_credentials(provider: Literal['GCP', 'AWS', 'AZURE', 'MINIO'], credential_type: Literal['ini', 'json', 'factory'], credentials: str | Dict, description: str | None = None, prefixes: [List](../api/fiftyone.operators.types.md#fiftyone.operators.types.List)[str] | None = None, overwrite: [bool](../api/fiftyone.core.stages.md#fiftyone.core.stages.Exists.bool) | None = True, user_id: str | None = None, user_group_id: str | None = None) → None

Adds cloud credentials to the system.

Credentials are stored in an encrypted format in the database.

#### NOTE
Admins can add cloud credentials for any user or group.
Non-admin users may add credentials for their own user ID only.

#### WARNING
This will overwrite any previously existing credentials with the same
provider/prefixes combination.

#### WARNING
Cloud credentials are made available for use for all app users (no
access to the credentials themselves). This is for media only and
doesn’t affect FiftyOne dataset permissions.

#### WARNING
Raw credentials are sent to the server in plaintext. Ensure that
your connection to the server is secure (e.g., via HTTPS) to avoid
credentials being intercepted in transit.

Examples:

```default
import os
import fiftyone.management as fom

# Add default GCP credentials from service account json file
fom.add_cloud_credentials(
    "GCP",
    "json",
    "/path/to/gcp-svc-acct.json",
    description="Default GCP credentials"
)

# Add bucket-specific AWS credentials from .ini file
fom.add_cloud_credentials(
    "AWS",
    "ini",
    "/path/to/aws-creds.ini",
    description="Readonly credentials for bucket1,bucket2",
    prefixes=["bucket1", "bucket2"]
)

# Add default AWS credentials from access keys
formatted_credentials = fom.AwsCredentialsFactory.from_access_keys(
    access_key_id=os.environ["AWS_ACCESS_KEY_ID"],
    secret_access_key=os.environ["AWS_SECRET_ACCESS_KEY"],
    default_region="us-west-2"
)

fom.add_cloud_credentials(
    "AWS",
    "factory",
    formatted_credentials,
    description="Default AWS credentials from access keys"
)
```

* **Parameters:**
  * **provider** – the shorthand cloud provider string. One of [“GCP”, “AWS”,
    “AZURE”, “MINIO”]
  * **credential_type** – 

    Type of credentials passed into `credentials` param.
    One of `["ini", "json", "factory"]`.
    `ini`: Path to an .ini file containing the credentials, such as
    > `/Users/voxel51/.aws/credentials`

    `json`: Path to a JSON file containing credentials, such as
    : `/Users/voxel51/.config/gcloud/service-account-creds.json`

    `factory`: A `dict` returned by a class method in one of the
    : provider-specific credentials factories:
      `AwsCredentialsFactory`, `AzureCredentialsFactory`,
      `MinIoCredentialsFactory`
  * **credentials** – Dict of factory-built credentials or string path to
    credentials file, based on `credential_type` parameter.
  * **description** (`None`) – Optional description for this credential set.
  * **prefixes** (`None`) – The list of bucket names the credentials apply to,
    if applicable. Defaults to `None` meaning the default credentials
    for the provider.
  * **overwrite** (`True`) – Whether to overwrite existing credentials for the
    same provider/prefixes combination.
  * **user_id** (`None`) – The user ID that these credentials should be
    associated with, if any. Mutually exclusive with user_group_id.
  * **user_group_id** (`None`) – The user group ID that these credentials
    should be associated with, if any. Mutually exclusive with user_id.
* **Raises:**
  **ValueError** – if invalid provider is supplied

### fiftyone.management.cloud_credentials.delete_cloud_credentials(provider: Literal['GCP', 'AWS', 'AZURE', 'MINIO'], prefixes: [List](../api/fiftyone.operators.types.md#fiftyone.operators.types.List)[str] | None = None, user_id: str | None = None, user_group_id: str | None = None) → None

Deletes the installed cloud credentials.

#### NOTE
Admins can delete any cloud credentials.
Non-admin users can only delete their own.

#### WARNING
This will delete credentials for all app users in the system. Ensure
there is another cloud media storage access method in place to avoid
system outage.

Examples:

```default
import fiftyone.management as fom

# Delete all credentials for a provider
provider = "AWS"
for credentials in fom.list_cloud_credentials():
    if credentials.provider == provider:
        fom.delete_cloud_credentials(provider, credentials.prefixes)
```

* **Parameters:**
  * **provider** – the shorthand cloud provider string. One of [“GCP”, “AWS”,
    “AZURE”, “MINIO”]
  * **prefixes** (*None*) – The list of bucket names the credentials apply to,
    if applicable. Defaults to `None` meaning the default credentials
    for the provider.
  * **user_id** (`None`) – The user ID that these credentials are associated
    with, if any. Mutually exclusive with user_group_id.
  * **user_group_id** (`None`) – The user group ID that these credentials
    are associated with, if any. Mutually exclusive with user_id.
* **Raises:**
  **ValueError** – if invalid provider is supplied

### fiftyone.management.cloud_credentials.list_cloud_credentials() → [List](../api/fiftyone.operators.types.md#fiftyone.operators.types.List)[[CloudCredential](#fiftyone.management.cloud_credentials.CloudCredential)]

Lists all cloud credentials installed in the system.

The returned credentials objects only have their provider, prefixes,
description, and creation time set. You cannot view the plaintext
or encrypted credentials.

#### NOTE
Only admins can list cloud credentials

Examples:

```default
import fiftyone.management as fom

fom.list_cloud_credentials()
```

* **Returns:**
  a list of [`CloudCredential`](#fiftyone.management.cloud_credentials.CloudCredential) instances

### *class* fiftyone.management.cloud_credentials.AwsCredentialsFactory

Credential factory methods for Amazon AWS provider

#### *classmethod* from_access_keys(access_key_id: str, secret_access_key: str, default_region: str | None = None, session_token: str | None = None) → Dict[str, str]

Get formatted AWS credentials from access keys.

For use in `fom.add_cloud_credentials()` only.

* **Parameters:**
  * **access_key_id** – AWS access key ID
  * **secret_access_key** – AWS secret access key
  * **default_region** (`None`) – default AWS region to set
  * **session_token** (`None`) – AWS session token
* **Returns:**
  Formatted credentials

### *class* fiftyone.management.cloud_credentials.AzureCredentialsFactory

Credential factory methods for Microsoft Azure provider

#### *classmethod* from_sas_token(account_name, sas_token, alias: str | None = None) → Dict[str, str]

Get formatted AZURE credentials from SAS token

For use in `fom.add_cloud_credentials()` only.
Note: SAS tokens often times have `%` characters that need
to be escaped to avoid interpolation. Make sure to escape
them by replacing `%` with `%%` in the token string.

* **Parameters:**
  * **account_name** – Azure account name
  * **sas_token** – Azure SAS token
  * **alias** (`None`) – alias to use for storage blobs
* **Returns:**
  Formatted credentials

#### *classmethod* from_account_key(account_name, account_key, alias: str | None = None) → Dict[str, str]

Get formatted AZURE credentials from access keys

For use in `fom.add_cloud_credentials()` only.

* **Parameters:**
  * **account_name** – Azure account name
  * **account_key** – Azure account key
  * **alias** (`None`) – alias to use for storage blobs
* **Returns:**
  Formatted credentials

#### *classmethod* from_connection_string(connection_string, alias: str | None = None) → Dict[str, str]

Get formatted AZURE credentials from connection string

For use in `fom.add_cloud_credentials()` only.

* **Parameters:**
  * **connection_string** – Azure connection string
  * **alias** (`None`) – alias to use for storage blobs
* **Returns:**
  Formatted credentials

#### *classmethod* from_client_secret(account_name, client_id, client_secret, tenant_id, alias: str | None = None) → Dict[str, str]

Get formatted AZURE credentials from client secret

For use in `fom.add_cloud_credentials()` only.

* **Parameters:**
  * **account_name** – Azure account name
  * **client_id** – Azure client ID
  * **client_secret** – Azure client secret
  * **tenant_id** – Azure tenant ID
  * **alias** (`None`) – alias to use for storage blobs
* **Returns:**
  Formatted credentials

### *class* fiftyone.management.cloud_credentials.MinIoCredentialsFactory

Credential factory methods for MINIO provider

#### *classmethod* from_access_keys(access_key_id: str, secret_access_key: str, endpoint_url: str, alias: str | None = None, default_region: str | None = None) → Dict[str, str]

Get formatted MINIO credentials from access keys

For use in `fom.add_cloud_credentials()` only.

* **Parameters:**
  * **access_key_id** – MinIO access key ID
  * **secret_access_key** – MinIO secret access key
  * **endpoint_url** – MinIO endpoint URL
  * **alias** (`None`) – alias to use for storage blobs
  * **default_region** (`None`) – default MinIO region to set
* **Returns:**
  Formatted credentials

<a id="enterprise-sdk-dataset-permissions"></a>

## Dataset permissions


<div class="available-in">
    <div class="available-in-row">
        <span class="available-in-label">Available in:</span>
        <span class="available-in-pill available-in-pill--enterprise">Enterprise</span>
    </div>
    <div class="available-in-row">
        <span class="available-in-versions">Introduced in <a href="../release-notes.html#fiftyone-enterprise-1-3-0">FiftyOne Enterprise 1.3.0</a></span>
    </div>
    
    <div class="available-in-cta">
        <a href="https://voxel51.com/book-a-demo" class="available-in-cta-link" rel="noopener noreferrer" target="_blank">
            Schedule a demo to get started with FiftyOne Enterprise
        </a>
    </div>

</div>

<a id="module-fiftyone.management.dataset"></a>

Dataset management.

Copyright 2017-2026, Voxel51, Inc.
<br/>
[voxel51.com](https://voxel51.com/)
<br/>
<br/>

### *class* fiftyone.management.dataset.UserGroup

User Group information dataclass.

#### id *: str*

#### name *: str*

#### description *: str | None*

#### principals *: [List](../api/fiftyone.operators.types.md#fiftyone.operators.types.List)[Any] | None* *= None*

#### cloud_credentials *: [List](../api/fiftyone.operators.types.md#fiftyone.operators.types.List)[[fiftyone.management.cloud_credentials.CloudCredential](#fiftyone.management.cloud_credentials.CloudCredential)] | None* *= None*

#### users *: [List](../api/fiftyone.operators.types.md#fiftyone.operators.types.List)[[fiftyone.management.users.User](#fiftyone.management.users.User)] | None* *= None*

### fiftyone.management.dataset.resolve_user_group_id(group_or_id_or_name: str | [UserGroup](#fiftyone.management.dataset.UserGroup) | None | dict) → str

Resolves group ID - by looking up group by name if it has to

### *exception* fiftyone.management.dataset.FiftyOneManagementError(message)

Exception raised for errors in the SDK.

### message -- explanation of the error

#### message

#### add_note()

Exception.add_note(note) –
add a note to the exception

#### *class* args

#### with_traceback()

Exception.with_traceback(tb) –
set self._\_traceback_\_ to tb and return self.

### *class* fiftyone.management.dataset.DatasetPermission(\*args, \*\*kwds)

Dataset permission enum.

#### NO_ACCESS *= 'NO_ACCESS'*

#### VIEW *= 'VIEW'*

#### TAG *= 'TAG'*

#### EDIT *= 'EDIT'*

#### MANAGE *= 'MANAGE'*

#### name()

The name of the Enum member.

#### value()

The value of the Enum member.

### fiftyone.management.dataset.delete_dataset_user_permission(dataset_name: str, user: str | [fiftyone.management.users.User](#fiftyone.management.users.User)) → None

Removes the given user’s specific access to the given dataset.

#### NOTE
The caller must have `Can Manage` permissions on the dataset.

Examples:

```default
import fiftyone.management as fom

dataset_name = "special-dataset"
user = "guest@company.com"

fom.set_dataset_user_permission(dataset_name, user, fom.VIEW)

fom.delete_dataset_user_permission(dataset_name, user)

assert fom.get_permissions(dataset_name=dataset_name, user=user) == fom.NO_ACCESS
```

* **Parameters:**
  * **dataset_name** – the dataset name
  * **user** – a user ID, email string, or
    [`User`](#fiftyone.management.users.User) instance.

### fiftyone.management.dataset.get_dataset_creator(dataset_name: str) → [fiftyone.management.users.User](#fiftyone.management.users.User) | None

Gets creator of a dataset, if known.

Examples:

```default
import fiftyone.management as fom

user = fom.get_dataset_creator("dataset")
```

* **Parameters:**
  **dataset_name** – the dataset name
* **Raises:**
  **ValueError** – if `dataset_name` does not exist or calling user
  does not have access to it.
* **Returns:**
  [`User`](#fiftyone.management.users.User) instance, or
  `None` if dataset has no recorded creator.

### fiftyone.management.dataset.get_permissions(, dataset_name: str = None, user: str | [fiftyone.management.users.User](#fiftyone.management.users.User) = None, user_group: str | [fiftyone.management.user_groups.UserGroup](#fiftyone.management.user_groups.UserGroup) = None)

Gets the specified dataset or user permissions.

This method is a convenience wrapper around the methods below based on
which arguments you provide:

- `dataset_name`: [`get_permissions_for_dataset()`](#fiftyone.management.dataset.get_permissions_for_dataset)
- `user`: [`get_permissions_for_user()`](#fiftyone.management.dataset.get_permissions_for_user)
- `user_group`: [`get_permissions_for_dataset_user_group()`](#fiftyone.management.dataset.get_permissions_for_dataset_user_group)
- `dataset_name` and `user`: [`get_permissions_for_dataset_user()`](#fiftyone.management.dataset.get_permissions_for_dataset_user)
- `dataset_name` and `user_group`:
  : [`get_permissions_for_dataset_user_group()`](#fiftyone.management.dataset.get_permissions_for_dataset_user_group)

#### NOTE
Only admins can retrieve this information.

Examples:

```default
import fiftyone.management as fom

dataset_name = "special-dataset"
user = "guest@company.com"

# Get permissions for user
assert (
    fom.get_permissions(user=user) ==
    fom.get_permissions_for_user(user)
)

# Get permissions for dataset
assert (
    fom.get_permissions(dataset_name=dataset_name) ==
    fom.get_permissions_for_dataset(dataset_name)
)

# Get permissions for user-dataset combination
assert (
    fom.get_permissions(dataset_name=dataset_name, user=user) ==
    fom.get_permissions_for_dataset_user(dataset_name, user)
)

# Get permissions for user group-dataset
assert (
    fom.get_permissions(dataset_name=dataset_name,
        user_group="some-id") ==
    fom.get_permissions_for_dataset_user_group(dataset_name, "some-id")
)
```

* **Parameters:**
  * **dataset_name** (*None*) – a dataset name
  * **user** (*None*) – a user ID, email string, or
    [`User`](#fiftyone.management.users.User) instance
  * **user_group** (*None*) – a user group ID or name string, or a
    [`UserGroup`](#fiftyone.management.user_groups.UserGroup) instance
* **Returns:**
  the requested user/dataset permissions

### fiftyone.management.dataset.get_permissions_for_dataset(dataset_name: str, include_groups=True) → Dict

Gets the list of users that have access to the given dataset.

#### NOTE
Only admins can retrieve this information.

Examples:

```default
import fiftyone.management as fom

dataset_name = "special-dataset"

fom.get_permissions_for_dataset(dataset_name)
```

Example output:

```default
[
    {'name': 'A. User', 'email': 'a@company.com', 'id': '12345', 'permission': 'MANAGE'},
    {'name': 'B. User', 'email': 'b@company.com', 'id': '67890', 'permission': 'EDIT'},
]
```

* **Parameters:**
  **dataset_name** – the dataset name
* **Returns:**
  If include_groups is True, return a dictionary contains a list of user
  : info and group info. Otherwise, return a list of user info.

### fiftyone.management.dataset.get_permissions_for_dataset_user(dataset_name: str, user: str) → [DatasetPermission](#fiftyone.management.dataset.DatasetPermission)

Gets the access permission (if any) that a given user has to a given
dataset.

#### NOTE
Only admins can retrieve this information.

Examples:

```default
import fiftyone.management as fom

dataset_name = "special-dataset"
user = "guest@company.com"

fom.get_permissions_for_dataset_user(dataset_name, user)
```

* **Parameters:**
  * **dataset_name** – the dataset name
  * **user** – a user ID, email string, or [`User`](#fiftyone.management.users.User)
    instance
* **Returns:**
  [`DatasetPermission`](#fiftyone.management.dataset.DatasetPermission)

### fiftyone.management.dataset.get_permissions_for_dataset_user_group(dataset_name: str, user_group: str | [fiftyone.management.user_groups.UserGroup](#fiftyone.management.user_groups.UserGroup)) → [DatasetPermission](#fiftyone.management.dataset.DatasetPermission)

Gets the access permission (if any) that a given user group has to a given
dataset.

#### NOTE
Only admins can retrieve this information.

Examples:

```default
import fiftyone.management as fom

dataset_name = "special-dataset"
user_group = "interns"

fom.get_permissions_for_dataset_user_group(dataset_name, user_group)
```

* **Parameters:**
  * **dataset_name** – the dataset name
  * **user_group** – a user group ID or name string or
    [`UserGroup`](#fiftyone.management.user_groups.UserGroup)
* **Returns:**
  [`DatasetPermission`](#fiftyone.management.dataset.DatasetPermission)

### fiftyone.management.dataset.get_permissions_for_user(user: str)

Gets a list of datasets a given user has access to.

#### NOTE
Only admins can retrieve this information.

Examples:

```default
import fiftyone.management as fom

user = "guest@company.com"

fom.get_permissions_for_user(user)
```

Example output:

```default
[
    {'name': 'datasetA', 'permission': 'EDIT'},
    {'name': 'datasetB', 'permission': 'VIEW'},
]
```

* **Parameters:**
  **user** – a user ID, email string, or `User`
  instance
* **Returns:**
  a list of permission dicts

### fiftyone.management.dataset.get_permissions_for_user_group(user_group: str | [fiftyone.management.user_groups.UserGroup](#fiftyone.management.user_groups.UserGroup))

Gets a list of datasets a given user group has access to.

#### NOTE
Only admins can retrieve this information.

Examples:

```default
import fiftyone.management as fom

user_group = "some-group-id"

fom.get_permissions_for_user_group(user_group)
```

Example output:

```default
[
    {'name': 'datasetA', 'permission': 'EDIT'},
    {'name': 'datasetB', 'permission': 'VIEW'},
]
```

* **Parameters:**
  **user_group** – a user group ID or name or
  [`UserGroup`](#fiftyone.management.user_groups.UserGroup)
* **Returns:**
  a list of permission dicts

### fiftyone.management.dataset.set_dataset_default_permission(dataset_name: str, permission: [DatasetPermission](#fiftyone.management.dataset.DatasetPermission)) → None

Sets the default member access level for the given dataset.

#### NOTE
The caller must have `Can Manage` permissions on the dataset.

Examples:

```default
import fiftyone.management as fom

dataset_name = "special-dataset"

# Give every Member Edit access by default
fom.set_dataset_default_permission(dataset_name, fom.EDIT)
```

* **Parameters:**
  * **dataset_name** – the dataset name
  * **permission** – the [`DatasetPermission`](#fiftyone.management.dataset.DatasetPermission) to set

### fiftyone.management.dataset.set_dataset_user_permission(dataset_name: str, user: str | [fiftyone.management.users.User](#fiftyone.management.users.User), permission: [DatasetPermission](#fiftyone.management.dataset.DatasetPermission), invite: [bool](../api/fiftyone.core.stages.md#fiftyone.core.stages.Exists.bool) = False) → None

Grants the given user specific access to the given dataset at the
specified permission level.

#### NOTE
The caller must have `Can Manage` permissions on the dataset.

#### WARNING
If an unknown email is passed to this function and `invite` is
`True`, an invitation to join the organization will be sent to
the email. The user will be created and have access to the dataset
on invitation acceptance. Please double-check the email correctness
before running.

Examples:

```default
import fiftyone.management as fom

dataset_name = "special-dataset"
guest = "guest@company.com"
new_guest = "new-guest@company.com"

# Existing user
fom.set_dataset_user_permission(dataset_name, guest, fom.VIEW)

assert fom.get_permissions(dataset_name=dataset_name, user=guest) == fom.VIEW

# Nonexisting user
fom.set_dataset_user_permission(dataset_name, new_guest, fom.VIEW, invite=True)
assert guest in [i.invitee_email for i in fom.list_pending_invitations()]
```

* **Parameters:**
  * **dataset_name** – the dataset name
  * **user** – a user ID, email string, or [`User`](#fiftyone.management.users.User)
    instance
  * **permission** – the [`DatasetPermission`](#fiftyone.management.dataset.DatasetPermission) to grant
  * **invite** (*False*) – if `True` and `user` is an email, an invitation
    will be sent to join the organization.

### fiftyone.management.dataset.set_dataset_user_group_permission(dataset_name: str, user_group: str | [fiftyone.management.user_groups.UserGroup](#fiftyone.management.user_groups.UserGroup), permission: str | [DatasetPermission](#fiftyone.management.dataset.DatasetPermission)) → None

Grants the given user group specific access to the given dataset at the
specified permission level.

#### NOTE
The caller must have `Can Manage` permissions on the dataset.

Examples:

```default
import fiftyone.management as fom

dataset_name = "special-dataset"
group_id = "some-group-id"

fom.set_dataset_user_permission(dataset_name, group_id, fom.VIEW)
```

* **Parameters:**
  * **dataset_name** – the dataset name
  * **user_group** – a user group ID or name string or a
    [`UserGroup`](#fiftyone.management.user_groups.UserGroup) instance
  * **permission** – the [`DatasetPermission`](#fiftyone.management.dataset.DatasetPermission)

### fiftyone.management.dataset.remove_dataset_user_group_permission(dataset_name: str, user_group: str | [fiftyone.management.user_groups.UserGroup](#fiftyone.management.user_groups.UserGroup)) → None

Remove the user group’s explicit access to the given dataset

#### NOTE
The caller must have `Can Manage` permissions on the dataset.

Examples:

```default
import fiftyone.management as fom

dataset_name = "special-dataset"
group_id = "some-group-id"

fom.remove_dataset_user_group_permission(dataset_name, group_id)
```

* **Parameters:**
  * **dataset_name** – the dataset name
  * **user_group** – a user group id or name string or a
    [`UserGroup`](#fiftyone.management.user_groups.UserGroup) instance

<a id="enterprise-sdk-organization-settings"></a>

## Organization settings

Organization settings management.

Copyright 2017-2026, Voxel51, Inc.
<br/>
[voxel51.com](https://voxel51.com/)
<br/>
<br/>

### *class* fiftyone.management.organization.OrganizationSettings

#### default_user_role *: [fiftyone.management.users.UserRole](#fiftyone.management.users.UserRole)*

#### default_dataset_permission *: [fiftyone.management.dataset.DatasetPermission](#fiftyone.management.dataset.DatasetPermission)*

#### default_operator_minimum_role *: [fiftyone.management.users.UserRole](#fiftyone.management.users.UserRole)*

#### default_operator_minimum_dataset_permission *: [fiftyone.management.dataset.DatasetPermission](#fiftyone.management.dataset.DatasetPermission)*

### fiftyone.management.organization.get_organization_settings() → [OrganizationSettings](#fiftyone.management.organization.OrganizationSettings)

Gets organization-wide settings for the FiftyOne Enterprise deployment.

#### NOTE
Only admins can retrieve this information

Examples:

```default
import fiftyone.management as fom

fom.get_organization_settings()
```

* **Returns:**
  [`OrganizationSettings`](#fiftyone.management.organization.OrganizationSettings)

### fiftyone.management.organization.set_organization_settings(, default_user_role: [fiftyone.management.users.UserRole](#fiftyone.management.users.UserRole) | None = None, default_dataset_permission: [fiftyone.management.dataset.DatasetPermission](#fiftyone.management.dataset.DatasetPermission) | None = None, default_operator_minimum_role: [fiftyone.management.users.UserRole](#fiftyone.management.users.UserRole) | None = None, default_operator_minimum_dataset_permission: [fiftyone.management.dataset.DatasetPermission](#fiftyone.management.dataset.DatasetPermission) | None = None) → [OrganizationSettings](#fiftyone.management.organization.OrganizationSettings)

Sets organization-wide settings for the FiftyOne Enterprise deployment.

#### NOTE
Only admins can perform this action.

Examples:

```default
import fiftyone.management as fom

user_role = fom.MEMBER
dataset_perm = fom.EDIT

# Set only default user role
fom.set_organization_settings(default_user_role=user_role)

# Set only default dataset permission
fom.set_organization_settings(default_dataset_permission=dataset_perm)

# Set multiple settings at once
fom.set_organization_settings(
    default_user_role=user_role,
    default_dataset_permission=dataset_perm,
    default_operator_minimum_role=user_role,
    default_operator_minimum_dataset_permission=dataset_perm,
)
```

* **Parameters:**
  * **default_user_role** (*None*) – an optional [`UserRole`](#fiftyone.management.users.UserRole) to set.
  * **default_dataset_permission** (*None*) – an optional
    [`DatasetPermission`](#fiftyone.management.dataset.DatasetPermission) to set,
  * **default_operator_minimum_role** (*None*) – an optional [`UserRole`](#fiftyone.management.users.UserRole)
    to set
  * **default_operator_minimum_dataset_permission** (*None*) – an optional
    [`DatasetPermission`](#fiftyone.management.dataset.DatasetPermission) to set
* **Returns:**
  [`OrganizationSettings`](#fiftyone.management.organization.OrganizationSettings)

<a id="enterprise-sdk-plugin-management"></a>

## Plugin management

Plugin management.

Copyright 2017-2026, Voxel51, Inc.
<br/>
[voxel51.com](https://voxel51.com/)
<br/>
<br/>

### *class* fiftyone.management.plugin.OperatorPermission

Operator permission dataclass.

#### minimum_role *: [fiftyone.management.users.UserRole](#fiftyone.management.users.UserRole)*

#### minimum_dataset_permission *: [fiftyone.management.dataset.DatasetPermission](#fiftyone.management.dataset.DatasetPermission)*

### *class* fiftyone.management.plugin.PluginOperator

Plugin operator dataclass.

#### name *: str*

#### enabled *: [bool](../api/fiftyone.core.stages.md#fiftyone.core.stages.Exists.bool)*

#### permission *: [OperatorPermission](#fiftyone.management.plugin.OperatorPermission)*

### *class* fiftyone.management.plugin.Plugin

Plugin dataclass.

#### name *: str*

#### description *: str*

#### version *: str*

#### fiftyone_version *: str*

#### enabled *: [bool](../api/fiftyone.core.stages.md#fiftyone.core.stages.Exists.bool)*

#### operators *: [List](../api/fiftyone.operators.types.md#fiftyone.operators.types.List)[[PluginOperator](#fiftyone.management.plugin.PluginOperator)]*

### fiftyone.management.plugin.list_plugins(include_builtin: [bool](../api/fiftyone.core.stages.md#fiftyone.core.stages.Exists.bool) = False) → [List](../api/fiftyone.operators.types.md#fiftyone.operators.types.List)[[Plugin](#fiftyone.management.plugin.Plugin)]

Returns a list of all installed plugins in the FiftyOne Enterprise
deployment.

Examples:

```default
import fiftyone.management as fom

fom.list_plugins()
```

* **Parameters:**
  **include_builtin** (*False*) – whether to include builtin plugins
* **Returns:**
  a list of [`Plugin`](#fiftyone.management.plugin.Plugin) instances

### fiftyone.management.plugin.get_plugin_info(plugin_name: str) → [Plugin](#fiftyone.management.plugin.Plugin)

Gets information about the specified plugin in the FiftyOne Enterprise
deployment.

Examples:

```default
import fiftyone.management as fom

fom.get_plugin_info("my-plugin")
```

* **Parameters:**
  **plugin_name** – a plugin name
* **Returns:**
  [`Plugin`](#fiftyone.management.plugin.Plugin), or `None` if no such plugin is found

### fiftyone.management.plugin.upload_plugin(plugin_path: str, overwrite: [bool](../api/fiftyone.core.stages.md#fiftyone.core.stages.Exists.bool) = False, optimize=False) → [Plugin](#fiftyone.management.plugin.Plugin)

Uploads a plugin to the FiftyOne Enterprise deployment.

The local plugin must be a zip file that contains a single directory with
a `fiftyone.yml` or `fiftyone.yaml` file. For example:

```default
my_plugin/
    fiftyone.yml
    __init__.py
    data.txt
```

#### NOTE
Only admins can upload plugins.

Examples:

```default
import fiftyone.management as fom

# Upload a raw plugin directory
fom.upload_plugin("/path/to/plugin_dir", overwrite=True)

# Upload a plugin, optimizing the directory before the upload
fom.upload_plugin("/path/to/plugin_dir", overwrite=True, optimize=True)

# Upload a plugin as ZIP file
fom.upload_plugin("/path/to/plugin.zip", overwrite=True)
```

* **Parameters:**
  * **plugin_path** – the path to a plugin zip or directory
  * **overwrite** (*False*) – whether to overwrite an existing plugin with same
    name
  * **optimize** (*False*) – whether to optimize the created zip file before
    uploading. If a `.gitignore` file exists, an attempt will first
    be made to use `git archive` to create the zip. If not or this
    doesn’t work, a zip will be created by pruning various known
    system-generated files and directories such as `.git/` and
    `__pycache__/`. This argument has no effect if `plugin_path`
    does not point to a directory

### fiftyone.management.plugin.delete_plugin(plugin_name: str) → None

Deletes the given plugin from the FiftyOne Enterprise deployment.

Examples:

```default
import fiftyone.management as fom

plugin_name = "special-plugin"
fom.delete_plugin(plugin_name)

plugins = fom.list_plugins()
assert not any(plugin.name == plugin_name for plugin in plugins)
```

#### NOTE
Only admins can perform this action.

* **Parameters:**
  **plugin_name** – a plugin name

### fiftyone.management.plugin.download_plugin(plugin_name: str, download_dir: str) → str

Downloads a plugin from the FiftyOne Enterprise deployment.

Examples:

```default
import fiftyone.management as fom

fom.download_plugin("special-plugin", "/path/to/local/plugins/")
```

* **Parameters:**
  * **plugin_name** – a plugin name
  * **download_dir** – a directory into which to download the plugin
* **Returns:**
  the path to the downloaded plugin

### fiftyone.management.plugin.set_plugin_enabled(plugin_name: str, enabled: [bool](../api/fiftyone.core.stages.md#fiftyone.core.stages.Exists.bool)) → None

Sets the enabled status of the given plugin in the FiftyOne Enterprise
deployment.

#### NOTE
Only admins can perform this action.

Examples:

```default
import fiftyone.management as fom

# Disable whole plugin
fom.set_plugin_enabled("special-plugin", False)
```

* **Parameters:**
  * **plugin_name** – a plugin name
  * **enabled** – a bool specifying what to set enabled status to

### fiftyone.management.plugin.set_plugin_operator_enabled(plugin_name: str, operator_name: str, enabled: [bool](../api/fiftyone.core.stages.md#fiftyone.core.stages.Exists.bool)) → None

Sets the enabled status of the given plugin operator in the FiftyOne
Enterprise deployment.

#### NOTE
Only admins can perform this action.

Examples:

```default
import fiftyone.management as fom

# Disable a particular operator
fom.set_plugin_operator_enabled("special-plugin", "special-operator", False)
```

* **Parameters:**
  * **plugin_name** – a plugin name
  * **operator_name** – an operator name within the given plugin
  * **enabled** – a bool specifying what to set operator enabled status to

### fiftyone.management.plugin.set_plugin_operator_permissions(plugin_name: str, operator_name: str, minimum_role: [fiftyone.management.users.UserRole](#fiftyone.management.users.UserRole) | None = None, minimum_dataset_permission: [fiftyone.management.dataset.DatasetPermission](#fiftyone.management.dataset.DatasetPermission) | None = None)

Sets permission levels of the given plugin operator in the FiftyOne
Enterprise deployment.

At least one of `minimum_role` and `minimum_dataset_permission`
must be set.

#### NOTE
Only admins can perform this action.

Examples:

```default
import fiftyone.management as fom

plugin_name = "special-plugin"
operator_name = "special-operator"

# Set minimum role permission only
fom.set_plugin_operator_permissions(
    plugin_name,
    operator_name,
    minimum_role=fom.MEMBER
    )

# Set minimum dataset permission only
fom.set_plugin_operator_permissions(
    plugin_name,
    operator_name,
    minimum_dataset_permission=fom.EDIT
)

# Set both minimum role and minimum dataset permissions
fom.set_plugin_operator_permissions(
    plugin_name,
    operator_name,
    minimum_role=fom.EDIT,
    minimum_dataset_permission=fom.EDIT
)
```

* **Parameters:**
  * **plugin_name** – a plugin name
  * **operator_name** – an operator name within the given plugin
  * **minimum_role** (*None*) – an optional
    [`UserRole`](#fiftyone.management.users.UserRole) to set
  * **minimum_dataset_permission** (*None*) – an optional
    [`DatasetPermission`](#fiftyone.management.dataset.DatasetPermission) to set

<a id="enterprise-sdk-orchestrator-management"></a>

## Orchestrator management


<div class="available-in">
    <div class="available-in-row">
        <span class="available-in-label">Available in:</span>
        <span class="available-in-pill available-in-pill--enterprise">Enterprise</span>
    </div>
    <div class="available-in-row">
        <span class="available-in-versions">Introduced in <a href="../release-notes.html#fiftyone-enterprise-2-10-0">FiftyOne Enterprise 2.10.0</a></span>
    </div>
    
    <div class="available-in-cta">
        <a href="https://voxel51.com/book-a-demo" class="available-in-cta-link" rel="noopener noreferrer" target="_blank">
            Schedule a demo to get started with FiftyOne Enterprise
        </a>
    </div>

</div>

<a id="module-fiftyone.management.orchestrator"></a>

Orchestrator management.

Copyright 2017-2026, Voxel51, Inc.
<br/>
[voxel51.com](https://voxel51.com/)
<br/>
<br/>

### *class* fiftyone.management.orchestrator.OrchestratorEnvironment

Orchestrator environment types.

#### DATABRICKS *= 'databricks'*

#### ANYSCALE *= 'anyscale'*

#### KUBERNETES *= 'kubernetes'*

#### KUBERNETES_SERVICE *= 'kubernetes_service'*

#### SELF_REGISTERED *= 'self_registered'*

#### map_to_graphql_value() → str

Maps the enum value to its GraphQL value

#### *classmethod* map_from_graphql_value(value: str) → [OrchestratorEnvironment](#fiftyone.management.orchestrator.OrchestratorEnvironment)

Maps a GraphQL value to the enum value

#### capitalize()

Return a capitalized version of the string.

More specifically, make the first character have upper case and the
rest lower case.

#### casefold()

Return a version of the string suitable for caseless comparisons.

#### center()

Return a centered string of length width.

Padding is done using the specified fill character (default is
a space).

#### count()

Return the number of non-overlapping occurrences of substring sub in string S[start:end].

Optional arguments start and end are interpreted as in slice
notation.

#### encode()

Encode the string using the codec registered for encoding.

encoding
: The encoding in which to encode the string.

errors
: The error handling scheme to use for encoding errors.
  The default is ‘strict’ meaning that encoding errors raise a
  UnicodeEncodeError.  Other possible values are ‘ignore’, ‘replace’
  and ‘xmlcharrefreplace’ as well as any other name registered with
  codecs.register_error that can handle UnicodeEncodeErrors.

#### endswith()

Return True if the string ends with the specified suffix, False otherwise.

suffix
: A string or a tuple of strings to try.

start
: Optional start position. Default: start of the string.

end
: Optional stop position. Default: end of the string.

#### expandtabs()

Return a copy where all tab characters are expanded using spaces.

If tabsize is not given, a tab size of 8 characters is assumed.

#### find()

Return the lowest index in S where substring sub is found, such that sub is contained within S[start:end].

Optional arguments start and end are interpreted as in slice
notation.  Return -1 on failure.

#### format()

Return a formatted version of the string, using substitutions from args and kwargs.
The substitutions are identified by braces (‘{’ and ‘}’).

#### format_map()

Return a formatted version of the string, using substitutions from mapping.
The substitutions are identified by braces (‘{’ and ‘}’).

#### index()

Return the lowest index in S where substring sub is found, such that sub is contained within S[start:end].

Optional arguments start and end are interpreted as in slice
notation.  Raises ValueError when the substring is not found.

#### isalnum()

Return True if the string is an alpha-numeric string, False otherwise.

A string is alpha-numeric if all characters in the string are
alpha-numeric and there is at least one character in the string.

#### isalpha()

Return True if the string is an alphabetic string, False otherwise.

A string is alphabetic if all characters in the string are
alphabetic and there is at least one character in the string.

#### isascii()

Return True if all characters in the string are ASCII, False otherwise.

ASCII characters have code points in the range U+0000-U+007F.
Empty string is ASCII too.

#### isdecimal()

Return True if the string is a decimal string, False otherwise.

A string is a decimal string if all characters in the string are
decimal and there is at least one character in the string.

#### isdigit()

Return True if the string is a digit string, False otherwise.

A string is a digit string if all characters in the string are
digits and there is at least one character in the string.

#### isidentifier()

Return True if the string is a valid Python identifier, False otherwise.

Call keyword.iskeyword(s) to test whether string s is a reserved
identifier, such as “def” or “class”.

#### islower()

Return True if the string is a lowercase string, False otherwise.

A string is lowercase if all cased characters in the string are
lowercase and there is at least one cased character in the string.

#### isnumeric()

Return True if the string is a numeric string, False otherwise.

A string is numeric if all characters in the string are numeric and
there is at least one character in the string.

#### isprintable()

Return True if all characters in the string are printable, False otherwise.

A character is printable if repr() may use it in its output.

#### isspace()

Return True if the string is a whitespace string, False otherwise.

A string is whitespace if all characters in the string are
whitespace and there is at least one character in the string.

#### istitle()

Return True if the string is a title-cased string, False otherwise.

In a title-cased string, upper- and title-case characters may only
follow uncased characters and lowercase characters only cased ones.

#### isupper()

Return True if the string is an uppercase string, False otherwise.

A string is uppercase if all cased characters in the string are
uppercase and there is at least one cased character in the string.

#### join()

Concatenate any number of strings.

The string whose method is called is inserted in between each given
string.  The result is returned as a new string.

Example: ‘.’.join([‘ab’, ‘pq’, ‘rs’]) -> ‘ab.pq.rs’

#### ljust()

Return a left-justified string of length width.

Padding is done using the specified fill character (default is
a space).

#### lower()

Return a copy of the string converted to lowercase.

#### lstrip()

Return a copy of the string with leading whitespace removed.

If chars is given and not None, remove characters in chars instead.

#### partition()

Partition the string into three parts using the given separator.

This will search for the separator in the string.  If the separator
is found, returns a 3-tuple containing the part before the
separator, the separator itself, and the part after it.

If the separator is not found, returns a 3-tuple containing
the original string and two empty strings.

#### removeprefix()

Return a str with the given prefix string removed if present.

If the string starts with the prefix string, return
string[len(prefix):].  Otherwise, return a copy of the original
string.

#### removesuffix()

Return a str with the given suffix string removed if present.

If the string ends with the suffix string and that suffix is not
empty, return string[:-len(suffix)].  Otherwise, return a copy of
the original string.

#### replace()

Return a copy with all occurrences of substring old replaced by new.

> count
> : Maximum number of occurrences to replace.
>   -1 (the default value) means replace all occurrences.

If the optional argument count is given, only the first count occurrences are
replaced.

#### rfind()

Return the highest index in S where substring sub is found, such that sub is contained within S[start:end].

Optional arguments start and end are interpreted as in slice
notation.  Return -1 on failure.

#### rindex()

Return the highest index in S where substring sub is found, such that sub is contained within S[start:end].

Optional arguments start and end are interpreted as in slice
notation.  Raises ValueError when the substring is not found.

#### rjust()

Return a right-justified string of length width.

Padding is done using the specified fill character (default is
a space).

#### rpartition()

Partition the string into three parts using the given separator.

This will search for the separator in the string, starting at the
end.  If the separator is found, returns a 3-tuple containing the
part before the separator, the separator itself, and the part after
it.

If the separator is not found, returns a 3-tuple containing two
empty strings and the original string.

#### rsplit()

Return a list of the substrings in the string, using sep as the separator string.

> sep
> : The separator used to split the string.
>   <br/>
>   When set to None (the default value), will split on any
>   whitespace character (including n r t f and spaces) and
>   will discard empty strings from the result.

> maxsplit
> : Maximum number of splits.
>   -1 (the default value) means no limit.

Splitting starts at the end of the string and works to the front.

#### rstrip()

Return a copy of the string with trailing whitespace removed.

If chars is given and not None, remove characters in chars instead.

#### split()

Return a list of the substrings in the string, using sep as the separator string.

> sep
> : The separator used to split the string.
>   <br/>
>   When set to None (the default value), will split on any
>   whitespace character (including n r t f and spaces) and
>   will discard empty strings from the result.

> maxsplit
> : Maximum number of splits.
>   -1 (the default value) means no limit.

Splitting starts at the front of the string and works to the end.

Note, str.split() is mainly useful for data that has been
intentionally delimited.  With natural text that includes
punctuation, consider using the regular expression module.

#### splitlines()

Return a list of the lines in the string, breaking at line boundaries.

Line breaks are not included in the resulting list unless keepends
is given and true.

#### startswith()

Return True if the string starts with the specified prefix, False otherwise.

prefix
: A string or a tuple of strings to try.

start
: Optional start position. Default: start of the string.

end
: Optional stop position. Default: end of the string.

#### strip()

Return a copy of the string with leading and trailing whitespace removed.

If chars is given and not None, remove characters in chars instead.

#### swapcase()

Convert uppercase characters to lowercase and lowercase characters to uppercase.

#### title()

Return a version of the string where each word is titlecased.

More specifically, words start with uppercased characters and all
remaining cased characters have lower case.

#### translate()

Replace each character in the string using the given translation table.

> table
> : Translation table, which must be a mapping of Unicode ordinals
>   to Unicode ordinals, strings, or None.

The table must implement lookup/indexing via \_\_getitem_\_, for
instance a dictionary or list.  If this operation raises
LookupError, the character is left untouched.  Characters mapped to
None are deleted.

#### upper()

Return a copy of the string converted to uppercase.

#### zfill()

Pad a numeric string with zeros on the left, to fill a field of the given width.

The string is never truncated.

#### name()

The name of the Enum member.

#### value()

The value of the Enum member.

### *class* fiftyone.management.orchestrator.OrchestratorDocument

Orchestrator document representation.

#### instance_identifier *: str*

#### description *: str* *= None*

#### environment *: str*

#### available_operators *: [List](../api/fiftyone.operators.types.md#fiftyone.operators.types.List)[str]* *= None*

#### config *: Dict | None* *= None*

#### secrets *: Dict | None* *= None*

#### created_at *: [datetime.datetime](../api/fiftyone.utils.data.md#fiftyone.utils.data.datetime) | None* *= None*

#### updated_at *: [datetime.datetime](../api/fiftyone.utils.data.md#fiftyone.utils.data.datetime) | None* *= None*

### fiftyone.management.orchestrator.get_orchestrator(instance_id: str, user: str | [fiftyone.management.users.User](#fiftyone.management.users.User) = None) → [OrchestratorDocument](#fiftyone.management.orchestrator.OrchestratorDocument)

Retrieves an orchestrator by its instance identifier.

* **Parameters:**
  * **instance_id** – the instance identifier / unique name of the orchestrator
  * **user** – the user requesting the orchestrator (optional)
* **Returns:**
  the orchestrator document
* **Raises:**
  **ValueError** – if the orchestrator doesn’t exist

### fiftyone.management.orchestrator.list_orchestrators(include_deactivated: [bool](../api/fiftyone.core.stages.md#fiftyone.core.stages.Exists.bool) = False) → [List](../api/fiftyone.operators.types.md#fiftyone.operators.types.List)[str]

Lists orchestrators with pagination, filtering, and sorting.

* **Parameters:**
  * **page** – the page number (1-indexed)
  * **filters** – filter criteria (e.g., {“include_deactivated”: True})
* **Returns:**
  a list of orchestrator instance_identifiers

### fiftyone.management.orchestrator.register_orchestrator(instance_id: str, description: str, environment: str | [OrchestratorEnvironment](#fiftyone.management.orchestrator.OrchestratorEnvironment), config: Dict | None, secrets: Dict | None) → [OrchestratorDocument](#fiftyone.management.orchestrator.OrchestratorDocument)

Registers a new orchestrator to run delegated operations.

Any secrets provided will be stored in the FiftyOne
[secrets store](https://docs.voxel51.com/enterprise/secrets.html),
encrypted.

* **Parameters:**
  * **instance_id** – the instance identifier of the orchestrator
  * **description** – the description of the orchestrator
  * **environment** – the orchestrator environment (e.g., “databricks”, “anyscale”, “kubernetes”, “kubernetes_service”)
  * **config** – environment-specific configuration
  * **secrets** – environment-specific secrets

#### NOTE
The `config` and `secrets` fields must include a top-level
key that corresponds to the environment

#### WARNING
Raw secret values are sent to the server in plaintext. Ensure that
your connection to the server is secure (e.g., via HTTPS) to avoid
secrets being intercepted in transit.

Examples:

```default
# databricks config example
{
    "databricks": {
        "jobId": "1234567890abcdef",
        "executionTaskId": "0987654321fedcba",
        "registrationTaskId": "a12b3c4d"
    }
}

# anyscale config example
{
    "anyscale": {
        "jobQueueName": "JobQueueName",
        "imageUri": "an-image-uri",
        "executionComputeConfig": "exec-config"
    }
}

# kubernetes config example
{
    "kubernetes": {
        "executionTmplUri": "/uri/to/template", # URI OR base64-encoded
        "registrationTmplUri": "/optional/uri", # CPU or lower resources
        "context": "kube context to use",       # Optional
        "namespace": "namespace to deploy to"   # Optional
    }
}

# kubernetes_service config example (long-lived service pods)
{
    "kubernetesService": {
        "namespace": "namespace for the pods",  # Optional
        "context": "kube context",              # Optional
        "resourceRequests": {                   # pod resource shape
            "cpu": "2",
            "memory": "8Gi",
            "ephemeral_storage": "30Gi",
            "gpu_count": 1,                     # Optional
            "gpu_type": "nvidia-h100-80gb"      # required if gpu_count
        }
    }
}

# databricks secrets example
{
    "databricks": {
        "host": "host_name",
        "accountId": "account_id",
        "clientId": "your_client_id",
        "clientSecret": "your_client_secret",
    }
}

# anyscale secrets example
{
    "anyscale": {
        "authToken": "your_auth_token",
    }
}

# kubernetes secrets example
{
    "kubernetes": {
        "kubeConfig": "kubeConfig or empty for in_cluster creds",
    }
}

# kubernetes_service secrets example (in-cluster needs none)
{
    "kubernetesService": {
        "kubeConfig": "kubeConfig or empty for in_cluster creds",
    }
}
```

* **Returns:**
  the registered orchestrator document
* **Raises:**
  **ValueError** – if environment is invalid or config is missing required fields

### fiftyone.management.orchestrator.delete_orchestrator(instance_id: str) → None

Deletes an orchestrator by its instance identifier.

* **Parameters:**
  **instance_id** – the instance identifier of the orchestrator to delete
* **Raises:**
  **ValueError** – if the orchestrator doesn’t exist

<a id="enterprise-sdk-secrets"></a>

## Secrets


<div class="available-in">
    <div class="available-in-row">
        <span class="available-in-label">Available in:</span>
        <span class="available-in-pill available-in-pill--enterprise">Enterprise</span>
    </div>
    <div class="available-in-row">
        <span class="available-in-versions">Introduced in <a href="../release-notes.html#fiftyone-enterprise-2-10-0">FiftyOne Enterprise 2.10.0</a></span>
    </div>
    
    <div class="available-in-cta">
        <a href="https://voxel51.com/book-a-demo" class="available-in-cta-link" rel="noopener noreferrer" target="_blank">
            Schedule a demo to get started with FiftyOne Enterprise
        </a>
    </div>

</div>

<a id="module-fiftyone.management.secret"></a>

Secrets management.

Copyright 2017-2026, Voxel51, Inc.
<br/>
[voxel51.com](https://voxel51.com/)
<br/>
<br/>

### *class* fiftyone.management.secret.FiftyOneSecret

Secret Info

#### created_at *: [datetime.datetime](../api/fiftyone.utils.data.md#fiftyone.utils.data.datetime)*

#### key *: str*

#### description *: str | None* *= None*

### fiftyone.management.secret.add_secret(key: str, value: str, description: str | None = None) → None

Adds a secret for use by FiftyOne plugins.

Secrets are stored in an encrypted format in the database.

#### NOTE
Only admins can add secrets.

#### WARNING
Raw secret values are sent to the server in plaintext. Ensure that
your connection to the server is secure (e.g., via HTTPS) to avoid
secrets being intercepted in transit.

Examples:

```default
import fiftyone.management as fom

fom.add_secret(
    "MY_SECRET",
    "PASSWORD12345",
    description="very secure secret"
)
```

* **Parameters:**
  * **key** – String key of the secret.
  * **value** – Value to give the secret. It’s encrypted upon upload.
  * **description** (`None`) – Optional description for this secret.

### fiftyone.management.secret.delete_secret(key: str) → None

Deletes the uploaded secret.

#### NOTE
Only admins can delete secrets.

#### WARNING
This will delete the secret for all users. A new value will need to be
uploaded if a plugin requires this secret.

Examples:

```default
import fiftyone.management as fom

fom.delete_secret("MY_SECRET")
```

* **Parameters:**
  **key** – string key of secret to delete

### fiftyone.management.secret.get_secret_info(key: str) → [FiftyOneSecret](#fiftyone.management.secret.FiftyOneSecret) | None

Get information about a FiftyOne secret.

The returned secret object only has certain fields set. You cannot view
the plaintext or encrypted value of the secret.

Examples:

```default
import fiftyone.management as fom

fom.get_secret_info("MY_SECRET")
```

* **Parameters:**
  **key** – string key of secret to get info on
* **Returns:**
  A [`FiftyOneSecret`](#fiftyone.management.secret.FiftyOneSecret) instance, or None if the secret doesn’t exist.

### fiftyone.management.secret.list_secrets() → [List](../api/fiftyone.operators.types.md#fiftyone.operators.types.List)[str]

Lists the keys for all secrets installed in the system.

The returned secret object only have their provider, prefixes,
description, and creation time set. You cannot view the plaintext
or encrypted value.

#### NOTE
Only admins can list secrets

Examples:

```default
import fiftyone.management as fom

fom.list_secrets()
```

* **Returns:**
  a list of [`FiftyOneSecret`](#fiftyone.management.secret.FiftyOneSecret) instances

### fiftyone.management.secret.update_secret(key: str, value: str | None = None, description: str | None = None) → None

Updates an existing secret for use by FiftyOne plugins.

Secrets are stored in an encrypted format in the database.

#### NOTE
Only admins can update secrets.

#### WARNING
Raw secret values are sent to the server in plaintext. Ensure that
your connection to the server is secure (e.g., via HTTPS) to avoid
secrets being intercepted in transit.

Examples:

```default
import fiftyone.management as fom

fom.update_secret(
    "MY_SECRET",
    "PASSWORD12345",
    description="very secure secret"
)
```

* **Parameters:**
  * **key** – String key of the existing secret.
  * **value** (`None`) – Optional Value to update on the secret.
  * **description** (`None`) – Optional description to update on the secret.

<a id="enterprise-sdk-snapshots"></a>

## Snapshots

Dataset snapshot management.

Copyright 2017-2026, Voxel51, Inc.
<br/>
[voxel51.com](https://voxel51.com/)
<br/>
<br/>

### *class* fiftyone.management.snapshot.DatasetSnapshotStatus(\*args, \*\*kwds)

User role enum.

#### UNLOADED *= 'UNLOADED'*

#### LOADING *= 'LOADING'*

#### LOADED *= 'LOADED'*

#### name()

The name of the Enum member.

#### value()

The value of the Enum member.

### *class* fiftyone.management.snapshot.SampleChangeSummary

#### total_samples *: int*

#### num_samples_added *: int*

#### num_samples_deleted *: int*

#### num_samples_changed *: int*

#### updated_at *: [datetime.datetime](../api/fiftyone.utils.data.md#fiftyone.utils.data.datetime) | None* *= None*

### *class* fiftyone.management.snapshot.DatasetSnapshot

#### created_at *: [datetime.datetime](../api/fiftyone.utils.data.md#fiftyone.utils.data.datetime) | None*

#### description *: str | None*

#### id *: str*

#### linear_change_summary *: [SampleChangeSummary](#fiftyone.management.snapshot.SampleChangeSummary) | None*

#### load_status *: [DatasetSnapshotStatus](#fiftyone.management.snapshot.DatasetSnapshotStatus)*

#### name *: str*

#### slug *: str*

#### created_by *: str | None* *= None*

#### created_by_principal *: dict | None* *= None*

### fiftyone.management.snapshot.MATERIALIZE_SNAPSHOT_TIMEOUT *= 3600*

### fiftyone.management.snapshot.DELETE_SNAPSHOT_TIMEOUT *= 600*

### fiftyone.management.snapshot.CALCULATE_CHANGES_TIMEOUT *= 3600*

### fiftyone.management.snapshot.archive_snapshot(dataset_name: str, snapshot_name: str) → None

Archive snapshot to the configured cold storage location.

#### NOTE
Only users with `MANAGE` access can create a snapshot

#### WARNING
Archiving a snapshot will make it unavailable for browsing to any
user, even if they are currently using/browsing.

Examples:

```default
import fiftyone as fo
import fiftyone.management as fom

snapshot_name = "v0.1"
# We don't use this regularly, archive it!
fom.archive_snapshot(dataset.name, snapshot_name)

fo.load_dataset(dataset.name, snapshot_name) # throws error, can't load!
```

* **Parameters:**
  * **dataset_name** – the dataset name
  * **snapshot_name** – the snapshot name

### fiftyone.management.snapshot.calculate_dataset_latest_changes_summary(dataset_name: str) → [SampleChangeSummary](#fiftyone.management.snapshot.SampleChangeSummary)

Calculate change summary between recent snapshot and HEAD of dataset.

Examples:

```default
import fiftyone.management as fom

old = fom.calculate_dataset_latest_changes_summary(dataset.name)
assert old == fom.get_dataset_latest_changes_summary(dataset.name)

dataset.delete_samples(dataset.take(5))

# Cached summary hasn't been updated
assert old == fom.get_dataset_latest_changes_summary(dataset.name)

new = fom.calculate_dataset_latest_changes_summary(dataset.name)
assert new.updated_at > changes.updated_at
```

* **Parameters:**
  **dataset_name** – the dataset name
* **Returns:**
  Change summary between most recent snapshot and HEAD of this dataset.

### fiftyone.management.snapshot.create_snapshot(dataset_name: str, snapshot_name: str, description: str | None = None) → [DatasetSnapshot](#fiftyone.management.snapshot.DatasetSnapshot)

Create and store a snapshot of the current state of `dataset_name`.

Snapshot name must be unique for the given dataset.

#### NOTE
Only users with `MANAGE` access can create a snapshot

Examples:

```default
import fiftyone.management as fom

snapshot_name = "v0.1"
description = "Initial dataset snapshot"
fom.create_snapshot(dataset.name, snapshot_name, description)
```

* **Parameters:**
  * **dataset_name** – the dataset name
  * **snapshot_name** – the name of the snapshot to create
  * **description** (*None*) – Optional description to attach to this snapshot

### fiftyone.management.snapshot.delete_snapshot(dataset_name: str, snapshot_name: str)

Delete snapshot `snapshot_name` from dataset `dataset_name`.

#### NOTE
Only users with `MANAGE` access can delete a snapshot.

Examples:

```default
import fiftyone.management as fom

snapshot_name = "v0.1"
description = "Initial dataset snapshot"
fom.create_snapshot(dataset.name, snapshot_name, description)

# Some time later ...

fom.delete_snapshot(dataset, snapshot_name)
```

* **Parameters:**
  * **dataset_name** – the dataset name
  * **snapshot_name** – the snapshot name

### fiftyone.management.snapshot.get_dataset_latest_changes_summary(dataset_name: str) → [SampleChangeSummary](#fiftyone.management.snapshot.SampleChangeSummary)

Gets change summary between most recent snapshot and HEAD of dataset

#### NOTE
This summary is not continuously computed, the result of this function
may be stale. Use [`calculate_dataset_latest_changes_summary()`](#fiftyone.management.snapshot.calculate_dataset_latest_changes_summary)
to recalculate.

Examples:

```default
import fiftyone.management as fom

fom.get_dataset_latest_changes_summary(dataset.name)
```

* **Parameters:**
  **dataset_name** – the dataset name
* **Returns:**
  Change summary between most recent snapshot and HEAD of this dataset.
  : Or `None` if no summary has been calculated yet.
* **Raises:**
  **ValueError** – if dataset doesn’t exist or no access

### fiftyone.management.snapshot.get_snapshot_info(dataset_name: str, snapshot_name: str) → [DatasetSnapshot](#fiftyone.management.snapshot.DatasetSnapshot) | None

Gets information about the specified dataset snapshot, or `None`
: if `snapshot_name` doesn’t exist.

Examples:

```default
import fiftyone.management as fom

dataset = "quickstart"
snapshot_name = "v0.1"

fom.get_snapshot_info(dataset.name, snapshot_name)
```

* **Parameters:**
  * **dataset_name** – the dataset name
  * **snapshot_name** – the snapshot name
* **Raises:**
  **ValueError** – if dataset doesn’t exist or no access

### fiftyone.management.snapshot.list_snapshots(dataset_name: str) → [List](../api/fiftyone.operators.types.md#fiftyone.operators.types.List)[str]

Returns a list of all snapshots of a dataset in order of creation.

Examples:

```default
import fiftyone.management as fom

fom.list_snapshots(dataset.name)
```

* **Parameters:**
  **dataset_name** – the dataset name
* **Raises:**
  **ValueError** – if dataset doesn’t exist or no access
* **Returns:**
  a list of [`DatasetSnapshot`](#fiftyone.management.snapshot.DatasetSnapshot) instances

### fiftyone.management.snapshot.revert_dataset_to_snapshot(dataset_name: str, snapshot_name: str)

Revert dataset to a previous snapshot state.

Reverts the current (HEAD) state of `dataset_name` to a previous
state encapsulated by the snapshot `snapshot_name`. All changes since
then are lost. All snapshots created after this one will be deleted as well.

If you are attempting to view the dataset at the point of a snapshot but
not completely revert, you can do so with:

> snapshot = fo.load_dataset(dataset_name, snapshot=snapshot_name)

#### NOTE
Only users with `MANAGE` access can revert a dataset

#### WARNING
This action is very destructive! All changes between `snapshot_name`
and the current HEAD state of `dataset_name` will be destroyed!
Including all snapshots created after `snapshot_name`.

Examples:

```default
import fiftyone.management as fom

snapshot_name = "v0.1"
description = "Initial dataset snapshot"
fom.create_snapshot(dataset.name, snapshot_name, description)

# Oops we deleted everything!
dataset.delete_samples(dataset.values("id"))

# Phew!
fom.revert_dataset_to_snapshot(dataset.name, snapshot_name)
dataset.reload()
assert len(dataset) > 0
```

* **Parameters:**
  * **dataset_name** – the dataset name
  * **snapshot_name** – the snapshot name

### fiftyone.management.snapshot.unarchive_snapshot(dataset_name: str, snapshot_name: str) → None

Unarchive snapshot from the configured cold storage location.

Examples:

```default
import fiftyone as fo
import fiftyone.management as fom

snapshot_name = "v0.1"
description = "Initial dataset snapshot"

# We don't use this regularly, archive it!
fom.archive_snapshot(dataset.name, snapshot_name)
fo.load_dataset(dataset.name, snapshot_name) # throws error, can't load!

# Oops we need it now, unarchive it!
fom.unarchive_snapshot(dataset.name, snapshot_name)
fo.load_dataset(dataset.name, snapshot_name) # works now!
```

* **Parameters:**
  * **dataset_name** – the dataset name
  * **snapshot_name** – the snapshot name

<a id="enterprise-sdk-service-account-management"></a>

## Service account management

Service accounts can be managed programmatically using the SDK. For an
overview of service accounts, their roles, and UI management, see
[Service accounts](roles_and_permissions.md#enterprise-service-accounts).

```python
import fiftyone.management as fom

# Create a service account
sa = fom.create_service_account("my-pipeline-bot", fom.MEMBER)
print(sa.id)

# List all service accounts
service_accounts = fom.list_service_accounts()

# Retrieve a specific service account by ID
sa = fom.get_service_account(sa.id)

# Update a service account's name, role, or description
fom.update_service_account(
    sa, role=fom.COLLABORATOR, description="Automation bot for dataset tasks"
)

# Delete a service account (irreversible)
fom.delete_service_account(sa)
```

API keys can be generated, listed, and deleted for service accounts:

```python
import fiftyone.management as fom

sa = fom.get_service_account("some-id")

# Generate an API key for the service account
key = fom.generate_api_key("pipeline-key", sa)

# List all keys for a service account
keys = fom.list_api_keys(sa)

# Delete a specific key
fom.delete_api_key(keys[0].id, sa)
```

<a id="module-fiftyone.management.service_account"></a>

Service account management.

Copyright 2017-2026, Voxel51, Inc.
<br/>
[voxel51.com](https://voxel51.com/)
<br/>
<br/>

### *exception* fiftyone.management.service_account.FiftyOneManagementError(message)

Exception raised for errors in the SDK.

### message -- explanation of the error

#### message

#### add_note()

Exception.add_note(note) –
add a note to the exception

#### *class* args

#### with_traceback()

Exception.with_traceback(tb) –
set self._\_traceback_\_ to tb and return self.

### *class* fiftyone.management.service_account.UserRole(\*args, \*\*kwds)

User role enum.

#### ADMIN *= 'ADMIN'*

#### MEMBER *= 'MEMBER'*

#### COLLABORATOR *= 'COLLABORATOR'*

#### LABELER *= 'LABELER'*

#### GUEST *= 'GUEST'*

#### name()

The name of the Enum member.

#### value()

The value of the Enum member.

### *class* fiftyone.management.service_account.ServiceAccount

Service account information dataclass.

#### id *: str*

#### name *: str*

#### role *: [fiftyone.management.users.UserRole](#fiftyone.management.users.UserRole)*

#### description *: str | None* *= None*

#### created_at *: [datetime.datetime](../api/fiftyone.utils.data.md#fiftyone.utils.data.datetime) | None* *= None*

### fiftyone.management.service_account.create_service_account(name: str, role: str | [fiftyone.management.users.UserRole](#fiftyone.management.users.UserRole), description: str | None = None) → [ServiceAccount](#fiftyone.management.service_account.ServiceAccount)

Creates a new service account.

#### NOTE
Only admins can perform this action.

Examples:

```default
import fiftyone.management as fom

sa = fom.create_service_account("my-bot", fom.MEMBER)
print(sa.id)
```

* **Parameters:**
  * **name** – the service account name
  * **role** – the [`UserRole`](#fiftyone.management.users.UserRole) to grant
  * **description** (*None*) – optional description
* **Returns:**
  a [`ServiceAccount`](#fiftyone.management.service_account.ServiceAccount) instance

### fiftyone.management.service_account.get_service_account(service_account_id: str) → [ServiceAccount](#fiftyone.management.service_account.ServiceAccount) | None

Gets information about the specified service account (if any).

#### NOTE
Only admins can retrieve information about service accounts.

Examples:

```default
import fiftyone.management as fom

sa = fom.get_service_account("some-id")
```

* **Parameters:**
  **service_account_id** – a service account ID string
* **Returns:**
  a [`ServiceAccount`](#fiftyone.management.service_account.ServiceAccount) instance, or `None` if not found

### fiftyone.management.service_account.list_service_accounts() → [List](../api/fiftyone.operators.types.md#fiftyone.operators.types.List)[[ServiceAccount](#fiftyone.management.service_account.ServiceAccount)]

Returns a list of all service accounts.

#### NOTE
Only admins can retrieve this information.

Examples:

```default
import fiftyone.management as fom

fom.list_service_accounts()
```

* **Returns:**
  a list of [`ServiceAccount`](#fiftyone.management.service_account.ServiceAccount) instances

### fiftyone.management.service_account.update_service_account(service_account: str | [ServiceAccount](#fiftyone.management.service_account.ServiceAccount), name: str | None = None, role: str | [fiftyone.management.users.UserRole](#fiftyone.management.users.UserRole) | None = None, description: str | None = None) → [ServiceAccount](#fiftyone.management.service_account.ServiceAccount)

Updates the given service account.

#### NOTE
Only admins can perform this action.

Examples:

```default
import fiftyone.management as fom

fom.update_service_account("some-id", role=fom.ADMIN)
```

* **Parameters:**
  * **service_account** – a service account ID string or
    [`ServiceAccount`](#fiftyone.management.service_account.ServiceAccount) instance
  * **name** (*None*) – optional new name
  * **role** (*None*) – optional new [`UserRole`](#fiftyone.management.users.UserRole)
  * **description** (*None*) – optional new description
* **Returns:**
  the updated [`ServiceAccount`](#fiftyone.management.service_account.ServiceAccount) instance

### fiftyone.management.service_account.delete_service_account(service_account: str | [ServiceAccount](#fiftyone.management.service_account.ServiceAccount)) → None

Deletes the given service account.

#### NOTE
Only admins can perform this action.

#### WARNING
This action is irreversible!

Examples:

```default
import fiftyone.management as fom

fom.delete_service_account("some-id")
```

* **Parameters:**
  **service_account** – a service account ID string or
  [`ServiceAccount`](#fiftyone.management.service_account.ServiceAccount) instance

### fiftyone.management.service_account.resolve_service_account_id(service_account_or_id: str | [ServiceAccount](#fiftyone.management.service_account.ServiceAccount) | Dict[str, Any] | None, nullable: [bool](../api/fiftyone.core.stages.md#fiftyone.core.stages.Exists.bool) = False) → str | None

Resolves a service account ID from an ID string, ServiceAccount instance,
or a dict containing an `"id"` key.

<a id="enterprise-sdk-user-management"></a>

## User management


<div class="available-in">
    <div class="available-in-row">
        <span class="available-in-label">Available in:</span>
        <span class="available-in-pill available-in-pill--enterprise">Enterprise</span>
    </div>
    <div class="available-in-row">
        <span class="available-in-versions">Introduced in <a href="../release-notes.html#fiftyone-enterprise-1-3-0">FiftyOne Enterprise 1.3.0</a></span>
    </div>
    
    <div class="available-in-cta">
        <a href="https://voxel51.com/book-a-demo" class="available-in-cta-link" rel="noopener noreferrer" target="_blank">
            Schedule a demo to get started with FiftyOne Enterprise
        </a>
    </div>

</div>

<a id="module-fiftyone.management.users"></a>

User management.

Copyright 2017-2026, Voxel51, Inc.
<br/>
[voxel51.com](https://voxel51.com/)
<br/>
<br/>

### *class* fiftyone.management.users.CloudCredential

Cloud Credentials Info

#### created_at *: [datetime.datetime](../api/fiftyone.utils.data.md#fiftyone.utils.data.datetime)*

#### prefixes *: [List](../api/fiftyone.operators.types.md#fiftyone.operators.types.List)[str]*

#### provider *: str*

#### description *: str | None* *= None*

#### scope *: str | None* *= None*

#### sid *: str | None* *= None*

### *class* fiftyone.management.users.UserGroupRef

dict() -> new empty dictionary
dict(mapping) -> new dictionary initialized from a mapping object’s

> (key, value) pairs

dict(iterable) -> new dictionary initialized as if via:
: d = {}
  for k, v in iterable:
  <br/>
  > d[k] = v

dict(

```
**
```

kwargs) -> new dictionary initialized with the name=value pairs
: in the keyword argument list.  For example:  dict(one=1, two=2)

#### id *: str*

#### name *: str*

#### clear()

Remove all items from the dict.

#### copy()

Return a shallow copy of the dict.

#### get()

Return the value for key if key is in the dictionary, else default.

#### items()

Return a set-like object providing a view on the dict’s items.

#### keys()

Return a set-like object providing a view on the dict’s keys.

#### pop()

D.pop(k[,d]) -> v, remove specified key and return the corresponding value.

If the key is not found, return the default if given; otherwise,
raise a KeyError.

#### popitem()

Remove and return a (key, value) pair as a 2-tuple.

Pairs are returned in LIFO (last-in, first-out) order.
Raises KeyError if the dict is empty.

#### setdefault()

Insert key with a value of default if key is not in the dictionary.

Return the value for key if key is in the dictionary, else default.

#### update()

D.update([E, ]\*\*F) -> None.  Update D from mapping/iterable E and F.
If E is present and has a .keys() method, then does:  for k in E.keys(): D[k] = E[k]
If E is present and lacks a .keys() method, then does:  for k, v in E: D[k] = v
In either case, this is followed by: for k in F:  D[k] = F[k]

#### values()

Return an object providing a view on the dict’s values.

### *class* fiftyone.management.users.UserRole(\*args, \*\*kwds)

User role enum.

#### ADMIN *= 'ADMIN'*

#### MEMBER *= 'MEMBER'*

#### COLLABORATOR *= 'COLLABORATOR'*

#### LABELER *= 'LABELER'*

#### GUEST *= 'GUEST'*

#### name()

The name of the Enum member.

#### value()

The value of the Enum member.

### *class* fiftyone.management.users.User

User information dataclass.

#### id *: str*

#### name *: str*

#### email *: str*

#### role *: [UserRole](#fiftyone.management.users.UserRole)*

#### cloud_credentials *: [List](../api/fiftyone.operators.types.md#fiftyone.operators.types.List)[[fiftyone.management.cloud_credentials.CloudCredential](#fiftyone.management.cloud_credentials.CloudCredential)] | None* *= None*

#### user_groups *: [List](../api/fiftyone.operators.types.md#fiftyone.operators.types.List)[[UserGroupRef](#fiftyone.management.users.UserGroupRef)] | None* *= None*

### *class* fiftyone.management.users.Invitation

Invitation dataclass.

#### id *: str*

#### created_at *: [datetime.datetime](../api/fiftyone.utils.data.md#fiftyone.utils.data.datetime)*

#### expires_at *: [datetime.datetime](../api/fiftyone.utils.data.md#fiftyone.utils.data.datetime)*

#### invitee_email *: str*

#### invitee_role *: [UserRole](#fiftyone.management.users.UserRole)*

#### url *: str*

### fiftyone.management.users.delete_user(user: str | [User](#fiftyone.management.users.User)) → None

Deletes the given user.

#### NOTE
Only admins can perform this action.

#### WARNING
This action is irreversible! Once deleted, the user will have to be
re-invited to the organization to have access again.

Examples:

```default
import fiftyone.management as fom

delete_user = "guest@company.com"

fom.delete_user(delete_user)

assert fom.get_user(delete_user) is None
```

* **Parameters:**
  **user** – a user ID, email string, or [`User`](#fiftyone.management.users.User) instance

### fiftyone.management.users.delete_user_invitation(invitation: str) → None

Deletes/revokes a previously-sent invitation if it has not been accepted.

#### NOTE
Only admins can perform this action.

Examples:

```default
import fiftyone.management as fom

new_guest = "guest@company.com"

invite_id = fom.send_user_invitation(new_guest, fom.GUEST)

# Delete by invitation ID
fom.delete_user_invitation(invite_id)

# Delete by user email
fom.delete_user_invitation(new_guest)

pending = fom.list_pending_invitations()
assert not any(p.id == invite_id for p in pending)
```

* **Parameters:**
  **invitation** – an invitation ID as returned by
  [`send_user_invitation()`](#fiftyone.management.users.send_user_invitation), or email address

### fiftyone.management.users.get_user(user: str) → [User](#fiftyone.management.users.User) | None

Gets information about the specified user (if any).

#### NOTE
Only admins can retrieve information about other users.

Examples:

```default
import fiftyone.management as fom

known_user = "member@company.com"
user = fom.get_user(known_user)
assert user.email == known_user

unknown_user = "unknown@company.com"
assert fom.get_user(unknown_user) is None
```

* **Parameters:**
  **user** – a user ID or email string
* **Returns:**
  [`User`](#fiftyone.management.users.User), or `None` if no such user is found

### fiftyone.management.users.list_pending_invitations() → [List](../api/fiftyone.operators.types.md#fiftyone.operators.types.List)[[Invitation](#fiftyone.management.users.Invitation)]

Returns a list of pending user invitations.

#### NOTE
Only admins can retrieve this information.

Examples:

```default
import fiftyone.management as fom

fom.list_pending_invitations()
```

* **Returns:**
  a list of [`Invitation`](#fiftyone.management.users.Invitation) instances

### fiftyone.management.users.list_users(verbose=True) → [List](../api/fiftyone.operators.types.md#fiftyone.operators.types.List)[[User](#fiftyone.management.users.User)] | [List](../api/fiftyone.operators.types.md#fiftyone.operators.types.List)[str]

Returns a list of all users.

#### NOTE
Only admins can retrieve this information.

Examples:

```default
import fiftyone.management as fom

fom.list_users()
```

* **Parameters:**
  **verbose** (*True*) – if True, return a list of [`User`](#fiftyone.management.users.User) instances;
  if False, return a list of user emails
* **Returns:**
  a list of [`User`](#fiftyone.management.users.User) instances

### fiftyone.management.users.send_user_invitation(email: str, role: [UserRole](#fiftyone.management.users.UserRole)) → str

Sends an email invitation to join your FiftyOne Enterprise organization.

#### NOTE
Only admins can perform this action.

Examples:

```default
import fiftyone.management as fom

new_guest = "guest@company.com"

invite_id = fom.send_user_invitation(new_guest, fom.GUEST)

pending = fom.list_pending_invitations()
assert any(p.invitee_email == new_guest for p in pending)
```

* **Parameters:**
  * **email** – the email address
  * **role** – the [`UserRole`](#fiftyone.management.users.UserRole) to grant the new user
* **Returns:**
  the invitation ID string

### fiftyone.management.users.set_user_role(user: str | [User](#fiftyone.management.users.User), role: [UserRole](#fiftyone.management.users.UserRole)) → None

Sets the role of the given user.

#### NOTE
Only admins can perform this action.

Examples:

```default
import fiftyone.management as fom

user = "user@company.com"

#1.a set role from email
fom.set_user_role(user, fom.MEMBER)

#1.b set role from user instance
user_obj = fom.get_user(user_obj)
fom.set_user_role(user_obj, fom.MEMBER)

assert fom.get_user(user).role == fom.MEMBER
```

* **Parameters:**
  * **user** – a user ID, email string, or [`User`](#fiftyone.management.users.User) instance
  * **role** – the [`UserRole`](#fiftyone.management.users.UserRole) to set

### fiftyone.management.users.whoami() → [User](#fiftyone.management.users.User)

Returns information about the calling user.

#### NOTE
This function is only supported for human users. Service accounts
should use `fiftyone.management.get_service_account()` instead.

Examples:

```default
import fiftyone.management as fom

me = fom.whoami()

assert fom.get_user(me.id) == me
```

* **Returns:**
  [`User`](#fiftyone.management.users.User)

### fiftyone.management.users.resolve_user_id(user_or_id_or_email: str | [User](#fiftyone.management.users.User) | None, nullable: [bool](../api/fiftyone.core.stages.md#fiftyone.core.stages.Exists.bool) = False, pass_unknown_email: [bool](../api/fiftyone.core.stages.md#fiftyone.core.stages.Exists.bool) = False) → str | None

Resolves user ID - by looking up user by email if it has to

<a id="enterprise-sdk-group-management"></a>

## Group management


<div class="available-in">
    <div class="available-in-row">
        <span class="available-in-label">Available in:</span>
        <span class="available-in-pill available-in-pill--enterprise">Enterprise</span>
    </div>
    <div class="available-in-row">
        <span class="available-in-versions">Introduced in <a href="../release-notes.html#fiftyone-enterprise-2-0-0">FiftyOne Enterprise 2.0.0</a></span>
    </div>
    
    <div class="available-in-cta">
        <a href="https://voxel51.com/book-a-demo" class="available-in-cta-link" rel="noopener noreferrer" target="_blank">
            Schedule a demo to get started with FiftyOne Enterprise
        </a>
    </div>

</div>

<a id="module-fiftyone.management.user_groups"></a>

Group management.

Copyright 2017-2026, Voxel51, Inc.
<br/>
[voxel51.com](https://voxel51.com/)
<br/>
<br/>

### fiftyone.management.user_groups.logger

### *exception* fiftyone.management.user_groups.FiftyOneEnterpriseAPIError

Base error for the FiftyOne Enterprise API.

#### add_note()

Exception.add_note(note) –
add a note to the exception

#### *class* args

#### with_traceback()

Exception.with_traceback(tb) –
set self._\_traceback_\_ to tb and return self.

### *class* fiftyone.management.user_groups.CloudCredential

Cloud Credentials Info

#### created_at *: [datetime.datetime](../api/fiftyone.utils.data.md#fiftyone.utils.data.datetime)*

#### prefixes *: [List](../api/fiftyone.operators.types.md#fiftyone.operators.types.List)[str]*

#### provider *: str*

#### description *: str | None* *= None*

#### scope *: str | None* *= None*

#### sid *: str | None* *= None*

### *class* fiftyone.management.user_groups.APIClientConnection

#### instance *= None*

#### reload()

#### *property* has_principal_endpoints *: [bool](../api/fiftyone.core.stages.md#fiftyone.core.stages.Exists.bool)*

True if the connected API supports principal (user + SA) endpoints.

#### *property* client

### *exception* fiftyone.management.user_groups.FiftyOneManagementError(message)

Exception raised for errors in the SDK.

### message -- explanation of the error

#### message

#### add_note()

Exception.add_note(note) –
add a note to the exception

#### *class* args

#### with_traceback()

Exception.with_traceback(tb) –
set self._\_traceback_\_ to tb and return self.

### *class* fiftyone.management.user_groups.User

User information dataclass.

#### id *: str*

#### name *: str*

#### email *: str*

#### role *: [UserRole](#fiftyone.management.service_account.UserRole)*

#### cloud_credentials *: [List](../api/fiftyone.operators.types.md#fiftyone.operators.types.List)[[fiftyone.management.cloud_credentials.CloudCredential](#fiftyone.management.cloud_credentials.CloudCredential)] | None* *= None*

#### user_groups *: [List](../api/fiftyone.operators.types.md#fiftyone.operators.types.List)[[UserGroupRef](#fiftyone.management.users.UserGroupRef)] | None* *= None*

### fiftyone.management.user_groups.resolve_user_id(user_or_id_or_email: str | [User](#fiftyone.management.user_groups.User) | None, nullable: [bool](../api/fiftyone.core.stages.md#fiftyone.core.stages.Exists.bool) = False, pass_unknown_email: [bool](../api/fiftyone.core.stages.md#fiftyone.core.stages.Exists.bool) = False) → str | None

Resolves user ID - by looking up user by email if it has to

### *class* fiftyone.management.user_groups.UserGroup

User Group information dataclass.

#### id *: str*

#### name *: str*

#### description *: str | None*

#### principals *: [List](../api/fiftyone.operators.types.md#fiftyone.operators.types.List)[Any] | None* *= None*

#### cloud_credentials *: [List](../api/fiftyone.operators.types.md#fiftyone.operators.types.List)[[fiftyone.management.cloud_credentials.CloudCredential](#fiftyone.management.cloud_credentials.CloudCredential)] | None* *= None*

#### users *: [List](../api/fiftyone.operators.types.md#fiftyone.operators.types.List)[[fiftyone.management.users.User](#fiftyone.management.users.User)] | None* *= None*

### fiftyone.management.user_groups.add_users_to_group(user_group: str, users: [List](../api/fiftyone.operators.types.md#fiftyone.operators.types.List)[Any] | str, resolved_users: [bool](../api/fiftyone.core.stages.md#fiftyone.core.stages.Exists.bool) = False) → [UserGroup](#fiftyone.management.user_groups.UserGroup)

Adds users to the given group.

#### NOTE
Only admins can perform this action.

Examples:

```default
import fiftyone.management as fom

group_id = "group id"
user_ids = ["user id 1", "user id 2"]

fom.add_users_to_group(user_group=group_id, user_ids=user_ids)
```

* **Parameters:**
  * **user_group** – a group ID, name string, or `Group` instance
  * **users** (*None*) – list of users (email or ID strings or User instances or
    dictionary objects with valid fields) or a single user string/obj
  * **resolved_users** (*False*) – If True, the user_ids are already
    resolved/validated

### fiftyone.management.user_groups.create_user_group(name: str, description: str | None = None, users: [List](../api/fiftyone.operators.types.md#fiftyone.operators.types.List)[str | [fiftyone.management.users.User](#fiftyone.management.users.User)] | None = None) → [UserGroup](#fiftyone.management.user_groups.UserGroup)

Creates a new user group.

#### NOTE
Only admins can perform this action.

Examples:

```default
import fiftyone.management as fom

group_name = "Name"
group_description = "Description"
fom.add_user_group(name=group_name, description=group_description)

assert fom.get_user_group(group_name) is not None
```

* **Parameters:**
  * **name** – group name, string
  * **description** (*None*) – optional group description, string
  * **users** (*None*) – optional list of user_ids, names or Users instance

### fiftyone.management.user_groups.delete_user_group(user_group: str | [UserGroup](#fiftyone.management.user_groups.UserGroup)) → None

Deletes the given group.

#### NOTE
Only admins can perform this action.

#### WARNING
This action is irreversible!

Examples:

```default
import fiftyone.management as fom

group_name = "Group Name"
fom.delete_user_group(group_name)

assert fom.get_user_group(group_name) is None
```

* **Parameters:**
  **user_group** – a group ID, name string, or `Group` instance

### fiftyone.management.user_groups.get_user_group(user_group: str) → [UserGroup](#fiftyone.management.user_groups.UserGroup) | None

Gets information about the specified group (if any).

#### NOTE
Only admins can retrieve information about user groups.

Examples:

```default
import fiftyone.management as fom

group_name = "Group Name"
group = fom.get_user_group(group_name)
assert group.name == group_name

unknown_group = "Unknown Group"
assert fom.get_user_group(unknown_group) is None
```

* **Parameters:**
  **user_group** – a group ID or name string
* **Returns:**
  `Group`, or `None` if no such group is found

### fiftyone.management.user_groups.list_user_groups_for_user(user: str | dict | [fiftyone.management.users.User](#fiftyone.management.users.User), verbose=False) → [List](../api/fiftyone.operators.types.md#fiftyone.operators.types.List)[[UserGroup](#fiftyone.management.user_groups.UserGroup)] | [List](../api/fiftyone.operators.types.md#fiftyone.operators.types.List)[str]

Gets all user groups for the given user.

If the user_id does not exist, an empty list is returned.

if the email address is incorrect, an exception is raised.

If there is no group associated with the user, an empty list is returned.

#### NOTE
Only admins can retrieve this information.

Examples:

```default
import fiftyone.management as fom

user_id = "user id"
fom.list_user_groups_for_user(user_id)
```

* **Parameters:**
  * **user** – a user ID or email string, or
    [`User`](#fiftyone.management.users.User) instance
  * **verbose** (*True*) – If True, returns the list of groups, otherwise return
    the list of group names
* **Returns:**
  a list of [`UserGroup`](#fiftyone.management.user_groups.UserGroup) instances or a list of group names

### fiftyone.management.user_groups.list_user_groups(num_groups: int = 100, verbose=False) → [List](../api/fiftyone.operators.types.md#fiftyone.operators.types.List)[[UserGroup](#fiftyone.management.user_groups.UserGroup)] | [List](../api/fiftyone.operators.types.md#fiftyone.operators.types.List)[str]

Returns a list of all user groups.

#### NOTE
Only admins can retrieve this information.

Examples:

```default
import fiftyone.management as fom

fom.list_user_groups()
```

* **Parameters:**
  * **num_groups** (*100*) – The number of user groups to fetch
  * **verbose** (*False*) – If True, returns the list of groups, otherwise return
  * **names** (*the list* *of* *group*)
* **Returns:**
  a list of `Group` instances or a list of group names

### fiftyone.management.user_groups.remove_users_from_group(user_group: str, users: [List](../api/fiftyone.operators.types.md#fiftyone.operators.types.List)[Any] | str, resolved_users: [bool](../api/fiftyone.core.stages.md#fiftyone.core.stages.Exists.bool) = False) → [UserGroup](#fiftyone.management.user_groups.UserGroup)

Removes users from the given group.

#### NOTE
Only admins can perform this action.

Examples:

```default
import fiftyone.management as fom

user_group = "group id"
user_ids = ["user id 1", "user id 2"]

fom.remove_users_from_group(user_group=group_id, user_ids=user_ids)
```

* **Parameters:**
  * **user_group** – a group ID, name string, or `Group` instance
  * **users** (*None*) – list of users (email or ID strings or User instances or
    dictionary objects with valid fields) or a single user string/obj
  * **resolved_users** (*False*) – If True, the user_ids are already resolved/validated

### fiftyone.management.user_groups.update_user_group(user_group: str, name: str | None = None, description: str | None = None, users: [List](../api/fiftyone.operators.types.md#fiftyone.operators.types.List)[str | [UserGroup](#fiftyone.management.user_groups.UserGroup)] | None = None) → [UserGroup](#fiftyone.management.user_groups.UserGroup)

Updates the given group.

#### NOTE
Only admins can perform this action.

Examples:

```default
import fiftyone.management as fom

group_id = "group id"
group_name = "New Name"
fom.update_user_group(user_group=group_id, name=group_name)

assert fom.get_user_group(group_name) is not None
```

* **Parameters:**
  * **user_group** – a group ID, name string, or `Group` instance
  * **name** (*None*) – group name, string
  * **description** (*None*) – group description, string
  * **users** (*None*) – list of user id, name string or User instance. Existing
    users not in this list will be removed.

### fiftyone.management.user_groups.resolve_user_group_id(group_or_id_or_name: str | [UserGroup](#fiftyone.management.user_groups.UserGroup) | None | dict) → str

Resolves group ID - by looking up group by name if it has to
