---
title: "Update Tenant Device Model"
method: PUT
path: "/v1/foundry/device-models/{device_model_id}/"
tags: ["foundation_FoundryDeviceModels"]
---

# Update Tenant Device Model

`PUT /v1/foundry/device-models/{device_model_id}/`

Configures the auto-update behavior for a Foundation device model — enabling or disabling automatic OS updates and optionally locking updates to a specific approved build or to the latest approved build.

Use this endpoint to control how and when a device model receives Foundation OS updates over the air, as the programmatic equivalent of the auto-update toggle and version selector in Esper Software Updates for Foundation.

**About Update Tenant Device Model**

Once a Foundation build is approved, auto-update must be separately enabled on the device model before devices begin receiving it. This endpoint manages that configuration. Setting auto_update: true enables OTA delivery; latest: true instructs Foundry to automatically track the newest approved build as it becomes available; locked_build_id pins updates to a specific build UUID. Note that latest and locked_build_id are only processed when auto_update is true. Once auto-update is active, enrolled devices on older builds will receive the update over a rolling 24-hour window — devices not currently communicating with Esper will update when they reconnect.

**Key Fields / Query Parameters**

device_model_id (path, required) — UUID of the device model to update

auto_update (body) — true to enable automatic OTA updates for this device model; false to disable

latest (body) — When true, Foundry automatically locks to the newest approved build whenever one becomes available; processed only when auto_update is true

locked_build_id (body) — UUID of the specific approved build to lock for auto-update; processed only when auto_update is true

**Common Use Cases**

Enabling auto-update after approving a new Foundation build so enrolled devices begin receiving it within the 24-hour rollout window

Pinning a device model to a specific build version (locked_build_id) to control the exact OS version deployed across that hardware

Disabling auto-update (auto_update: false) to pause OTA rollouts while investigating a reported issue with a new build

**Best Practices**

Approve the target build via PUT /v1/foundry/builds/{build_id}/ before enabling auto-update — auto-update only delivers approved builds

Use locked_build_id rather than latest in production environments where you want explicit control over which version is deployed; reserve latest for test or canary device models

Ensure devices are configured to accept system updates (via blueprint System Updates policy) before enabling auto-update here — both the device policy and the Foundry model config must align for updates to apply

**Workflow**

Approve the target build using PUT /v1/foundry/builds/{build_id}/ with approve: true

Call PUT /v1/foundry/device-models/{device_model_id}/ with auto_update: true and either locked_build_id (specific version) or latest: true (track newest approved)

Monitor the Foundation Event Feed (GET /v1/foundry/events/) to confirm the configuration change was recorded and track rollout progress

## Path parameters

- `device_model_id` string, uuid, required

## Request body

- FoundationDeviceModelPUTRequestV1
  - `auto_update` boolean — Enables/disables automatic updates for the device model. The other properties (latest and locked_build_id) are processed only if autoupdate is set to true.
  - `latest` boolean — Configures Foundry service to automatically lock to the latest approved build (whenever available) if set to true.
  - `locked_build_id` string — Specifies the UUID of the build which needs to be locked for automatic updates.

## Response `200`

Updated

- object
  - `data` FoundationBuildV1
    - `build_id` string
    - `created_at` string, date-time
    - `updated_at` string, date-time
    - `deprecated_on` string, date-time
    - `created_by` string
    - `updated_by` string
    - `ab_update` boolean
    - `android_major_version` integer
    - `android_minimum_sdk_level` integer
    - `android_minor_version` string
    - `android_sdk_level` integer
    - `build_arch` string
    - `build_flavor` string
    - `build_hash` string
    - `build_ota_hash` string
    - `build_job_url` string
    - `build_job_id` integer
    - `build_fingerprint_hash` string
    - `build_type` string
    - `build_url` string, url
    - `build_update_meta_data` string, json
    - `build_update_url` string, url
    - `file_size_kb` integer
    - `foundation_build_number` integer
    - `foundation_major_number` integer
    - `foundation_minor_number` integer
    - `foundation_name` string
    - `model_display_name` string
    - `build_job_params` string, json
    - `prebuilt_app_info` string, json
    - `release_notes` string, json
    - `release_rating` string
    - `source_build_id` string
    - `build_state` 'released' | 'to_be_deprecated' | 'unavailable'
    - `device_model_id` string
    - `approved` boolean

## Other responses

- `400` — Bad Request
- `401` — Unauthorized
- `403` — locked_build_id not approved
- `404` — DeviceModel not found

---

[API](https://skmtc.net/esper/apis/esper-api-reference.md) · [All operations](https://skmtc.net/esper/apis/esper-api-reference/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/esper/esper-api-reference/revisions/e1f64cbb488e/schema)
