# Manage tenant states & temperature

![Storage Tiers](/assets/docs/weaviate/manage-collections/img/storage-tiers.jpg)

Storage resources are grouped into tiers. Each tier has different performance characteristics and costs:

| Tier | Location      | Speed          | Cost            |
| :--- | :------------ | :------------- | :-------------- |
| Hot  | RAM           | Fastest access | Most expensive  |
| Warm | Disk          | Medium speed   | Medium price    |
| Cold | Cloud Storage | Slowest access | Least expensive |

The pricing difference between Hot and Cold tiers is significant. Cloud storage is several orders of magnitude cheaper than RAM.

In multi-tenant collections, you can change tenant states (`Active`, `Inactive`, `Offloaded`) to move data between storage tiers. This allows granular trade-offs between cost, resource availability, and readiness.

:::accordion{title="Manage vector index resource temperature"}
The vector index type affects its default resource type.

- [`HNSW` index (default)](../reference-configuration/indexing-vector-index.md#hnsw-index) - uses the vector index in RAM, a **Hot** resource.
- [`Flat` index](../reference-configuration/indexing-vector-index.md#flat-index) - uses the vector index on disk, a **Warm** resource.
- [`Dynamic` index](../reference-configuration/indexing-vector-index.md#dynamic-index) - starts as a flat index (using a **Warm** resource), then switches to an HNSW index (a **Hot** resource) at a predetermined threshold.
:::

## Tenant States Overview

There are three tenant states: `Active`, `Inactive` and `Offloaded`.

| Tenant state     | CRUD & Queries | Vector Index | Inverted Index | Object Data | Time to Activate | Description                                                 |
| ---------------- | -------------- | ------------ | -------------- | ----------- | ---------------- | ----------------------------------------------------------- |
| Active (default) | **Yes**        | Hot/Warm     | Warm           | Warm        | None             | Tenant is available for use                                 |
| Inactive         | **No**         | Warm         | Warm           | Warm        | Fast             | Tenant is locally stored but not available for use          |
| Offloaded        | **No**         | Cold         | Cold           | Cold        | Slow             | Tenant is stored in cloud storage and not available for use |

:::callout{intent="tip" title="Tenant state and consistency"}
Tenant states are eventually consistent. [Read more](../replication-architecture/consistency.md#tenant-states-and-data-objects)
:::

### Active

An `Active` tenant is available for queries and CRUD operations. Depending on the [vector index type](../starter-guides/managing-resources.md#vector-index-types) it uses either **hot** or **warm** resources.

The tenant's object data and inverted index are stored on disk, using `warm` resources.

![Active Tenant resources](/assets/docs/weaviate/manage-collections/img/active-tenants.jpg)

### Inactive

An `Inactive` tenant is not available for queries nor CRUD operations.

The tenant's object data, vector index and inverted index are stored on disk, using `warm` resources. This can lower Weaviate's memory requirements compared to active tenants that use `hot` resources.

Since the tenant is stored locally, inactive tenants can be activated quickly.

![Inactive Tenant resources](/assets/docs/weaviate/manage-collections/img/inactive-tenants.jpg)

### Offloaded

:::callout{intent="info" title="Offloading: AWS S3 only"}
As of Weaviate `v1.26.0`, tenants can only be offloaded to cold storage in AWS S3. Additional storage options may be added in future releases.

To offload a tenant, use the `offload-s3` module.
:::

An `offloaded` tenant is not available for queries or CRUD operations.

The tenant's object data, vector index and inverted index are stored on the cloud, using `cold` resources. Since the tenant is stored remotely, there is a delay when activating an offloaded tenant.

![Offloaded Tenant resources](/assets/docs/weaviate/manage-collections/img/offloaded-tenants.jpg)

## Activate tenant

To activate an `INACTIVE` tenant from disk, or to onload and activate an `OFFLOADED` tenant from cloud, call:

:::code-group{sync="languages"}
```python title="Python" {4-9}
from weaviate.classes.tenants import Tenant, TenantActivityStatus

multi_collection = client.collections.use("MultiTenancyCollection")
multi_collection.tenants.update(tenants=[
    Tenant(
        name="tenantA",
        activity_status=TenantActivityStatus.ACTIVE
    )
])
```

```typescript title="JavaScript/TypeScript" {3-6}
const multiCollection = client.collections.use(collectionName)

await multiCollection.tenants.update({
  name: 'tenantA',
  activityStatus: 'ACTIVE'
})
```

```java title="Java"
String tenantName = "tenantA";
CollectionHandle<Map<String, Object>> collection =
    client.collections.use(collectionName);
collection.tenants.activate(tenantName);
```

```csharp title="C#"
string[] tenantName = ["tenantA"];
await collection.Tenants.Activate(tenantName);
```
:::

## Deactivate tenant

To deactivate an `ACTIVE` tenant, or to onload an `OFFLOADED` tenant from cloud (without activating it), call:

:::code-group{sync="languages"}
```python title="Python" {4-9}
from weaviate.classes.tenants import Tenant, TenantActivityStatus

multi_collection = client.collections.use("MultiTenancyCollection")
multi_collection.tenants.update(tenants=[
    Tenant(
        name="tenantA",
        activity_status=TenantActivityStatus.INACTIVE
    )
])
```

```typescript title="JavaScript/TypeScript" {3-6}
const multiCollection = client.collections.use(collectionName)

await multiCollection.tenants.update({
  name: 'tenantA',
  activityStatus: 'INACTIVE'
})
```

```java title="Java"
String tenantName = "tenantA";
CollectionHandle<Map<String, Object>> collection =
    client.collections.use(collectionName);
collection.tenants.deactivate(tenantName);
```

```csharp title="C#"
string[] tenantName = ["tenantA"];
await collection.Tenants.Deactivate(tenantName);
```
:::

## Offload tenant

To offload an `ACTIVE` or `INACTIVE` tenant to cloud, call:

:::code-group{sync="languages"}
```python title="Python" {4-9}
from weaviate.classes.tenants import Tenant, TenantActivityStatus

multi_collection = client.collections.use("MultiTenancyCollection")
multi_collection.tenants.update(tenants=[
    Tenant(
        name="tenantA",
        activity_status=TenantActivityStatus.OFFLOADED
    )
])
```

```typescript title="JavaScript/TypeScript" {3-6}
const multiCollection = client.collections.use(collectionName)

await multiCollection.tenants.update({
  name: 'tenantA',
  activityStatus: 'OFFLOADED'
})
```

```java title="Java"
String tenantName = "tenantA";
CollectionHandle<Map<String, Object>> collection =
    client.collections.use(collectionName);
collection.tenants.offload(tenantName);
```

```csharp title="C#"
await collection.Tenants.Offload(new[] { "tenantA" });
```
:::

:::callout{intent="warning" title="Requires Offload Module"}
Tenant offloading requires an Offload module.

To enable tenant offloading, see the [modules page](../how-to-configure-weaviate/modules.md#tenant-offload-modules)
:::

## Automatically activate tenants

Enable this to automatically activate `INACTIVE` or `OFFLOADED` tenants if a search, read, update, or delete operation is performed on them.

:::code-group{sync="languages"}
```python title="Python" {5-8}
from weaviate.classes.config import Configure

multi_collection = client.collections.create(
    name="CollectionWithAutoTenantActivation",
    multi_tenancy_config=Configure.multi_tenancy(
        enabled=True,
        auto_tenant_activation=True  # Enable automatic tenant activation
    )
)
```

```typescript title="JavaScript/TypeScript" {5}
const result = await client.collections.create({
  name: 'CollectionWithAutoTenantActivation',
  multiTenancy: weaviate.configure.multiTenancy({
    enabled: true,
    autoTenantActivation: true
  })
})
```

```java title="Java"
client.collections.create("MultiTenancyCollection",
    col -> col.multiTenancy(mt -> mt.autoTenantActivation(true)));
```

```csharp title="C#"
await client.Collections.Create(
    new CollectionCreateParams
    {
        Name = "MultiTenancyCollection",
        MultiTenancyConfig = new MultiTenancyConfig
        {
            Enabled = true,
            AutoTenantActivation = true,
        },
    }
);
```
:::

## Questions and feedback

Have a question or feedback? Here's how to reach us.

::::card-grid
:::card{title="Community Forum" href="https://forum.weaviate.io/c/support" icon="messages-square"}
Ask questions and connect with other developers on our **Community forum**.
:::

:::card{title="Support" href="/guides/support-overview" icon="life-buoy"}
Weaviate Cloud user or customer? Find the right channel on the **Support page**.
:::
::::

## Related pages

- [Agents](./agents-index.md)
- [AI-assisted Weaviate code generation](./ai-assisted-vibe-coding-index.md)
- [APIs](./apis-index.md)
- [Authorization and authentication](./authorization-and-authentication-index.md)
- [Benchmarks](./benchmarks-index.md)
- [Best practices](./best-practices-index.md)
- [Client libraries](./clients-index.md)
- [Client Libraries / SDKs](./client-libraries-index.md)
- [Cloud](./cloud-index.md)
- [Cloud account management](./cloud-account-management-index.md)

# Agent Instructions

This portal answers questions programmatically. To receive a synthesized,
source-cited answer instead of crawling page by page, append the `?ask=`
query parameter to any page URL on this site:

    /guides/quickstart?ask=how+do+I+authenticate

Optional parameters:

- `&goal=<what-you-are-trying-to-do>` steers the answer toward your
  objective (e.g. `&goal=write+a+python+client`).
- `&version=<label>` scopes the answer to a mounted version when the
  portal publishes more than one.

The response is `text/markdown`: the answer followed by a `# Sources` list
of the portal pages it was grounded in. Status codes are the contract:

- `200` — the answer; `402` — the portal owner’s plan or answer credits are
  exhausted (surface this to your operator; do NOT retry); `429` — you are
  rate-limited; back off for the `Retry-After` seconds; `503` — the answer
  lane is temporarily unavailable; fall back to crawling the `.md` pages.

For the full corpus map read `llms.txt` at the site root; for the tool
surface (search + page fetch as MCP tools) see `/mcp`.
