openapi: 3.0.1
info:
  title: ESPER API REFERENCE
  x-logo:
    url: esper-logo-white.svg
    backgroundColor: '#141418'
    altText: Logo
  description: >
    # Introduction

    Welcome to Esper’s API documentation. The Esper API allows users to
    accomplish operations outside of the console. Some common uses for our APIs
    include observing device information and console activity, installing and
    updating apps, uploading files, and sending files to devices. Our users have
    also used the API to automate app updates, perform bulk actions, and more.


    Esper API endpoints use REST-based architecture and return JSON responses.


    See our documentation for:


    * [Getting started
    guides](https://help.esper.io/hc/en-us/articles/14199291792145-Getting-Started-with-APIs)

    * [Commonly used API
    examples](https://help.esper.io/hc/en-us/articles/16036992814609-Commonly-Used-APIs)

    * [API command
    examples](https://help.esper.io/hc/en-us/articles/16693582666769-Scheduling-API-Commands)

    * [Automated Script
    examples](https://help.esper.io/hc/en-us/articles/22957898441745-Automating-App-Updates-Using-the-API)

    * [And more](https://help.esper.io/hc/en-us/sections/11388094627857-API)



    # Authentication

    You need to create an API Key to interact with our APIs. Learn more about
    generating an API Key. You can also learn more about Esper and sign up for
    an account at esper.io/signup.


    Some endpoints also require an Enterprise ID. This ID can be found in the
    API Management section of the Esper console.

    # Pagination

    Responses may be paginated.

    Use the following parameters to query the data. A full list of parameters
    can be found on the endpoint’s documentation page.

    <table>
      <thead>
        <tr>
          <th>Parameter</th>
          <th>Data Type</th>
          <th>Explanation</th>
        </tr>
      </thead>
      <tbody>
        <tr>
        <td>limit</td>
        <td>integer</td>
        <td>Limit the data returned. Default = 20.</td>
      </tr>
      <tr>
        <td>offset</td>
        <td>integer</td>
        <td>Offset to the first item returned. Default = 0.</td>
      </tr>
      <tr>
        <td>ordering</td>
        <td>string</td>
        <td>Order the results set by the field name. Varies by endpoint.</td>
      </tr>
      <tr>
        <td>next</td>
        <td>string</td>
        <td>Paginate to the next response set.</td>
      </tr>
      <tr>
        <td>previous</td>
        <td>string</td>
        <td>Paginate to the last set response.</td>
      </tr>
    </table>


    # Errors

    We use standard HTTP status codes for success or failure.

    A typical error response may look something like this:


    ```json

    {
      "errors": [],
      "message": "error message",
      "status": 400
    }

    ```

    * `errors` -  List of error details

    * `message` - Error description

    * `status` - HTTP status code


    Some common status codes and messages are:


    <table>
      <thead>
        <tr>
          <th>Number</th>
          <th>Message</th>
          <th>Explanation</th>
        </tr>
      </thead>
      <tbody>
        <tr>
          <td>200</td>
          <td>OK</td>
          <td>The request succeeded.</td>
        </tr>
        <tr>
          <td>201</td>
          <td>Resource creation</td>
          <td>A resource was created.</td>
        </tr>
        <tr>
          <td>401</td>
          <td>Unauthorized</td>
          <td>The API key is invalid.</td>
        </tr>
        <tr>
          <td>404</td>
          <td>Not found</td>
          <td>The resource was not found.</td>
        </tr>
        <tr>
          <td>429</td>
          <td>Rate limit exceeded</td>
          <td>Too many requests. Wait a moment and try again.</td>
        </tr>
        <tr>
          <td>500</td>
          <td>Server error</td>
          <td>Internal error. Wait a moment and try again. If the issue persists, <a target="_blank" href="https://help.esper.io/hc/en-us/articles/14800200348561-Contacting-Esper-Support">contact Esper.</a></td>
        </tr>
      </tbody>
    </table>


    See how our systems are doing by checking our [status
    page](https://status.esper.cloud/).


    # Rate Limits

    To ensure quality of service for all customers, we enforce rate limits for
    API requests. Most customers won’t hit this limit with normal use. In case
    you experience 429 or rate limit exceeded errors, we recommend the
    following:

    * Try sending requests in batches.

    * Begin with about 20 requests at a time and building up from there.

    * Ensure your scripts are efficient and don’t contain redundant calls.

    * Reach out to your account manager to discuss your options.


    # Change Log

    **DevRel 195 [2026-08-05]**


    ➕ Added


    - **GET /v2/mdmserviceconfig** -  endpoint added


    - **GET /v2/mdmserviceconfig/anchor-certs** -  endpoint added


    **✏️ Updated**


    - **GET /device/v0/devices/**

      -  added the optional property 'content/results/items/oneOf[#/components/schemas/device_AppleDevice]/app_mode_meta/application_args' to the response with the '200' status

      -  added the optional property 'content/results/items/oneOf[#/components/schemas/device_AppleDevice]/app_mode_meta/application_path' to the response with the '200' status

      -  added the optional property 'content/results/items/oneOf[#/components/schemas/device_AppleDevice]/app_mode_meta/kiosk_mode_type' to the response with the '200' status

      -  added the optional property 'content/results/items/oneOf[#/components/schemas/device_WindowsDevice]/app_mode_meta/application_args' to the response with the '200' status

      -  added the optional property 'content/results/items/oneOf[#/components/schemas/device_WindowsDevice]/app_mode_meta/application_path' to the response with the '200' status

      -  added the optional property 'content/results/items/oneOf[#/components/schemas/device_WindowsDevice]/app_mode_meta/kiosk_mode_type' to the response with the '200' status

      -  added 'subschema #1, subschema #2' to the 'content/results/items/oneOf[#/components/schemas/device_AppleDevice]/app_mode_meta' response property 'allOf' list for the response status '200'

      -  added 'subschema #1, subschema #2' to the 'content/results/items/oneOf[#/components/schemas/device_WindowsDevice]/app_mode_meta' response property 'allOf' list for the response status '200'


    - **DELETE /device/v0/devices/{id}/**

      -  added the optional property 'content/oneOf[#/components/schemas/device_AppleDevice]/app_mode_meta/application_args' to the response with the '200' status

      -  added the optional property 'content/oneOf[#/components/schemas/device_AppleDevice]/app_mode_meta/application_path' to the response with the '200' status

      -  added the optional property 'content/oneOf[#/components/schemas/device_AppleDevice]/app_mode_meta/kiosk_mode_type' to the response with the '200' status

      -  added the optional property 'content/oneOf[#/components/schemas/device_WindowsDevice]/app_mode_meta/application_args' to the response with the '200' status

      -  added the optional property 'content/oneOf[#/components/schemas/device_WindowsDevice]/app_mode_meta/application_path' to the response with the '200' status

      -  added the optional property 'content/oneOf[#/components/schemas/device_WindowsDevice]/app_mode_meta/kiosk_mode_type' to the response with the '200' status

      -  added 'subschema #1, subschema #2' to the 'content/oneOf[#/components/schemas/device_AppleDevice]/app_mode_meta' response property 'allOf' list for the response status '200'

      -  added 'subschema #1, subschema #2' to the 'content/oneOf[#/components/schemas/device_WindowsDevice]/app_mode_meta' response property 'allOf' list for the response status '200'


    - **GET /device/v0/devices/{id}/**

      -  added the optional property 'content/oneOf[#/components/schemas/device_AppleDevice]/app_mode_meta/application_args' to the response with the '200' status

      -  added the optional property 'content/oneOf[#/components/schemas/device_AppleDevice]/app_mode_meta/application_path' to the response with the '200' status

      -  added the optional property 'content/oneOf[#/components/schemas/device_AppleDevice]/app_mode_meta/kiosk_mode_type' to the response with the '200' status

      -  added the optional property 'content/oneOf[#/components/schemas/device_WindowsDevice]/app_mode_meta/application_args' to the response with the '200' status

      -  added the optional property 'content/oneOf[#/components/schemas/device_WindowsDevice]/app_mode_meta/application_path' to the response with the '200' status

      -  added the optional property 'content/oneOf[#/components/schemas/device_WindowsDevice]/app_mode_meta/kiosk_mode_type' to the response with the '200' status

      -  added 'subschema #1, subschema #2' to the 'content/oneOf[#/components/schemas/device_AppleDevice]/app_mode_meta' response property 'allOf' list for the response status '200'

      -  added 'subschema #1, subschema #2' to the 'content/oneOf[#/components/schemas/device_WindowsDevice]/app_mode_meta' response property 'allOf' list for the response status '200'


    - **GET /v2/blueprints/**

      -  added the optional property 'content/results/items/settings/windows/kiosk_settings/kiosk_type' to the response with the '200' status

      -  added the optional property 'content/results/items/settings/windows/kiosk_settings/uwp_single_app_config' to the response with the '200' status


    - **POST /v2/blueprints/**

      -  added the new optional request property 'settings/windows/kiosk_settings/kiosk_type'

      -  added the new optional request property 'settings/windows/kiosk_settings/uwp_single_app_config'

      -  added the optional property 'content/settings/windows/kiosk_settings/kiosk_type' to the response with the '201' status

      -  added the optional property 'content/settings/windows/kiosk_settings/uwp_single_app_config' to the response with the '201' status


    - **DELETE /v2/blueprints/{blueprint_id}/**

      -  added the optional property 'content/settings/windows/kiosk_settings/kiosk_type' to the response with the '204' status

      -  added the optional property 'content/settings/windows/kiosk_settings/uwp_single_app_config' to the response with the '204' status


    - **GET /v2/blueprints/{blueprint_id}/**

      -  added the optional property 'content/settings/windows/kiosk_settings/kiosk_type' to the response with the '200' status

      -  added the optional property 'content/settings/windows/kiosk_settings/uwp_single_app_config' to the response with the '200' status


    - **PUT /v2/blueprints/{blueprint_id}/**

      -  added the new optional request property '/allOf[#/components/schemas/blueprints_BlueprintV2]/settings/windows/kiosk_settings/kiosk_type'

      -  added the new optional request property '/allOf[#/components/schemas/blueprints_BlueprintV2]/settings/windows/kiosk_settings/uwp_single_app_config'

      -  added the optional property 'content/settings/windows/kiosk_settings/kiosk_type' to the response with the '200' status

      -  added the optional property 'content/settings/windows/kiosk_settings/uwp_single_app_config' to the response with the '200' status


    - **GET /v2/blueprints/{blueprint_id}/versions/**

      -  added the optional property 'content/results/items/settings/windows/kiosk_settings/kiosk_type' to the response with the '200' status

      -  added the optional property 'content/results/items/settings/windows/kiosk_settings/uwp_single_app_config' to the response with the '200' status


    - **GET /v2/blueprints/{blueprint_id}/versions/{version_id}/**

      -  added the optional property 'content/settings/windows/kiosk_settings/kiosk_type' to the response with the '200' status

      -  added the optional property 'content/settings/windows/kiosk_settings/uwp_single_app_config' to the response with the '200' status


    - **GET /v2/devices/**

      -  added the optional property 'content/oneOf[#/components/schemas/device_CursorPaginatedDeviceList]/results/items/oneOf[#/components/schemas/device_AndroidDeviceV2]/app_mode_meta/application_args' to the response with the '200' status

      -  added the optional property 'content/oneOf[#/components/schemas/device_CursorPaginatedDeviceList]/results/items/oneOf[#/components/schemas/device_AndroidDeviceV2]/app_mode_meta/application_path' to the response with the '200' status

      -  added the optional property 'content/oneOf[#/components/schemas/device_CursorPaginatedDeviceList]/results/items/oneOf[#/components/schemas/device_AndroidDeviceV2]/app_mode_meta/kiosk_mode_type' to the response with the '200' status

      -  added the optional property 'content/oneOf[#/components/schemas/device_CursorPaginatedDeviceList]/results/items/oneOf[#/components/schemas/device_AppleDeviceV2]/app_mode_meta/application_args' to the response with the '200' status

      -  added the optional property 'content/oneOf[#/components/schemas/device_CursorPaginatedDeviceList]/results/items/oneOf[#/components/schemas/device_AppleDeviceV2]/app_mode_meta/application_path' to the response with the '200' status

      -  added the optional property 'content/oneOf[#/components/schemas/device_CursorPaginatedDeviceList]/results/items/oneOf[#/components/schemas/device_AppleDeviceV2]/app_mode_meta/kiosk_mode_type' to the response with the '200' status

      -  added the optional property 'content/oneOf[#/components/schemas/device_CursorPaginatedDeviceList]/results/items/oneOf[#/components/schemas/device_WindowsDeviceV2]/app_mode_meta/application_args' to the response with the '200' status

      -  added the optional property 'content/oneOf[#/components/schemas/device_CursorPaginatedDeviceList]/results/items/oneOf[#/components/schemas/device_WindowsDeviceV2]/app_mode_meta/application_path' to the response with the '200' status

      -  added the optional property 'content/oneOf[#/components/schemas/device_CursorPaginatedDeviceList]/results/items/oneOf[#/components/schemas/device_WindowsDeviceV2]/app_mode_meta/kiosk_mode_type' to the response with the '200' status

      -  added the optional property 'content/oneOf[#/components/schemas/device_OffsetPaginatedDeviceList]/results/items/oneOf[#/components/schemas/device_AndroidDeviceV2]/app_mode_meta/application_args' to the response with the '200' status

      -  added the optional property 'content/oneOf[#/components/schemas/device_OffsetPaginatedDeviceList]/results/items/oneOf[#/components/schemas/device_AndroidDeviceV2]/app_mode_meta/application_path' to the response with the '200' status

      -  added the optional property 'content/oneOf[#/components/schemas/device_OffsetPaginatedDeviceList]/results/items/oneOf[#/components/schemas/device_AndroidDeviceV2]/app_mode_meta/kiosk_mode_type' to the response with the '200' status

      -  added the optional property 'content/oneOf[#/components/schemas/device_OffsetPaginatedDeviceList]/results/items/oneOf[#/components/schemas/device_AppleDeviceV2]/app_mode_meta/application_args' to the response with the '200' status

      -  added the optional property 'content/oneOf[#/components/schemas/device_OffsetPaginatedDeviceList]/results/items/oneOf[#/components/schemas/device_AppleDeviceV2]/app_mode_meta/application_path' to the response with the '200' status

      -  added the optional property 'content/oneOf[#/components/schemas/device_OffsetPaginatedDeviceList]/results/items/oneOf[#/components/schemas/device_AppleDeviceV2]/app_mode_meta/kiosk_mode_type' to the response with the '200' status

      -  added the optional property 'content/oneOf[#/components/schemas/device_OffsetPaginatedDeviceList]/results/items/oneOf[#/components/schemas/device_WindowsDeviceV2]/app_mode_meta/application_args' to the response with the '200' status

      -  added the optional property 'content/oneOf[#/components/schemas/device_OffsetPaginatedDeviceList]/results/items/oneOf[#/components/schemas/device_WindowsDeviceV2]/app_mode_meta/application_path' to the response with the '200' status

      -  added the optional property 'content/oneOf[#/components/schemas/device_OffsetPaginatedDeviceList]/results/items/oneOf[#/components/schemas/device_WindowsDeviceV2]/app_mode_meta/kiosk_mode_type' to the response with the '200' status

      -  added 'subschema #1, subschema #2' to the 'content/oneOf[#/components/schemas/device_CursorPaginatedDeviceList]/results/items/oneOf[#/components/schemas/device_AndroidDeviceV2]/app_mode_meta' response property 'allOf' list for the response status '200'

      -  added 'subschema #1, subschema #2' to the 'content/oneOf[#/components/schemas/device_CursorPaginatedDeviceList]/results/items/oneOf[#/components/schemas/device_AppleDeviceV2]/app_mode_meta' response property 'allOf' list for the response status '200'

      -  added 'subschema #1, subschema #2' to the 'content/oneOf[#/components/schemas/device_CursorPaginatedDeviceList]/results/items/oneOf[#/components/schemas/device_WindowsDeviceV2]/app_mode_meta' response property 'allOf' list for the response status '200'

      -  added 'subschema #1, subschema #2' to the 'content/oneOf[#/components/schemas/device_OffsetPaginatedDeviceList]/results/items/oneOf[#/components/schemas/device_AndroidDeviceV2]/app_mode_meta' response property 'allOf' list for the response status '200'

      -  added 'subschema #1, subschema #2' to the 'content/oneOf[#/components/schemas/device_OffsetPaginatedDeviceList]/results/items/oneOf[#/components/schemas/device_AppleDeviceV2]/app_mode_meta' response property 'allOf' list for the response status '200'

      -  added 'subschema #1, subschema #2' to the 'content/oneOf[#/components/schemas/device_OffsetPaginatedDeviceList]/results/items/oneOf[#/components/schemas/device_WindowsDeviceV2]/app_mode_meta' response property 'allOf' list for the response status '200'


    - **GET /v2/devices/{id}**

      -  added the optional property 'content/oneOf[#/components/schemas/device_AndroidDeviceV2]/app_mode_meta/application_args' to the response with the '200' status

      -  added the optional property 'content/oneOf[#/components/schemas/device_AndroidDeviceV2]/app_mode_meta/application_path' to the response with the '200' status

      -  added the optional property 'content/oneOf[#/components/schemas/device_AndroidDeviceV2]/app_mode_meta/kiosk_mode_type' to the response with the '200' status

      -  added the optional property 'content/oneOf[#/components/schemas/device_AppleDeviceV2]/app_mode_meta/application_args' to the response with the '200' status

      -  added the optional property 'content/oneOf[#/components/schemas/device_AppleDeviceV2]/app_mode_meta/application_path' to the response with the '200' status

      -  added the optional property 'content/oneOf[#/components/schemas/device_AppleDeviceV2]/app_mode_meta/kiosk_mode_type' to the response with the '200' status

      -  added the optional property 'content/oneOf[#/components/schemas/device_WindowsDeviceV2]/app_mode_meta/application_args' to the response with the '200' status

      -  added the optional property 'content/oneOf[#/components/schemas/device_WindowsDeviceV2]/app_mode_meta/application_path' to the response with the '200' status

      -  added the optional property 'content/oneOf[#/components/schemas/device_WindowsDeviceV2]/app_mode_meta/kiosk_mode_type' to the response with the '200' status

      -  added 'subschema #1, subschema #2' to the 'content/oneOf[#/components/schemas/device_AndroidDeviceV2]/app_mode_meta' response property 'allOf' list for the response status '200'

      -  added 'subschema #1, subschema #2' to the 'content/oneOf[#/components/schemas/device_AppleDeviceV2]/app_mode_meta' response property 'allOf' list for the response status '200'

      -  added 'subschema #1, subschema #2' to the 'content/oneOf[#/components/schemas/device_WindowsDeviceV2]/app_mode_meta' response property 'allOf' list for the response status '200'


    ---


    **DevRel 194 [2026-07-21]**


    ➕ Added


    - **POST /v2/tenant-apps/{appId}/versions/{versionId}/artifacts** - 
    endpoint added


    - **DELETE
    /v2/tenant-apps/{appId}/versions/{versionId}/artifacts/{artifactId}** - 
    endpoint added


    **✏️ Updated**


    - **GET /device/v0/devices/**

      - ⚠️ added the new 'TENANT_WINDOWS_UWP' enum value to the 'content/results/items/oneOf[#/components/schemas/device_AppleDevice]/app_mode_meta/app_type' response property for the response status '200'

      - ⚠️ added the new 'TENANT_WINDOWS_UWP' enum value to the 'content/results/items/oneOf[#/components/schemas/device_WindowsDevice]/app_mode_meta/app_type' response property for the response status '200'


    - **DELETE /device/v0/devices/{id}/**

      - ⚠️ added the new 'TENANT_WINDOWS_UWP' enum value to the 'content/oneOf[#/components/schemas/device_AppleDevice]/app_mode_meta/app_type' response property for the response status '200'

      - ⚠️ added the new 'TENANT_WINDOWS_UWP' enum value to the 'content/oneOf[#/components/schemas/device_WindowsDevice]/app_mode_meta/app_type' response property for the response status '200'


    - **GET /device/v0/devices/{id}/**

      - ⚠️ added the new 'TENANT_WINDOWS_UWP' enum value to the 'content/oneOf[#/components/schemas/device_AppleDevice]/app_mode_meta/app_type' response property for the response status '200'

      - ⚠️ added the new 'TENANT_WINDOWS_UWP' enum value to the 'content/oneOf[#/components/schemas/device_WindowsDevice]/app_mode_meta/app_type' response property for the response status '200'


    - **GET /v2/blueprints/**

      - ⚠️ added the new 'AUTO_INSTALL_AND_NOTIFY_RESTART' enum value to the 'content/results/items/settings/windows/auto_update_settings/auto_update_type' response property for the response status '200'

      - ⚠️ added the new 'AUTO_INSTALL_AND_RESTART_FORCED' enum value to the 'content/results/items/settings/windows/auto_update_settings/auto_update_type' response property for the response status '200'

      - ⚠️ added the new 'NOTIFY_DOWNLOAD' enum value to the 'content/results/items/settings/windows/auto_update_settings/auto_update_type' response property for the response status '200'

      - ⚠️ added the new 'SCHEDULED_INSTALL_AND_RESTART' enum value to the 'content/results/items/settings/windows/auto_update_settings/auto_update_type' response property for the response status '200'

      - ⚠️ added the new 'TENANT_WINDOWS_UWP' enum value to the 'content/results/items/settings/windows/apps/items/app_type' response property for the response status '200'

      -  added the optional property 'content/results/items/settings/windows/custom_policies' to the response with the '200' status

      -  added the optional property 'content/results/items/settings/windows/scheduled_install_settings' to the response with the '200' status


    - **POST /v2/blueprints/**

      - ⚠️ added the new 'AUTO_INSTALL_AND_NOTIFY_RESTART' enum value to the 'content/settings/windows/auto_update_settings/auto_update_type' response property for the response status '201'

      - ⚠️ added the new 'AUTO_INSTALL_AND_RESTART_FORCED' enum value to the 'content/settings/windows/auto_update_settings/auto_update_type' response property for the response status '201'

      - ⚠️ added the new 'NOTIFY_DOWNLOAD' enum value to the 'content/settings/windows/auto_update_settings/auto_update_type' response property for the response status '201'

      - ⚠️ added the new 'SCHEDULED_INSTALL_AND_RESTART' enum value to the 'content/settings/windows/auto_update_settings/auto_update_type' response property for the response status '201'

      - ⚠️ added the new 'TENANT_WINDOWS_UWP' enum value to the 'content/settings/windows/apps/items/app_type' response property for the response status '201'

      -  added the new optional request property 'settings/windows/custom_policies'

      -  added the new optional request property 'settings/windows/scheduled_install_settings'

      -  added the new 'AUTO_INSTALL_AND_NOTIFY_RESTART' enum value to the request property 'settings/windows/auto_update_settings/auto_update_type'

      -  added the new 'AUTO_INSTALL_AND_RESTART_FORCED' enum value to the request property 'settings/windows/auto_update_settings/auto_update_type'

      -  added the new 'NOTIFY_DOWNLOAD' enum value to the request property 'settings/windows/auto_update_settings/auto_update_type'

      -  added the new 'SCHEDULED_INSTALL_AND_RESTART' enum value to the request property 'settings/windows/auto_update_settings/auto_update_type'

      -  added the new 'TENANT_WINDOWS_UWP' enum value to the request property 'settings/windows/apps/items/app_type'

      -  added the optional property 'content/settings/windows/custom_policies' to the response with the '201' status

      -  added the optional property 'content/settings/windows/scheduled_install_settings' to the response with the '201' status


    - **DELETE /v2/blueprints/{blueprint_id}/**

      - ⚠️ added the new 'AUTO_INSTALL_AND_NOTIFY_RESTART' enum value to the 'content/settings/windows/auto_update_settings/auto_update_type' response property for the response status '204'

      - ⚠️ added the new 'AUTO_INSTALL_AND_RESTART_FORCED' enum value to the 'content/settings/windows/auto_update_settings/auto_update_type' response property for the response status '204'

      - ⚠️ added the new 'NOTIFY_DOWNLOAD' enum value to the 'content/settings/windows/auto_update_settings/auto_update_type' response property for the response status '204'

      - ⚠️ added the new 'SCHEDULED_INSTALL_AND_RESTART' enum value to the 'content/settings/windows/auto_update_settings/auto_update_type' response property for the response status '204'

      - ⚠️ added the new 'TENANT_WINDOWS_UWP' enum value to the 'content/settings/windows/apps/items/app_type' response property for the response status '204'

      -  added the optional property 'content/settings/windows/custom_policies' to the response with the '204' status

      -  added the optional property 'content/settings/windows/scheduled_install_settings' to the response with the '204' status


    - **GET /v2/blueprints/{blueprint_id}/**

      - ⚠️ added the new 'AUTO_INSTALL_AND_NOTIFY_RESTART' enum value to the 'content/settings/windows/auto_update_settings/auto_update_type' response property for the response status '200'

      - ⚠️ added the new 'AUTO_INSTALL_AND_RESTART_FORCED' enum value to the 'content/settings/windows/auto_update_settings/auto_update_type' response property for the response status '200'

      - ⚠️ added the new 'NOTIFY_DOWNLOAD' enum value to the 'content/settings/windows/auto_update_settings/auto_update_type' response property for the response status '200'

      - ⚠️ added the new 'SCHEDULED_INSTALL_AND_RESTART' enum value to the 'content/settings/windows/auto_update_settings/auto_update_type' response property for the response status '200'

      - ⚠️ added the new 'TENANT_WINDOWS_UWP' enum value to the 'content/settings/windows/apps/items/app_type' response property for the response status '200'

      -  added the optional property 'content/settings/windows/custom_policies' to the response with the '200' status

      -  added the optional property 'content/settings/windows/scheduled_install_settings' to the response with the '200' status


    - **PUT /v2/blueprints/{blueprint_id}/**

      - ⚠️ added the new 'AUTO_INSTALL_AND_NOTIFY_RESTART' enum value to the 'content/settings/windows/auto_update_settings/auto_update_type' response property for the response status '200'

      - ⚠️ added the new 'AUTO_INSTALL_AND_RESTART_FORCED' enum value to the 'content/settings/windows/auto_update_settings/auto_update_type' response property for the response status '200'

      - ⚠️ added the new 'NOTIFY_DOWNLOAD' enum value to the 'content/settings/windows/auto_update_settings/auto_update_type' response property for the response status '200'

      - ⚠️ added the new 'SCHEDULED_INSTALL_AND_RESTART' enum value to the 'content/settings/windows/auto_update_settings/auto_update_type' response property for the response status '200'

      - ⚠️ added the new 'TENANT_WINDOWS_UWP' enum value to the 'content/settings/windows/apps/items/app_type' response property for the response status '200'

      -  added the new optional request property '/allOf[#/components/schemas/blueprints_BlueprintV2]/settings/windows/custom_policies'

      -  added the new optional request property '/allOf[#/components/schemas/blueprints_BlueprintV2]/settings/windows/scheduled_install_settings'

      -  added the new 'AUTO_INSTALL_AND_NOTIFY_RESTART' enum value to the request property '/allOf[#/components/schemas/blueprints_BlueprintV2]/settings/windows/auto_update_settings/auto_update_type'

      -  added the new 'AUTO_INSTALL_AND_RESTART_FORCED' enum value to the request property '/allOf[#/components/schemas/blueprints_BlueprintV2]/settings/windows/auto_update_settings/auto_update_type'

      -  added the new 'NOTIFY_DOWNLOAD' enum value to the request property '/allOf[#/components/schemas/blueprints_BlueprintV2]/settings/windows/auto_update_settings/auto_update_type'

      -  added the new 'SCHEDULED_INSTALL_AND_RESTART' enum value to the request property '/allOf[#/components/schemas/blueprints_BlueprintV2]/settings/windows/auto_update_settings/auto_update_type'

      -  added the new 'TENANT_WINDOWS_UWP' enum value to the request property '/allOf[#/components/schemas/blueprints_BlueprintV2]/settings/windows/apps/items/app_type'

      -  added the optional property 'content/settings/windows/custom_policies' to the response with the '200' status

      -  added the optional property 'content/settings/windows/scheduled_install_settings' to the response with the '200' status


    - **GET /v2/blueprints/{blueprint_id}/versions/**

      - ⚠️ added the new 'AUTO_INSTALL_AND_NOTIFY_RESTART' enum value to the 'content/results/items/settings/windows/auto_update_settings/auto_update_type' response property for the response status '200'

      - ⚠️ added the new 'AUTO_INSTALL_AND_RESTART_FORCED' enum value to the 'content/results/items/settings/windows/auto_update_settings/auto_update_type' response property for the response status '200'

      - ⚠️ added the new 'NOTIFY_DOWNLOAD' enum value to the 'content/results/items/settings/windows/auto_update_settings/auto_update_type' response property for the response status '200'

      - ⚠️ added the new 'SCHEDULED_INSTALL_AND_RESTART' enum value to the 'content/results/items/settings/windows/auto_update_settings/auto_update_type' response property for the response status '200'

      - ⚠️ added the new 'TENANT_WINDOWS_UWP' enum value to the 'content/results/items/settings/windows/apps/items/app_type' response property for the response status '200'

      -  added the optional property 'content/results/items/settings/windows/custom_policies' to the response with the '200' status

      -  added the optional property 'content/results/items/settings/windows/scheduled_install_settings' to the response with the '200' status


    - **GET /v2/blueprints/{blueprint_id}/versions/{version_id}/**

      - ⚠️ added the new 'AUTO_INSTALL_AND_NOTIFY_RESTART' enum value to the 'content/settings/windows/auto_update_settings/auto_update_type' response property for the response status '200'

      - ⚠️ added the new 'AUTO_INSTALL_AND_RESTART_FORCED' enum value to the 'content/settings/windows/auto_update_settings/auto_update_type' response property for the response status '200'

      - ⚠️ added the new 'NOTIFY_DOWNLOAD' enum value to the 'content/settings/windows/auto_update_settings/auto_update_type' response property for the response status '200'

      - ⚠️ added the new 'SCHEDULED_INSTALL_AND_RESTART' enum value to the 'content/settings/windows/auto_update_settings/auto_update_type' response property for the response status '200'

      - ⚠️ added the new 'TENANT_WINDOWS_UWP' enum value to the 'content/settings/windows/apps/items/app_type' response property for the response status '200'

      -  added the optional property 'content/settings/windows/custom_policies' to the response with the '200' status

      -  added the optional property 'content/settings/windows/scheduled_install_settings' to the response with the '200' status


    - **GET /v2/devices/**

      - ⚠️ added the new 'TENANT_WINDOWS_UWP' enum value to the 'content/oneOf[#/components/schemas/device_CursorPaginatedDeviceList]/results/items/oneOf[#/components/schemas/device_AndroidDeviceV2]/app_mode_meta/app_type' response property for the response status '200'

      - ⚠️ added the new 'TENANT_WINDOWS_UWP' enum value to the 'content/oneOf[#/components/schemas/device_CursorPaginatedDeviceList]/results/items/oneOf[#/components/schemas/device_AppleDeviceV2]/app_mode_meta/app_type' response property for the response status '200'

      - ⚠️ added the new 'TENANT_WINDOWS_UWP' enum value to the 'content/oneOf[#/components/schemas/device_CursorPaginatedDeviceList]/results/items/oneOf[#/components/schemas/device_WindowsDeviceV2]/app_mode_meta/app_type' response property for the response status '200'

      - ⚠️ added the new 'TENANT_WINDOWS_UWP' enum value to the 'content/oneOf[#/components/schemas/device_OffsetPaginatedDeviceList]/results/items/oneOf[#/components/schemas/device_AndroidDeviceV2]/app_mode_meta/app_type' response property for the response status '200'

      - ⚠️ added the new 'TENANT_WINDOWS_UWP' enum value to the 'content/oneOf[#/components/schemas/device_OffsetPaginatedDeviceList]/results/items/oneOf[#/components/schemas/device_AppleDeviceV2]/app_mode_meta/app_type' response property for the response status '200'

      - ⚠️ added the new 'TENANT_WINDOWS_UWP' enum value to the 'content/oneOf[#/components/schemas/device_OffsetPaginatedDeviceList]/results/items/oneOf[#/components/schemas/device_WindowsDeviceV2]/app_mode_meta/app_type' response property for the response status '200'

      -  added the new optional 'query' request parameter 'fields'


    - **GET /v2/devices/{deviceId}/device-apps/**

      - ⚠️ added the new 'TENANT_WINDOWS_UWP' enum value to the 'results/items/app_type' response property for the response status '200'

      -  added the new enum value 'TENANT_WINDOWS_UWP' to the 'query' request parameter 'app type'


    - **GET /v2/devices/{id}**

      - ⚠️ added the new 'TENANT_WINDOWS_UWP' enum value to the 'content/oneOf[#/components/schemas/device_AndroidDeviceV2]/app_mode_meta/app_type' response property for the response status '200'

      - ⚠️ added the new 'TENANT_WINDOWS_UWP' enum value to the 'content/oneOf[#/components/schemas/device_AppleDeviceV2]/app_mode_meta/app_type' response property for the response status '200'

      - ⚠️ added the new 'TENANT_WINDOWS_UWP' enum value to the 'content/oneOf[#/components/schemas/device_WindowsDeviceV2]/app_mode_meta/app_type' response property for the response status '200'


    - **GET /v2/tenant-apps/{appId}/versions** - ⚠️ added the new
    'TENANT_WINDOWS_UWP' enum value to the
    'content/results/items/oneOf[#/components/schemas/apps_management_TenantAppVersionResponse]/app_type'
    response property for the response status '200'

    - **DELETE /v2/tenant-apps/{appId}/versions/{versionId}** - ⚠️ added the new
    'TENANT_WINDOWS_UWP' enum value to the 'content/app_type' response property
    for the response status '200'

    - **GET /v2/tenant-apps/{appId}/versions/{versionId}**

      - ⚠️ added the new 'TENANT_WINDOWS_UWP' enum value to the 'content/allOf[#/components/schemas/apps_management_TenantAppVersionResponse]/app_type' response property for the response status '200'

      -  added the optional property 'content/allOf[subschema #2]/architecture' to the response with the '200' status

      -  added the optional property 'content/allOf[subschema #2]/artifacts' to the response with the '200' status

      -  added the optional property 'content/allOf[subschema #2]/aumids' to the response with the '200' status

      -  added the optional property 'content/allOf[subschema #2]/entry_point_type' to the response with the '200' status

      -  added the optional property 'content/allOf[subschema #2]/identity_name' to the response with the '200' status

      -  added the optional property 'content/allOf[subschema #2]/package_family_name' to the response with the '200' status

      -  added the optional property 'content/allOf[subschema #2]/package_format' to the response with the '200' status

      -  added the optional property 'content/allOf[subschema #2]/publisher' to the response with the '200' status


    - **PUT /v2/tenant-apps/{appId}/versions/{versionId}** - ⚠️ added the new
    'TENANT_WINDOWS_UWP' enum value to the 'content/app_type' response property
    for the response status '200'

    ---


    **DevRel 193 [2026-07-09]**


    ➕ Added


    - **GET /v2/oem-config-schema** -  endpoint added


    **✏️ Updated**


    - **GET /commands/v0/commands/**

      - ⚠️ added the new 'SET_OS_UPDATE_POLICY' enum value to the 'content/results/items/command' response property for the response status '200'

      -  added the optional property 'content/results/items/command_args/auto_update_type' to the response with the '200' status


    - **POST /commands/v0/commands/**

      - ⚠️ added the new 'SET_OS_UPDATE_POLICY' enum value to the 'content/command' response property for the response status '201'

      -  added the new optional request property 'command_args/auto_update_type'

      -  added the new 'SET_OS_UPDATE_POLICY' enum value to the request property 'command'

      -  added the optional property 'content/command_args/auto_update_type' to the response with the '201' status


    - **GET /commands/v0/commands/{id}/**

      - ⚠️ added the new 'SET_OS_UPDATE_POLICY' enum value to the 'content/command' response property for the response status '200'

      -  added the optional property 'content/command_args/auto_update_type' to the response with the '200' status


    - **GET /device/v0/devices/**

      - ⚠️ added the new 'GOOGLE_ANDROID' enum value to the 'content/results/items/oneOf[#/components/schemas/device_AppleDevice]/app_mode_meta/app_type' response property for the response status '200'

      - ⚠️ added the new 'GOOGLE_ANDROID' enum value to the 'content/results/items/oneOf[#/components/schemas/device_WindowsDevice]/app_mode_meta/app_type' response property for the response status '200'

      - ⚠️ added the new 'PRELOADED_ANDROID' enum value to the 'content/results/items/oneOf[#/components/schemas/device_AppleDevice]/app_mode_meta/app_type' response property for the response status '200'

      - ⚠️ added the new 'PRELOADED_ANDROID' enum value to the 'content/results/items/oneOf[#/components/schemas/device_WindowsDevice]/app_mode_meta/app_type' response property for the response status '200'

      - ⚠️ added the new 'TENANT_ANDROID' enum value to the 'content/results/items/oneOf[#/components/schemas/device_AppleDevice]/app_mode_meta/app_type' response property for the response status '200'

      - ⚠️ added the new 'TENANT_ANDROID' enum value to the 'content/results/items/oneOf[#/components/schemas/device_WindowsDevice]/app_mode_meta/app_type' response property for the response status '200'


    - **DELETE /device/v0/devices/{id}/**

      - ⚠️ added the new 'GOOGLE_ANDROID' enum value to the 'content/oneOf[#/components/schemas/device_AppleDevice]/app_mode_meta/app_type' response property for the response status '200'

      - ⚠️ added the new 'GOOGLE_ANDROID' enum value to the 'content/oneOf[#/components/schemas/device_WindowsDevice]/app_mode_meta/app_type' response property for the response status '200'

      - ⚠️ added the new 'PRELOADED_ANDROID' enum value to the 'content/oneOf[#/components/schemas/device_AppleDevice]/app_mode_meta/app_type' response property for the response status '200'

      - ⚠️ added the new 'PRELOADED_ANDROID' enum value to the 'content/oneOf[#/components/schemas/device_WindowsDevice]/app_mode_meta/app_type' response property for the response status '200'

      - ⚠️ added the new 'TENANT_ANDROID' enum value to the 'content/oneOf[#/components/schemas/device_AppleDevice]/app_mode_meta/app_type' response property for the response status '200'

      - ⚠️ added the new 'TENANT_ANDROID' enum value to the 'content/oneOf[#/components/schemas/device_WindowsDevice]/app_mode_meta/app_type' response property for the response status '200'


    - **GET /device/v0/devices/{id}/**

      - ⚠️ added the new 'GOOGLE_ANDROID' enum value to the 'content/oneOf[#/components/schemas/device_AppleDevice]/app_mode_meta/app_type' response property for the response status '200'

      - ⚠️ added the new 'GOOGLE_ANDROID' enum value to the 'content/oneOf[#/components/schemas/device_WindowsDevice]/app_mode_meta/app_type' response property for the response status '200'

      - ⚠️ added the new 'PRELOADED_ANDROID' enum value to the 'content/oneOf[#/components/schemas/device_AppleDevice]/app_mode_meta/app_type' response property for the response status '200'

      - ⚠️ added the new 'PRELOADED_ANDROID' enum value to the 'content/oneOf[#/components/schemas/device_WindowsDevice]/app_mode_meta/app_type' response property for the response status '200'

      - ⚠️ added the new 'TENANT_ANDROID' enum value to the 'content/oneOf[#/components/schemas/device_AppleDevice]/app_mode_meta/app_type' response property for the response status '200'

      - ⚠️ added the new 'TENANT_ANDROID' enum value to the 'content/oneOf[#/components/schemas/device_WindowsDevice]/app_mode_meta/app_type' response property for the response status '200'


    - **POST /tenant/v0/depprofiles/**

      - ⚠️ removed the enum value 'WebContentFiltering' of the request property 'show_setup_items/items/'

      -  added the new 'AccessibilityAppearance' enum value to the request property 'show_setup_items/items/'

      -  added the new 'DisplayTone' enum value to the request property 'show_setup_items/items/'

      -  added the new 'HomeButtonSensitivity' enum value to the request property 'show_setup_items/items/'

      -  added the new 'LiquidGlass' enum value to the request property 'show_setup_items/items/'

      -  added the new 'OnBoarding' enum value to the request property 'show_setup_items/items/'


    - **GET /v2/blueprints/** -  added the optional property
    'content/results/items/settings/android/advanced_configurations' to the
    response with the '200' status

    - **POST /v2/blueprints/**

      -  added the new optional request property 'settings/android/advanced_configurations'

      -  added the optional property 'content/settings/android/advanced_configurations' to the response with the '201' status


    - **DELETE /v2/blueprints/{blueprint_id}/** -  added the optional property
    'content/settings/android/advanced_configurations' to the response with the
    '204' status

    - **GET /v2/blueprints/{blueprint_id}/** -  added the optional property
    'content/settings/android/advanced_configurations' to the response with the
    '200' status

    - **PUT /v2/blueprints/{blueprint_id}/**

      -  added the new optional request property '/allOf[#/components/schemas/blueprints_BlueprintV2]/settings/android/advanced_configurations'

      -  added the optional property 'content/settings/android/advanced_configurations' to the response with the '200' status


    - **GET /v2/blueprints/{blueprint_id}/versions/** -  added the optional
    property 'content/results/items/settings/android/advanced_configurations' to
    the response with the '200' status

    - **GET /v2/blueprints/{blueprint_id}/versions/{version_id}/** -  added the
    optional property 'content/settings/android/advanced_configurations' to the
    response with the '200' status

    - **GET /v2/devices/**

      - ⚠️ added the new 'GOOGLE_ANDROID' enum value to the 'content/oneOf[#/components/schemas/device_CursorPaginatedDeviceList]/results/items/oneOf[#/components/schemas/device_AppleDeviceV2]/app_mode_meta/app_type' response property for the response status '200'

      - ⚠️ added the new 'GOOGLE_ANDROID' enum value to the 'content/oneOf[#/components/schemas/device_CursorPaginatedDeviceList]/results/items/oneOf[#/components/schemas/device_WindowsDeviceV2]/app_mode_meta/app_type' response property for the response status '200'

      - ⚠️ added the new 'GOOGLE_ANDROID' enum value to the 'content/oneOf[#/components/schemas/device_OffsetPaginatedDeviceList]/results/items/oneOf[#/components/schemas/device_AppleDeviceV2]/app_mode_meta/app_type' response property for the response status '200'

      - ⚠️ added the new 'GOOGLE_ANDROID' enum value to the 'content/oneOf[#/components/schemas/device_OffsetPaginatedDeviceList]/results/items/oneOf[#/components/schemas/device_WindowsDeviceV2]/app_mode_meta/app_type' response property for the response status '200'

      - ⚠️ added the new 'PRELOADED_ANDROID' enum value to the 'content/oneOf[#/components/schemas/device_CursorPaginatedDeviceList]/results/items/oneOf[#/components/schemas/device_AppleDeviceV2]/app_mode_meta/app_type' response property for the response status '200'

      - ⚠️ added the new 'PRELOADED_ANDROID' enum value to the 'content/oneOf[#/components/schemas/device_CursorPaginatedDeviceList]/results/items/oneOf[#/components/schemas/device_WindowsDeviceV2]/app_mode_meta/app_type' response property for the response status '200'

      - ⚠️ added the new 'PRELOADED_ANDROID' enum value to the 'content/oneOf[#/components/schemas/device_OffsetPaginatedDeviceList]/results/items/oneOf[#/components/schemas/device_AppleDeviceV2]/app_mode_meta/app_type' response property for the response status '200'

      - ⚠️ added the new 'PRELOADED_ANDROID' enum value to the 'content/oneOf[#/components/schemas/device_OffsetPaginatedDeviceList]/results/items/oneOf[#/components/schemas/device_WindowsDeviceV2]/app_mode_meta/app_type' response property for the response status '200'

      - ⚠️ added the new 'TENANT_ANDROID' enum value to the 'content/oneOf[#/components/schemas/device_CursorPaginatedDeviceList]/results/items/oneOf[#/components/schemas/device_AppleDeviceV2]/app_mode_meta/app_type' response property for the response status '200'

      - ⚠️ added the new 'TENANT_ANDROID' enum value to the 'content/oneOf[#/components/schemas/device_CursorPaginatedDeviceList]/results/items/oneOf[#/components/schemas/device_WindowsDeviceV2]/app_mode_meta/app_type' response property for the response status '200'

      - ⚠️ added the new 'TENANT_ANDROID' enum value to the 'content/oneOf[#/components/schemas/device_OffsetPaginatedDeviceList]/results/items/oneOf[#/components/schemas/device_AppleDeviceV2]/app_mode_meta/app_type' response property for the response status '200'

      - ⚠️ added the new 'TENANT_ANDROID' enum value to the 'content/oneOf[#/components/schemas/device_OffsetPaginatedDeviceList]/results/items/oneOf[#/components/schemas/device_WindowsDeviceV2]/app_mode_meta/app_type' response property for the response status '200'

      -  added the optional property 'content/oneOf[#/components/schemas/device_CursorPaginatedDeviceList]/results/items/oneOf[#/components/schemas/device_AndroidDeviceV2]/app_mode_meta' to the response with the '200' status

      -  added the optional property 'content/oneOf[#/components/schemas/device_OffsetPaginatedDeviceList]/results/items/oneOf[#/components/schemas/device_AndroidDeviceV2]/app_mode_meta' to the response with the '200' status


    - **GET /v2/devices/{id}**

      - ⚠️ added the new 'GOOGLE_ANDROID' enum value to the 'content/oneOf[#/components/schemas/device_AppleDeviceV2]/app_mode_meta/app_type' response property for the response status '200'

      - ⚠️ added the new 'GOOGLE_ANDROID' enum value to the 'content/oneOf[#/components/schemas/device_WindowsDeviceV2]/app_mode_meta/app_type' response property for the response status '200'

      - ⚠️ added the new 'PRELOADED_ANDROID' enum value to the 'content/oneOf[#/components/schemas/device_AppleDeviceV2]/app_mode_meta/app_type' response property for the response status '200'

      - ⚠️ added the new 'PRELOADED_ANDROID' enum value to the 'content/oneOf[#/components/schemas/device_WindowsDeviceV2]/app_mode_meta/app_type' response property for the response status '200'

      - ⚠️ added the new 'TENANT_ANDROID' enum value to the 'content/oneOf[#/components/schemas/device_AppleDeviceV2]/app_mode_meta/app_type' response property for the response status '200'

      - ⚠️ added the new 'TENANT_ANDROID' enum value to the 'content/oneOf[#/components/schemas/device_WindowsDeviceV2]/app_mode_meta/app_type' response property for the response status '200'

      -  added the optional property 'content/oneOf[#/components/schemas/device_AndroidDeviceV2]/app_mode_meta' to the response with the '200' status


    - **POST /v2/itunesapps/{appleAppId}/refresh-version** - ⚠️ for the 'path'
    request parameter 'appleAppId', the type/format was changed from 'string'/''
    to 'string'/'uuid'

    ---


    **DevRel 192 [2026-06-22]**


    **✏️ Updated**


    - **GET /commands/v0/commands/** -  added the optional property
    'content/results/items/command_args/disable_screen_timeout' to the response
    with the '200' status

    - **POST /commands/v0/commands/**

      -  added the new optional request property 'command_args/disable_screen_timeout'

      -  added the optional property 'content/command_args/disable_screen_timeout' to the response with the '201' status


    - **GET /commands/v0/commands/{id}/** -  added the optional property
    'content/command_args/disable_screen_timeout' to the response with the '200'
    status

    - **GET /device/v0/devices/**

      -  added the optional property 'content/results/items/oneOf[#/components/schemas/device_AppleDevice]/app_mode_meta/disable_screen_timeout' to the response with the '200' status

      -  added the optional property 'content/results/items/oneOf[#/components/schemas/device_WindowsDevice]/app_mode_meta/disable_screen_timeout' to the response with the '200' status


    - **DELETE /device/v0/devices/{id}/**

      -  added the optional property 'content/oneOf[#/components/schemas/device_AppleDevice]/app_mode_meta/disable_screen_timeout' to the response with the '200' status

      -  added the optional property 'content/oneOf[#/components/schemas/device_WindowsDevice]/app_mode_meta/disable_screen_timeout' to the response with the '200' status


    - **GET /device/v0/devices/{id}/**

      -  added the optional property 'content/oneOf[#/components/schemas/device_AppleDevice]/app_mode_meta/disable_screen_timeout' to the response with the '200' status

      -  added the optional property 'content/oneOf[#/components/schemas/device_WindowsDevice]/app_mode_meta/disable_screen_timeout' to the response with the '200' status


    - **GET /v2/blueprints/** -  added the optional property
    'content/results/items/settings/ios/kiosk_app/disable_screen_timeout' to the
    response with the '200' status

    - **POST /v2/blueprints/**

      -  added the new optional request property 'settings/ios/kiosk_app/disable_screen_timeout'

      -  added the optional property 'content/settings/ios/kiosk_app/disable_screen_timeout' to the response with the '201' status


    - **DELETE /v2/blueprints/{blueprint_id}/** -  added the optional property
    'content/settings/ios/kiosk_app/disable_screen_timeout' to the response with
    the '204' status

    - **GET /v2/blueprints/{blueprint_id}/** -  added the optional property
    'content/settings/ios/kiosk_app/disable_screen_timeout' to the response with
    the '200' status

    - **PUT /v2/blueprints/{blueprint_id}/**

      -  added the new optional request property '/allOf[#/components/schemas/blueprints_BlueprintV2]/settings/ios/kiosk_app/disable_screen_timeout'

      -  added the optional property 'content/settings/ios/kiosk_app/disable_screen_timeout' to the response with the '200' status


    - **GET /v2/blueprints/{blueprint_id}/versions/** -  added the optional
    property
    'content/results/items/settings/ios/kiosk_app/disable_screen_timeout' to the
    response with the '200' status

    - **GET /v2/blueprints/{blueprint_id}/versions/{version_id}/** -  added the
    optional property 'content/settings/ios/kiosk_app/disable_screen_timeout' to
    the response with the '200' status

    - **GET /v2/devices/**

      -  added the optional property 'content/oneOf[#/components/schemas/device_CursorPaginatedDeviceList]/results/items/oneOf[#/components/schemas/device_AppleDeviceV2]/app_mode_meta/disable_screen_timeout' to the response with the '200' status

      -  added the optional property 'content/oneOf[#/components/schemas/device_CursorPaginatedDeviceList]/results/items/oneOf[#/components/schemas/device_WindowsDeviceV2]/app_mode_meta/disable_screen_timeout' to the response with the '200' status

      -  added the optional property 'content/oneOf[#/components/schemas/device_OffsetPaginatedDeviceList]/results/items/oneOf[#/components/schemas/device_AppleDeviceV2]/app_mode_meta/disable_screen_timeout' to the response with the '200' status

      -  added the optional property 'content/oneOf[#/components/schemas/device_OffsetPaginatedDeviceList]/results/items/oneOf[#/components/schemas/device_WindowsDeviceV2]/app_mode_meta/disable_screen_timeout' to the response with the '200' status


    - **GET /v2/devices/{id}**

      -  added the optional property 'content/oneOf[#/components/schemas/device_AppleDeviceV2]/app_mode_meta/disable_screen_timeout' to the response with the '200' status

      -  added the optional property 'content/oneOf[#/components/schemas/device_WindowsDeviceV2]/app_mode_meta/disable_screen_timeout' to the response with the '200' status


    ---


    **DevRel 191 [2026-06-12]**


    ➕ Added


    - **POST /v2/itunesapps/{appleAppId}/refresh-version** -  endpoint added


    **✏️ Updated**


    - **GET /commands/v0/commands/**

      - ⚠️ added the new 'ENFORCE_OS_UPDATE_SETTINGS' enum value to the 'content/results/items/command' response property for the response status '200'

      - ⚠️ added the new 'ENFORCE_SOFTWARE_UPDATE' enum value to the 'content/results/items/command' response property for the response status '200'

      -  added the optional property 'content/results/items/command_args/allow_standard_user_os_updates' to the response with the '200' status

      -  added the optional property 'content/results/items/command_args/automatic_actions' to the response with the '200' status

      -  added the optional property 'content/results/items/command_args/deferrals' to the response with the '200' status

      -  added the optional property 'content/results/items/command_args/disable_device_rotation' to the response with the '200' status

      -  added the optional property 'content/results/items/command_args/notifications' to the response with the '200' status

      -  added the optional property 'content/results/items/command_args/rapid_security_response' to the response with the '200' status

      -  added the optional property 'content/results/items/command_args/recommended_cadence' to the response with the '200' status

      -  added the optional property 'content/results/items/command_args/target_local_date_time' to the response with the '200' status

      -  added the optional property 'content/results/items/command_args/target_os_version' to the response with the '200' status


    - **POST /commands/v0/commands/**

      - ⚠️ added the new 'ENFORCE_OS_UPDATE_SETTINGS' enum value to the 'content/command' response property for the response status '201'

      - ⚠️ added the new 'ENFORCE_SOFTWARE_UPDATE' enum value to the 'content/command' response property for the response status '201'

      -  added the new optional request property 'command_args/allow_standard_user_os_updates'

      -  added the new optional request property 'command_args/automatic_actions'

      -  added the new optional request property 'command_args/deferrals'

      -  added the new optional request property 'command_args/disable_device_rotation'

      -  added the new optional request property 'command_args/notifications'

      -  added the new optional request property 'command_args/rapid_security_response'

      -  added the new optional request property 'command_args/recommended_cadence'

      -  added the new optional request property 'command_args/target_local_date_time'

      -  added the new optional request property 'command_args/target_os_version'

      -  added the new 'ENFORCE_OS_UPDATE_SETTINGS' enum value to the request property 'command'

      -  added the new 'ENFORCE_SOFTWARE_UPDATE' enum value to the request property 'command'

      -  added the optional property 'content/command_args/allow_standard_user_os_updates' to the response with the '201' status

      -  added the optional property 'content/command_args/automatic_actions' to the response with the '201' status

      -  added the optional property 'content/command_args/deferrals' to the response with the '201' status

      -  added the optional property 'content/command_args/disable_device_rotation' to the response with the '201' status

      -  added the optional property 'content/command_args/notifications' to the response with the '201' status

      -  added the optional property 'content/command_args/rapid_security_response' to the response with the '201' status

      -  added the optional property 'content/command_args/recommended_cadence' to the response with the '201' status

      -  added the optional property 'content/command_args/target_local_date_time' to the response with the '201' status

      -  added the optional property 'content/command_args/target_os_version' to the response with the '201' status


    - **GET /commands/v0/commands/{id}/**

      - ⚠️ added the new 'ENFORCE_OS_UPDATE_SETTINGS' enum value to the 'content/command' response property for the response status '200'

      - ⚠️ added the new 'ENFORCE_SOFTWARE_UPDATE' enum value to the 'content/command' response property for the response status '200'

      -  added the optional property 'content/command_args/allow_standard_user_os_updates' to the response with the '200' status

      -  added the optional property 'content/command_args/automatic_actions' to the response with the '200' status

      -  added the optional property 'content/command_args/deferrals' to the response with the '200' status

      -  added the optional property 'content/command_args/disable_device_rotation' to the response with the '200' status

      -  added the optional property 'content/command_args/notifications' to the response with the '200' status

      -  added the optional property 'content/command_args/rapid_security_response' to the response with the '200' status

      -  added the optional property 'content/command_args/recommended_cadence' to the response with the '200' status

      -  added the optional property 'content/command_args/target_local_date_time' to the response with the '200' status

      -  added the optional property 'content/command_args/target_os_version' to the response with the '200' status


    - **GET /device/v0/devices/**

      - ⚠️ added the new 'TENANT_WINDOWS_EXE' enum value to the 'content/results/items/oneOf[#/components/schemas/device_AppleDevice]/app_mode_meta/app_type' response property for the response status '200'

      - ⚠️ added the new 'TENANT_WINDOWS_EXE' enum value to the 'content/results/items/oneOf[#/components/schemas/device_WindowsDevice]/app_mode_meta/app_type' response property for the response status '200'

      -  added the optional property 'content/results/items/oneOf[#/components/schemas/device_AppleDevice]/app_mode_meta/disable_device_rotation' to the response with the '200' status

      -  added the optional property 'content/results/items/oneOf[#/components/schemas/device_WindowsDevice]/app_mode_meta/disable_device_rotation' to the response with the '200' status

      -  added 'subschema #1, subschema #2, subschema #3' to the 'content/results/items/oneOf[#/components/schemas/device_AppleDevice]/app_mode_meta' response property 'anyOf' list for the response status '200'

      -  added 'subschema #1, subschema #2, subschema #3' to the 'content/results/items/oneOf[#/components/schemas/device_WindowsDevice]/app_mode_meta' response property 'anyOf' list for the response status '200'


    - **DELETE /device/v0/devices/{id}/**

      - ⚠️ added the new 'TENANT_WINDOWS_EXE' enum value to the 'content/oneOf[#/components/schemas/device_AppleDevice]/app_mode_meta/app_type' response property for the response status '200'

      - ⚠️ added the new 'TENANT_WINDOWS_EXE' enum value to the 'content/oneOf[#/components/schemas/device_WindowsDevice]/app_mode_meta/app_type' response property for the response status '200'

      -  added the optional property 'content/oneOf[#/components/schemas/device_AppleDevice]/app_mode_meta/disable_device_rotation' to the response with the '200' status

      -  added the optional property 'content/oneOf[#/components/schemas/device_WindowsDevice]/app_mode_meta/disable_device_rotation' to the response with the '200' status

      -  added 'subschema #1, subschema #2, subschema #3' to the 'content/oneOf[#/components/schemas/device_AppleDevice]/app_mode_meta' response property 'anyOf' list for the response status '200'

      -  added 'subschema #1, subschema #2, subschema #3' to the 'content/oneOf[#/components/schemas/device_WindowsDevice]/app_mode_meta' response property 'anyOf' list for the response status '200'


    - **GET /device/v0/devices/{id}/**

      - ⚠️ added the new 'TENANT_WINDOWS_EXE' enum value to the 'content/oneOf[#/components/schemas/device_AppleDevice]/app_mode_meta/app_type' response property for the response status '200'

      - ⚠️ added the new 'TENANT_WINDOWS_EXE' enum value to the 'content/oneOf[#/components/schemas/device_WindowsDevice]/app_mode_meta/app_type' response property for the response status '200'

      -  added the optional property 'content/oneOf[#/components/schemas/device_AppleDevice]/app_mode_meta/disable_device_rotation' to the response with the '200' status

      -  added the optional property 'content/oneOf[#/components/schemas/device_WindowsDevice]/app_mode_meta/disable_device_rotation' to the response with the '200' status

      -  added 'subschema #1, subschema #2, subschema #3' to the 'content/oneOf[#/components/schemas/device_AppleDevice]/app_mode_meta' response property 'anyOf' list for the response status '200'

      -  added 'subschema #1, subschema #2, subschema #3' to the 'content/oneOf[#/components/schemas/device_WindowsDevice]/app_mode_meta' response property 'anyOf' list for the response status '200'


    - **GET /v2/blueprints/**

      - ⚠️ added the new 'TENANT_WINDOWS_EXE' enum value to the 'content/results/items/settings/windows/apps/items/app_type' response property for the response status '200'

      -  added the optional property 'content/results/items/settings/ios/apps/items/auto_update' to the response with the '200' status

      -  added the optional property 'content/results/items/settings/ios/kiosk_app/disable_device_rotation' to the response with the '200' status

      -  added the optional property 'content/results/items/settings/ios/strict_wifi_synchronization_settings' to the response with the '200' status

      -  added the optional property 'content/results/items/settings/tvos/apps/items/auto_update' to the response with the '200' status

      -  added the optional property 'content/results/items/settings/tvos/strict_wifi_synchronization_settings' to the response with the '200' status


    - **POST /v2/blueprints/**

      - ⚠️ added the new 'TENANT_WINDOWS_EXE' enum value to the 'content/settings/windows/apps/items/app_type' response property for the response status '201'

      -  added the new optional request property 'settings/ios/apps/items/auto_update'

      -  added the new optional request property 'settings/ios/kiosk_app/disable_device_rotation'

      -  added the new optional request property 'settings/ios/strict_wifi_synchronization_settings'

      -  added the new optional request property 'settings/tvos/apps/items/auto_update'

      -  added the new optional request property 'settings/tvos/strict_wifi_synchronization_settings'

      -  added the new 'TENANT_WINDOWS_EXE' enum value to the request property 'settings/windows/apps/items/app_type'

      -  added the optional property 'content/settings/ios/apps/items/auto_update' to the response with the '201' status

      -  added the optional property 'content/settings/ios/kiosk_app/disable_device_rotation' to the response with the '201' status

      -  added the optional property 'content/settings/ios/strict_wifi_synchronization_settings' to the response with the '201' status

      -  added the optional property 'content/settings/tvos/apps/items/auto_update' to the response with the '201' status

      -  added the optional property 'content/settings/tvos/strict_wifi_synchronization_settings' to the response with the '201' status


    - **DELETE /v2/blueprints/{blueprint_id}/**

      - ⚠️ added the new 'TENANT_WINDOWS_EXE' enum value to the 'content/settings/windows/apps/items/app_type' response property for the response status '204'

      -  added the optional property 'content/settings/ios/apps/items/auto_update' to the response with the '204' status

      -  added the optional property 'content/settings/ios/kiosk_app/disable_device_rotation' to the response with the '204' status

      -  added the optional property 'content/settings/ios/strict_wifi_synchronization_settings' to the response with the '204' status

      -  added the optional property 'content/settings/tvos/apps/items/auto_update' to the response with the '204' status

      -  added the optional property 'content/settings/tvos/strict_wifi_synchronization_settings' to the response with the '204' status


    - **GET /v2/blueprints/{blueprint_id}/**

      - ⚠️ added the new 'TENANT_WINDOWS_EXE' enum value to the 'content/settings/windows/apps/items/app_type' response property for the response status '200'

      -  added the optional property 'content/settings/ios/apps/items/auto_update' to the response with the '200' status

      -  added the optional property 'content/settings/ios/kiosk_app/disable_device_rotation' to the response with the '200' status

      -  added the optional property 'content/settings/ios/strict_wifi_synchronization_settings' to the response with the '200' status

      -  added the optional property 'content/settings/tvos/apps/items/auto_update' to the response with the '200' status

      -  added the optional property 'content/settings/tvos/strict_wifi_synchronization_settings' to the response with the '200' status


    - **PUT /v2/blueprints/{blueprint_id}/**

      - ⚠️ added the new 'TENANT_WINDOWS_EXE' enum value to the 'content/settings/windows/apps/items/app_type' response property for the response status '200'

      -  added the new optional request property '/allOf[#/components/schemas/blueprints_BlueprintV2]/settings/ios/apps/items/auto_update'

      -  added the new optional request property '/allOf[#/components/schemas/blueprints_BlueprintV2]/settings/ios/kiosk_app/disable_device_rotation'

      -  added the new optional request property '/allOf[#/components/schemas/blueprints_BlueprintV2]/settings/ios/strict_wifi_synchronization_settings'

      -  added the new optional request property '/allOf[#/components/schemas/blueprints_BlueprintV2]/settings/tvos/apps/items/auto_update'

      -  added the new optional request property '/allOf[#/components/schemas/blueprints_BlueprintV2]/settings/tvos/strict_wifi_synchronization_settings'

      -  added the new 'TENANT_WINDOWS_EXE' enum value to the request property '/allOf[#/components/schemas/blueprints_BlueprintV2]/settings/windows/apps/items/app_type'

      -  added the optional property 'content/settings/ios/apps/items/auto_update' to the response with the '200' status

      -  added the optional property 'content/settings/ios/kiosk_app/disable_device_rotation' to the response with the '200' status

      -  added the optional property 'content/settings/ios/strict_wifi_synchronization_settings' to the response with the '200' status

      -  added the optional property 'content/settings/tvos/apps/items/auto_update' to the response with the '200' status

      -  added the optional property 'content/settings/tvos/strict_wifi_synchronization_settings' to the response with the '200' status


    - **GET /v2/blueprints/{blueprint_id}/versions/**

      - ⚠️ added the new 'TENANT_WINDOWS_EXE' enum value to the 'content/results/items/settings/windows/apps/items/app_type' response property for the response status '200'

      -  added the optional property 'content/results/items/settings/ios/apps/items/auto_update' to the response with the '200' status

      -  added the optional property 'content/results/items/settings/ios/kiosk_app/disable_device_rotation' to the response with the '200' status

      -  added the optional property 'content/results/items/settings/ios/strict_wifi_synchronization_settings' to the response with the '200' status

      -  added the optional property 'content/results/items/settings/tvos/apps/items/auto_update' to the response with the '200' status

      -  added the optional property 'content/results/items/settings/tvos/strict_wifi_synchronization_settings' to the response with the '200' status


    - **GET /v2/blueprints/{blueprint_id}/versions/{version_id}/**

      - ⚠️ added the new 'TENANT_WINDOWS_EXE' enum value to the 'content/settings/windows/apps/items/app_type' response property for the response status '200'

      -  added the optional property 'content/settings/ios/apps/items/auto_update' to the response with the '200' status

      -  added the optional property 'content/settings/ios/kiosk_app/disable_device_rotation' to the response with the '200' status

      -  added the optional property 'content/settings/ios/strict_wifi_synchronization_settings' to the response with the '200' status

      -  added the optional property 'content/settings/tvos/apps/items/auto_update' to the response with the '200' status

      -  added the optional property 'content/settings/tvos/strict_wifi_synchronization_settings' to the response with the '200' status


    - **GET /v2/device-apps**

      -  added the new optional 'query' request parameter 'app_version_id_not'

      -  the 'query' request parameter 'app_id' became optional

      -  the 'query' request parameter 'app_version_id' became optional

      -  for the 'query' request parameter 'app_id', the type/format was generalized from 'integer'/'uuid' to 'string'/'uuid'

      -  for the 'query' request parameter 'app_version_id', the type/format was generalized from 'integer'/'uuid' to 'string'/'uuid'


    - **GET /v2/devices/**

      - ⚠️ added the new 'TENANT_WINDOWS_EXE' enum value to the 'content/oneOf[#/components/schemas/device_CursorPaginatedDeviceList]/results/items/oneOf[#/components/schemas/device_AppleDeviceV2]/app_mode_meta/app_type' response property for the response status '200'

      - ⚠️ added the new 'TENANT_WINDOWS_EXE' enum value to the 'content/oneOf[#/components/schemas/device_CursorPaginatedDeviceList]/results/items/oneOf[#/components/schemas/device_WindowsDeviceV2]/app_mode_meta/app_type' response property for the response status '200'

      - ⚠️ added the new 'TENANT_WINDOWS_EXE' enum value to the 'content/oneOf[#/components/schemas/device_OffsetPaginatedDeviceList]/results/items/oneOf[#/components/schemas/device_AppleDeviceV2]/app_mode_meta/app_type' response property for the response status '200'

      - ⚠️ added the new 'TENANT_WINDOWS_EXE' enum value to the 'content/oneOf[#/components/schemas/device_OffsetPaginatedDeviceList]/results/items/oneOf[#/components/schemas/device_WindowsDeviceV2]/app_mode_meta/app_type' response property for the response status '200'

      -  api tag 'device_Device' added

      -  api tag 'device_Device V2' removed

      -  added the optional property 'content/oneOf[#/components/schemas/device_CursorPaginatedDeviceList]/results/items/oneOf[#/components/schemas/device_AppleDeviceV2]/app_mode_meta/disable_device_rotation' to the response with the '200' status

      -  added the optional property 'content/oneOf[#/components/schemas/device_CursorPaginatedDeviceList]/results/items/oneOf[#/components/schemas/device_WindowsDeviceV2]/app_mode_meta/disable_device_rotation' to the response with the '200' status

      -  added the optional property 'content/oneOf[#/components/schemas/device_OffsetPaginatedDeviceList]/results/items/oneOf[#/components/schemas/device_AppleDeviceV2]/app_mode_meta/disable_device_rotation' to the response with the '200' status

      -  added the optional property 'content/oneOf[#/components/schemas/device_OffsetPaginatedDeviceList]/results/items/oneOf[#/components/schemas/device_WindowsDeviceV2]/app_mode_meta/disable_device_rotation' to the response with the '200' status

      -  added 'subschema #1, subschema #2, subschema #3' to the 'content/oneOf[#/components/schemas/device_CursorPaginatedDeviceList]/results/items/oneOf[#/components/schemas/device_AppleDeviceV2]/app_mode_meta' response property 'anyOf' list for the response status '200'

      -  added 'subschema #1, subschema #2, subschema #3' to the 'content/oneOf[#/components/schemas/device_CursorPaginatedDeviceList]/results/items/oneOf[#/components/schemas/device_WindowsDeviceV2]/app_mode_meta' response property 'anyOf' list for the response status '200'

      -  added 'subschema #1, subschema #2, subschema #3' to the 'content/oneOf[#/components/schemas/device_OffsetPaginatedDeviceList]/results/items/oneOf[#/components/schemas/device_AppleDeviceV2]/app_mode_meta' response property 'anyOf' list for the response status '200'

      -  added 'subschema #1, subschema #2, subschema #3' to the 'content/oneOf[#/components/schemas/device_OffsetPaginatedDeviceList]/results/items/oneOf[#/components/schemas/device_WindowsDeviceV2]/app_mode_meta' response property 'anyOf' list for the response status '200'


    - **GET /v2/devices/{deviceId}/device-apps/**

      - ⚠️ added the new 'TENANT_WINDOWS_EXE' enum value to the 'results/items/app_type' response property for the response status '200'

      -  added the new enum value 'TENANT_WINDOWS_EXE' to the 'query' request parameter 'app type'

      -  added the optional property 'results/items/auto_update' to the response with the '200' status


    - **GET /v2/devices/{id}**

      - ⚠️ added the new 'TENANT_WINDOWS_EXE' enum value to the 'content/oneOf[#/components/schemas/device_AppleDeviceV2]/app_mode_meta/app_type' response property for the response status '200'

      - ⚠️ added the new 'TENANT_WINDOWS_EXE' enum value to the 'content/oneOf[#/components/schemas/device_WindowsDeviceV2]/app_mode_meta/app_type' response property for the response status '200'

      -  api tag 'device_Device' added

      -  api tag 'device_Device V2' removed

      -  added the optional property 'content/oneOf[#/components/schemas/device_AppleDeviceV2]/app_mode_meta/disable_device_rotation' to the response with the '200' status

      -  added the optional property 'content/oneOf[#/components/schemas/device_WindowsDeviceV2]/app_mode_meta/disable_device_rotation' to the response with the '200' status

      -  added 'subschema #1, subschema #2, subschema #3' to the 'content/oneOf[#/components/schemas/device_AppleDeviceV2]/app_mode_meta' response property 'anyOf' list for the response status '200'

      -  added 'subschema #1, subschema #2, subschema #3' to the 'content/oneOf[#/components/schemas/device_WindowsDeviceV2]/app_mode_meta' response property 'anyOf' list for the response status '200'


    - **GET /v2/tenant-apps/{appId}/versions**

      - ⚠️ added the new 'TENANT_WINDOWS_EXE' enum value to the 'content/results/items/oneOf[#/components/schemas/apps_management_TenantAppVersionResponse]/app_type' response property for the response status '200'

      -  added the new optional 'query' request parameter 'app_type'

      -  added the new optional 'query' request parameter 'is_active'

      -  added the optional property 'content/results/items/oneOf[#/components/schemas/apps_management_TenantAppVersionResponse]/is_active' to the response with the '200' status

      -  added the optional property 'content/results/items/oneOf[#/components/schemas/apps_management_TenantAppVersionResponse]/success_criteria' to the response with the '200' status

      -  added the optional property 'content/results/items/oneOf[#/components/schemas/apps_management_TenantAppVersionResponse]/success_criteria_type' to the response with the '200' status


    - **DELETE /v2/tenant-apps/{appId}/versions/{versionId}**

      - ⚠️ added the new 'TENANT_WINDOWS_EXE' enum value to the 'content/app_type' response property for the response status '200'

      -  added the optional property 'content/is_active' to the response with the '200' status

      -  added the optional property 'content/success_criteria' to the response with the '200' status

      -  added the optional property 'content/success_criteria_type' to the response with the '200' status


    - **GET /v2/tenant-apps/{appId}/versions/{versionId}**

      - ⚠️ added the new 'TENANT_WINDOWS_EXE' enum value to the 'content/allOf[#/components/schemas/apps_management_TenantAppVersionResponse]/app_type' response property for the response status '200'

      -  added the optional property 'content/allOf[#/components/schemas/apps_management_TenantAppVersionResponse]/is_active' to the response with the '200' status

      -  added the optional property 'content/allOf[#/components/schemas/apps_management_TenantAppVersionResponse]/success_criteria' to the response with the '200' status

      -  added the optional property 'content/allOf[#/components/schemas/apps_management_TenantAppVersionResponse]/success_criteria_type' to the response with the '200' status

      -  added the optional property 'content/allOf[subschema #2]/install_script' to the response with the '200' status

      -  added the optional property 'content/allOf[subschema #2]/uninstall_script' to the response with the '200' status


    - **PUT /v2/tenant-apps/{appId}/versions/{versionId}**

      - ⚠️ added the new 'TENANT_WINDOWS_EXE' enum value to the 'content/app_type' response property for the response status '200'

      -  added the new optional request property 'exe_config'

      -  added the new optional request property 'version_name'

      -  added the optional property 'content/is_active' to the response with the '200' status

      -  added the optional property 'content/success_criteria' to the response with the '200' status

      -  added the optional property 'content/success_criteria_type' to the response with the '200' status


    ---


    **DevRel 190 [2026-05-28]**


    ➕ Added


    - **PUT /v2/devices/{id}/devicestate** -  endpoint added


    **✏️ Updated**


    - **PUT /authz2/v1/roles/{role_id}/scopes** -  added the new
    `create:device_command:CLEAR_APP_CACHE` enum value to the request property
    `scope_names/items/`


    - **GET /commands/v0/commands/**

      - ⚠️ added the new `CLEAR_APP_CACHE` enum value to the `content/results/items/command` response property for the response status `200`

      -  added the optional property `content/results/items/command_args/arguments` to the response with the `200` status


    - **POST /commands/v0/commands/**

      - ⚠️ added the new `CLEAR_APP_CACHE` enum value to the `content/command` response property for the response status `201`

      -  added the new optional request property `command_args/arguments`

      -  added the new `CLEAR_APP_CACHE` enum value to the request property `command`

      -  added the optional property `content/command_args/arguments` to the response with the `201` status


    - **GET /commands/v0/commands/{id}/**

      - ⚠️ added the new `CLEAR_APP_CACHE` enum value to the `content/command` response property for the response status `200`

      -  added the optional property `content/command_args/arguments` to the response with the `200` status


    - **GET /device/v0/devices/**

      -  added the optional property `content/results/items/oneOf[#/components/schemas/device_WindowsDevice]/hardware_info` to the response with the `200` status

      -  added the optional property `content/results/items/oneOf[#/components/schemas/device_WindowsDevice]/memory_info` to the response with the `200` status

      -  added the optional property `content/results/items/oneOf[#/components/schemas/device_WindowsDevice]/network_info` to the response with the `200` status

      -  added the optional property `content/results/items/oneOf[#/components/schemas/device_WindowsDevice]/software_info` to the response with the `200` status


    - **DELETE /device/v0/devices/{id}/**

      -  added the optional property `content/oneOf[#/components/schemas/device_WindowsDevice]/hardware_info` to the response with the `200` status

      -  added the optional property `content/oneOf[#/components/schemas/device_WindowsDevice]/memory_info` to the response with the `200` status

      -  added the optional property `content/oneOf[#/components/schemas/device_WindowsDevice]/network_info` to the response with the `200` status

      -  added the optional property `content/oneOf[#/components/schemas/device_WindowsDevice]/software_info` to the response with the `200` status


    - **GET /device/v0/devices/{id}/**

      -  added the optional property `content/oneOf[#/components/schemas/device_WindowsDevice]/hardware_info` to the response with the `200` status

      -  added the optional property `content/oneOf[#/components/schemas/device_WindowsDevice]/memory_info` to the response with the `200` status

      -  added the optional property `content/oneOf[#/components/schemas/device_WindowsDevice]/network_info` to the response with the `200` status

      -  added the optional property `content/oneOf[#/components/schemas/device_WindowsDevice]/software_info` to the response with the `200` status


    - **GET /enterprise/{enterprise_id}/group/{group_id}/download/eventfeed/** -
    ⚠️ added the new `CLEAR_APP_CACHE` enum value to the `results/items/command`
    response property for the response status `200`


    - **GET /v0/enterprise/{enterprise_id}/command/** - ⚠️ added the new
    `CLEAR_APP_CACHE` enum value to the `results/items/command` response
    property for the response status `200`


    - **POST /v0/enterprise/{enterprise_id}/command/**

      - ⚠️ added the new `CLEAR_APP_CACHE` enum value to the `command` response property for the response status `201`

      -  added the new `CLEAR_APP_CACHE` enum value to the request property `command`


    - **GET /v2/background-scripts/** -  added the optional property
    `content/results/items/description` to the response with the `200` status


    - **POST /v2/background-scripts/**

      -  added the new optional request property `description`

      -  added the optional property `content/description` to the response with the `201` status


    - **GET /v2/background-scripts/{background_script_id}/** -  added the
    optional property
    `content/allOf[#/components/schemas/blueprints_BackgroundScriptRead]/description`
    to the response with the `200` status


    - **GET /v2/blueprints/** -  added the optional property
    `content/results/items/settings/windows/background_scripts` to the response
    with the `200` status


    - **POST /v2/blueprints/**

      -  added the new optional request property `settings/windows/background_scripts`

      -  added the optional property `content/settings/windows/background_scripts` to the response with the `201` status


    - **DELETE /v2/blueprints/{blueprint_id}/** -  added the optional property
    `content/settings/windows/background_scripts` to the response with the `204`
    status


    - **GET /v2/blueprints/{blueprint_id}/** -  added the optional property
    `content/settings/windows/background_scripts` to the response with the `200`
    status


    - **PUT /v2/blueprints/{blueprint_id}/**

      -  added the new optional request property `allOf[#/components/schemas/blueprints_BlueprintV2]/settings/windows/background_scripts`

      -  added the optional property `content/settings/windows/background_scripts` to the response with the `200` status


    - **GET /v2/blueprints/{blueprint_id}/versions/** -  added the optional
    property `content/results/items/settings/windows/background_scripts` to the
    response with the `200` status


    - **GET /v2/blueprints/{blueprint_id}/versions/{version_id}/** -  added the
    optional property `content/settings/windows/background_scripts` to the
    response with the `200` status


    - **GET /v2/devices/**

      -  added the optional property `content/oneOf[#/components/schemas/device_CursorPaginatedDeviceList]/results/items/oneOf[#/components/schemas/device_WindowsDeviceV2]/background_scripts_stats` to the response with the `200` status

      -  added the optional property `content/oneOf[#/components/schemas/device_CursorPaginatedDeviceList]/results/items/oneOf[#/components/schemas/device_WindowsDeviceV2]/memory_info/total_swap_memory` to the response with the `200` status

      -  added the optional property `content/oneOf[#/components/schemas/device_CursorPaginatedDeviceList]/results/items/oneOf[#/components/schemas/device_WindowsDeviceV2]/software_info/display_refresh_rate` to the response with the `200` status

      -  added the optional property `content/oneOf[#/components/schemas/device_CursorPaginatedDeviceList]/results/items/oneOf[#/components/schemas/device_WindowsDeviceV2]/software_info/display_resolution` to the response with the `200` status

      -  added the optional property `content/oneOf[#/components/schemas/device_CursorPaginatedDeviceList]/results/items/oneOf[#/components/schemas/device_WindowsDeviceV2]/software_info/host_name` to the response with the `200` status

      -  added the optional property `content/oneOf[#/components/schemas/device_CursorPaginatedDeviceList]/results/items/oneOf[#/components/schemas/device_WindowsDeviceV2]/software_info/last_boot_time` to the response with the `200` status

      -  added the optional property `content/oneOf[#/components/schemas/device_CursorPaginatedDeviceList]/results/items/oneOf[#/components/schemas/device_WindowsDeviceV2]/software_info/os_build_time` to the response with the `200` status

      -  added the optional property `content/oneOf[#/components/schemas/device_CursorPaginatedDeviceList]/results/items/oneOf[#/components/schemas/device_WindowsDeviceV2]/software_info/os_distribution` to the response with the `200` status

      -  added the optional property `content/oneOf[#/components/schemas/device_CursorPaginatedDeviceList]/results/items/oneOf[#/components/schemas/device_WindowsDeviceV2]/software_info/os_platform` to the response with the `200` status

      -  added the optional property `content/oneOf[#/components/schemas/device_CursorPaginatedDeviceList]/results/items/oneOf[#/components/schemas/device_WindowsDeviceV2]/software_info/supported_abi` to the response with the `200` status

      -  added the optional property `content/oneOf[#/components/schemas/device_OffsetPaginatedDeviceList]/results/items/oneOf[#/components/schemas/device_WindowsDeviceV2]/background_scripts_stats` to the response with the `200` status

      -  added the optional property `content/oneOf[#/components/schemas/device_OffsetPaginatedDeviceList]/results/items/oneOf[#/components/schemas/device_WindowsDeviceV2]/memory_info/total_swap_memory` to the response with the `200` status

      -  added the optional property `content/oneOf[#/components/schemas/device_OffsetPaginatedDeviceList]/results/items/oneOf[#/components/schemas/device_WindowsDeviceV2]/software_info/display_refresh_rate` to the response with the `200` status

      -  added the optional property `content/oneOf[#/components/schemas/device_OffsetPaginatedDeviceList]/results/items/oneOf[#/components/schemas/device_WindowsDeviceV2]/software_info/display_resolution` to the response with the `200` status

      -  added the optional property `content/oneOf[#/components/schemas/device_OffsetPaginatedDeviceList]/results/items/oneOf[#/components/schemas/device_WindowsDeviceV2]/software_info/host_name` to the response with the `200` status

      -  added the optional property `content/oneOf[#/components/schemas/device_OffsetPaginatedDeviceList]/results/items/oneOf[#/components/schemas/device_WindowsDeviceV2]/software_info/last_boot_time` to the response with the `200` status

      -  added the optional property `content/oneOf[#/components/schemas/device_OffsetPaginatedDeviceList]/results/items/oneOf[#/components/schemas/device_WindowsDeviceV2]/software_info/os_build_time` to the response with the `200` status

      -  added the optional property `content/oneOf[#/components/schemas/device_OffsetPaginatedDeviceList]/results/items/oneOf[#/components/schemas/device_WindowsDeviceV2]/software_info/os_distribution` to the response with the `200` status

      -  added the optional property `content/oneOf[#/components/schemas/device_OffsetPaginatedDeviceList]/results/items/oneOf[#/components/schemas/device_WindowsDeviceV2]/software_info/os_platform` to the response with the `200` status

      -  added the optional property `content/oneOf[#/components/schemas/device_OffsetPaginatedDeviceList]/results/items/oneOf[#/components/schemas/device_WindowsDeviceV2]/software_info/supported_abi` to the response with the `200` status


    - **GET /v2/devices/{id}**

      -  added the optional property `content/oneOf[#/components/schemas/device_WindowsDeviceV2]/background_scripts_stats` to the response with the `200` status

      -  added the optional property `content/oneOf[#/components/schemas/device_WindowsDeviceV2]/memory_info/total_swap_memory` to the response with the `200` status

      -  added the optional property `content/oneOf[#/components/schemas/device_WindowsDeviceV2]/software_info/display_refresh_rate` to the response with the `200` status

      -  added the optional property `content/oneOf[#/components/schemas/device_WindowsDeviceV2]/software_info/display_resolution` to the response with the `200` status

      -  added the optional property `content/oneOf[#/components/schemas/device_WindowsDeviceV2]/software_info/host_name` to the response with the `200` status

      -  added the optional property `content/oneOf[#/components/schemas/device_WindowsDeviceV2]/software_info/last_boot_time` to the response with the `200` status

      -  added the optional property `content/oneOf[#/components/schemas/device_WindowsDeviceV2]/software_info/os_build_time` to the response with the `200` status

      -  added the optional property `content/oneOf[#/components/schemas/device_WindowsDeviceV2]/software_info/os_distribution` to the response with the `200` status

      -  added the optional property `content/oneOf[#/components/schemas/device_WindowsDeviceV2]/software_info/os_platform` to the response with the `200` status

      -  added the optional property `content/oneOf[#/components/schemas/device_WindowsDeviceV2]/software_info/supported_abi` to the response with the `200` status

    ---


    **DevRel 189 [2026-05-15]**


    ➕ Added


    - **GET /geofence/v1/geofences** -  endpoint added


    - **POST /geofence/v1/geofences** -  endpoint added


    - **GET /geofence/v1/geofences/{geofence_id}/blueprints** -  endpoint added


    - **GET /geofence/v1/geofences/{geofence_id}/device-summary** -  endpoint
    added


    - **GET /geofence/v1/geofences/{geofence_id}/devices** -  endpoint added


    - **GET /tenant/v0/depprofiles/** -  endpoint added


    - **POST /tenant/v0/depprofiles/** -  endpoint added


    - **GET /v2/background-scripts/** -  endpoint added


    - **POST /v2/background-scripts/** -  endpoint added


    - **GET /v2/background-scripts/{background_script_id}/** -  endpoint added


    **✏️ Updated**


    - **GET /v2/blueprints/** - ⚠️ the
    'content/results/items/settings/android/files/items/file_id' response's
    property type/format changed from 'string'/'' to 'integer'/'' for status
    '200'


    - **POST /v2/blueprints/**

      - ⚠️ the 'settings/android/files/items/file_id' request property type/format changed from 'string'/'' to 'integer'/''

      - ⚠️ the 'content/settings/android/files/items/file_id' response's property type/format changed from 'string'/'' to 'integer'/'' for status '201'


    - **DELETE /v2/blueprints/{blueprint_id}/** - ⚠️ the
    'content/settings/android/files/items/file_id' response's property
    type/format changed from 'string'/'' to 'integer'/'' for status '204'


    - **GET /v2/blueprints/{blueprint_id}/** - ⚠️ the
    'content/settings/android/files/items/file_id' response's property
    type/format changed from 'string'/'' to 'integer'/'' for status '200'


    - **PUT /v2/blueprints/{blueprint_id}/**

      - ⚠️ the '/allOf[#/components/schemas/blueprints_BlueprintV2]/settings/android/files/items/file_id' request property type/format changed from 'string'/'' to 'integer'/''

      - ⚠️ the 'content/settings/android/files/items/file_id' response's property type/format changed from 'string'/'' to 'integer'/'' for status '200'


    - **GET /v2/blueprints/{blueprint_id}/versions/** - ⚠️ the
    'content/results/items/settings/android/files/items/file_id' response's
    property type/format changed from 'string'/'' to 'integer'/'' for status
    '200'


    - **GET /v2/blueprints/{blueprint_id}/versions/{version_id}/** - ⚠️ the
    'content/settings/android/files/items/file_id' response's property
    type/format changed from 'string'/'' to 'integer'/'' for status '200'

    ---


    **DevRel 188 [2026-04-28]**


    **✏️ Updated**


    - **GET /v2/blueprints/**

      -  added the new optional 'query' request parameter 'settings__tvos__app_id'

      -  added the new optional 'query' request parameter 'settings__tvos__app_version_id'

      -  added the new optional 'query' request parameter 'settings__tvos__provisioning_profile_id'

      -  added the new optional 'query' request parameter 'settings__tvos__provisioning_profile_version_id'

      -  added the optional property 'content/results/items/settings/tvos' to the response with the '200' status


    - **POST /v2/blueprints/**

      -  added the new optional request property 'settings/tvos'

      -  added the optional property 'content/settings/tvos' to the response with the '201' status


    - **DELETE /v2/blueprints/{blueprint_id}/** -  added the optional property
    'content/settings/tvos' to the response with the '204' status


    - **GET /v2/blueprints/{blueprint_id}/** -  added the optional property
    'content/settings/tvos' to the response with the '200' status


    - **PUT /v2/blueprints/{blueprint_id}/** -  added the optional property
    'content/settings/tvos' to the response with the '200' status


    - **GET /v2/blueprints/{blueprint_id}/versions/**

      -  added the new optional 'query' request parameter 'settings__ios__provisioning_profile_id'

      -  added the new optional 'query' request parameter 'settings__ios__provisioning_profile_version_id'

      -  added the new optional 'query' request parameter 'settings__tvos__provisioning_profile_id'

      -  added the new optional 'query' request parameter 'settings__tvos__provisioning_profile_version_id'

      -  added the optional property 'content/results/items/settings/tvos' to the response with the '200' status


    - **GET /v2/blueprints/{blueprint_id}/versions/{version_id}/** -  added the
    optional property 'content/settings/tvos' to the response with the '200'
    status


    - **GET /v2/devices/** -  added the new optional 'query' request parameter
    'ungrouped_only'

    ---


    **DevRel 187 [2026-04-14]**


    **✏️ Updated**


    - **PUT /authz2/v1/roles/{role_id}/scopes**

      -  added the new 'create:device_command:UPDATE_WIFI_AP' enum value to the request property 'scope_names/items/'

      -  added the new 'create:group_command:UPDATE_WIFI_AP' enum value to the request property 'scope_names/items/'


    - **GET /commands/v0/commands/**

      - ⚠️ added the new 'OS_UPDATE_STATUS' enum value to the 'content/results/items/command' response property for the response status '200'

      - ⚠️ added the new 'SCAN_OS_UPDATES' enum value to the 'content/results/items/command' response property for the response status '200'

      - ⚠️ added the new 'SCHEDULE_OS_UPDATE' enum value to the 'content/results/items/command' response property for the response status '200'

      - ⚠️ added the new 'UPDATE_WIFI_AP' enum value to the 'content/results/items/command' response property for the response status '200'

      -  added the optional property 'content/results/items/command_args/anonymous_identity' to the response with the '200' status

      -  added the optional property 'content/results/items/command_args/certificate_file_password' to the response with the '200' status

      -  added the optional property 'content/results/items/command_args/certificate_file_path' to the response with the '200' status

      -  added the optional property 'content/results/items/command_args/domain' to the response with the '200' status

      -  added the optional property 'content/results/items/command_args/hidden' to the response with the '200' status

      -  added the optional property 'content/results/items/command_args/identity' to the response with the '200' status

      -  added the optional property 'content/results/items/command_args/install_action' to the response with the '200' status

      -  added the optional property 'content/results/items/command_args/product_version' to the response with the '200' status

      -  added the optional property 'content/results/items/command_args/wifi_eap_method' to the response with the '200' status

      -  added the optional property 'content/results/items/command_args/wifi_password' to the response with the '200' status

      -  added the optional property 'content/results/items/command_args/wifi_phase2_auth' to the response with the '200' status

      -  added the optional property 'content/results/items/command_args/wifi_security_type' to the response with the '200' status

      -  added the optional property 'content/results/items/command_args/wifi_ssid' to the response with the '200' status


    - **POST /commands/v0/commands/**

      - ⚠️ added the new 'OS_UPDATE_STATUS' enum value to the 'content/command' response property for the response status '201'

      - ⚠️ added the new 'SCAN_OS_UPDATES' enum value to the 'content/command' response property for the response status '201'

      - ⚠️ added the new 'SCHEDULE_OS_UPDATE' enum value to the 'content/command' response property for the response status '201'

      - ⚠️ added the new 'UPDATE_WIFI_AP' enum value to the 'content/command' response property for the response status '201'

      -  added the new optional request property 'command_args/anonymous_identity'

      -  added the new optional request property 'command_args/certificate_file_password'

      -  added the new optional request property 'command_args/certificate_file_path'

      -  added the new optional request property 'command_args/domain'

      -  added the new optional request property 'command_args/hidden'

      -  added the new optional request property 'command_args/identity'

      -  added the new optional request property 'command_args/install_action'

      -  added the new optional request property 'command_args/product_version'

      -  added the new optional request property 'command_args/wifi_eap_method'

      -  added the new optional request property 'command_args/wifi_password'

      -  added the new optional request property 'command_args/wifi_phase2_auth'

      -  added the new optional request property 'command_args/wifi_security_type'

      -  added the new optional request property 'command_args/wifi_ssid'

      -  added the new 'OS_UPDATE_STATUS' enum value to the request property 'command'

      -  added the new 'SCAN_OS_UPDATES' enum value to the request property 'command'

      -  added the new 'SCHEDULE_OS_UPDATE' enum value to the request property 'command'

      -  added the new 'UPDATE_WIFI_AP' enum value to the request property 'command'

      -  added the optional property 'content/command_args/anonymous_identity' to the response with the '201' status

      -  added the optional property 'content/command_args/certificate_file_password' to the response with the '201' status

      -  added the optional property 'content/command_args/certificate_file_path' to the response with the '201' status

      -  added the optional property 'content/command_args/domain' to the response with the '201' status

      -  added the optional property 'content/command_args/hidden' to the response with the '201' status

      -  added the optional property 'content/command_args/identity' to the response with the '201' status

      -  added the optional property 'content/command_args/install_action' to the response with the '201' status

      -  added the optional property 'content/command_args/product_version' to the response with the '201' status

      -  added the optional property 'content/command_args/wifi_eap_method' to the response with the '201' status

      -  added the optional property 'content/command_args/wifi_password' to the response with the '201' status

      -  added the optional property 'content/command_args/wifi_phase2_auth' to the response with the '201' status

      -  added the optional property 'content/command_args/wifi_security_type' to the response with the '201' status

      -  added the optional property 'content/command_args/wifi_ssid' to the response with the '201' status


    - **GET /commands/v0/commands/{id}/**

      - ⚠️ added the new 'OS_UPDATE_STATUS' enum value to the 'content/command' response property for the response status '200'

      - ⚠️ added the new 'SCAN_OS_UPDATES' enum value to the 'content/command' response property for the response status '200'

      - ⚠️ added the new 'SCHEDULE_OS_UPDATE' enum value to the 'content/command' response property for the response status '200'

      - ⚠️ added the new 'UPDATE_WIFI_AP' enum value to the 'content/command' response property for the response status '200'

      -  added the optional property 'content/command_args/anonymous_identity' to the response with the '200' status

      -  added the optional property 'content/command_args/certificate_file_password' to the response with the '200' status

      -  added the optional property 'content/command_args/certificate_file_path' to the response with the '200' status

      -  added the optional property 'content/command_args/domain' to the response with the '200' status

      -  added the optional property 'content/command_args/hidden' to the response with the '200' status

      -  added the optional property 'content/command_args/identity' to the response with the '200' status

      -  added the optional property 'content/command_args/install_action' to the response with the '200' status

      -  added the optional property 'content/command_args/product_version' to the response with the '200' status

      -  added the optional property 'content/command_args/wifi_eap_method' to the response with the '200' status

      -  added the optional property 'content/command_args/wifi_password' to the response with the '200' status

      -  added the optional property 'content/command_args/wifi_phase2_auth' to the response with the '200' status

      -  added the optional property 'content/command_args/wifi_security_type' to the response with the '200' status

      -  added the optional property 'content/command_args/wifi_ssid' to the response with the '200' status


    - **GET /commands/v0/status/** -  added the optional property
    'content/results/items/command_meta' to the response with the '200' status


    - **GET /commands/v0/status/{id}/** -  added the optional property
    'content/command_meta' to the response with the '200' status


    - **PUT /commands/v0/status/{id}/** -  added the optional property
    'content/command_meta' to the response with the '200' status


    - **GET /enterprise/{enterprise_id}/group/{group_id}/download/eventfeed/** -
    ⚠️ added the new 'UPDATE_WIFI_AP' enum value to the 'results/items/command'
    response property for the response status '200'


    - **POST /pipelines/v0/operationlists/{operationlist_id}/operations/** - 
    added the new 'UPDATE_WIFI_AP' enum value to the request property
    'operation_type'


    - **GET /v0/enterprise/{enterprise_id}/command/** - ⚠️ added the new
    'UPDATE_WIFI_AP' enum value to the 'results/items/command' response property
    for the response status '200'


    - **POST /v0/enterprise/{enterprise_id}/command/**

      - ⚠️ added the new 'UPDATE_WIFI_AP' enum value to the 'command' response property for the response status '201'

      -  added the new 'UPDATE_WIFI_AP' enum value to the request property 'command'


    - **POST /v0/operations/** -  added the new 'UPDATE_WIFI_AP' enum value to
    the request property 'operation_type'


    - **GET /v2/devices/**

      - ⚠️ for the 'query' request parameter 'limit', default value '10.00' was added

      - ⚠️ added '#/components/schemas/OffsetPaginatedDeviceList, #/components/schemas/CursorPaginatedDeviceList' to the 'content' response property 'oneOf' list for the response status '200'

      - ⚠️ the 'content' response's property type/format changed from 'object'/'' to ''/'' for status '200'

      - ⚠️ for the 'query' request parameter 'limit', the max was set to '1000.00'

      - ⚠️ removed the optional property 'content/count' from the response with the '200' status

      - ⚠️ removed the optional property 'content/next' from the response with the '200' status

      - ⚠️ removed the optional property 'content/previous' from the response with the '200' status

      - ⚠️ removed the optional property 'content/results' from the response with the '200' status

      -  added the new optional 'query' request parameter 'cursor'

    ---


    **DevRel 186 [2026-03-31]**
     
     
    **NO CHANGE**

    ---


    **DevRel 185 [2026-03-18]**



    - **GET /v2/devices/{deviceId}/google-accounts/emm-managed/** -  endpoint
    path updated


    - **GET /v2/esper-apps/{appId}/versions/{versionId}** -  endpoint path
    updated


    - **GET /v2/foundationversions** -  endpoint path updated


    - **GET /v2/rv-activity-feed/** -  endpoint path updated


    - **GET /v2/tenant-esper-apps** -  endpoint path updated
  termsOfService: https://esper.io/terms-of-service
  contact:
    email: developer@esper.io
  license:
    name: Apache 2.0
    url: http://www.apache.org/licenses/LICENSE-2.0.html
  version: 1.0.0
  x-prefix-tag: esper cloud api
servers:
  - url: https://{foo}-api.esper.cloud/api
    variables:
      foo:
        default: develop
        description: Custom end point
tags:
  - name: esper_cloud_api_Company Settings
    description: "The Company Settings API manage the account information set up for your organization. Formerly known as Enterprise Information.\_"
    externalDocs:
      description: Find out more about Company Settings
      url: >-
        https://help.esper.io/hc/en-us/articles/12656541757457-Introduction-to-Company-Settings
    x-displayName: Company Settings
  - name: esper_cloud_api_Application
    description: APIs for application management
    externalDocs:
      description: Find out more about application management
      url: https://help.esper.io/hc/en-us/articles/12652127923857
    x-displayName: Application
  - name: esper_cloud_api_Application V1
    description: APIs for application management
    x-displayName: Application V1
  - name: esper_cloud_api_AndroidDevice
    description: APIs for android device management
    externalDocs:
      description: Find out more about device management
      url: https://help.esper.io/hc/en-us/articles/12523891684369
    x-displayName: AndroidDevice
  - name: esper_cloud_api_Device Group
    description: APIs for device group management
    externalDocs:
      description: Find out more about device group management
      url: https://help.esper.io/hc/en-us/articles/12523891684369
    x-displayName: Device Group
  - name: esper_cloud_api_Token (Deprecated)
    description: >
      ⚠️ **Deprecation Notice:** The following APIs will soon be deprecated. Use
      the console to manage API keys instead.
    externalDocs:
      description: Find out more about API Key generation
      url: https://help.esper.io/hc/en-us/articles/12656959508497
    x-displayName: Token (Deprecated)
  - name: esper_cloud_api_Commands V2
    description: >-
      Commands V2.0 provides advanced device commands capabilities like queuing,
      support for offline devices, dynamic device set for commands and command
      history. Commands 2.0 is in active development and we will add support for
      all the commands soon
    externalDocs:
      description: Find out more about commands V2.0
      url: https://help.esper.io/hc/en-us/articles/12524618746129
    x-displayName: Commands V2
  - name: esper_cloud_api_Enterprise Policy
    description: APIs to Esper Compliance Policy
    externalDocs:
      description: Find out more about Compliance Policy
      url: https://help.esper.io/hc/en-us/articles/12653153592977
    x-displayName: Enterprise Policy
  - name: esper_cloud_api_Geofence
    description: APIs for geofence management
    externalDocs:
      description: Find out more about Geofence
      url: https://help.esper.io/hc/en-us/articles/12655621844753
    x-displayName: Geofence
  - name: esper_cloud_api_Content
    description: APIs to manage files
    externalDocs:
      description: Find out more about Content management
      url: https://help.esper.io/hc/en-us/articles/12655910179473
    x-displayName: Content
  - name: esper_cloud_api_User (Deprecated)
    description: >-
      ⚠️ **Deprecation Notice:** The following APIs will soon be deprecated.
      Please transition to the User APIs.
    externalDocs:
      description: Find out more about User management
      url: https://help.esper.io/hc/en-us/articles/12656615814929
    x-displayName: User (Deprecated)
  - name: esper_cloud_api_User
    description: APIs for User Management
    externalDocs:
      description: Find out more about User management
      url: https://help.esper.io/hc/en-us/articles/12656615814929
    x-displayName: User
  - name: esper_cloud_api_Blueprint (Deprecated)
    description: >
      This is the API for the former Blueprints service.


      ⚠️ **Deprecation Notice:** The following APIs will soon be deprecated. Use
      [Blueprints API](https://api.esper.io/tag/Blueprints-API) instead.
    x-displayName: Blueprint (Deprecated)
  - name: esper_cloud_api_Directory Record
    description: >-
      APIs for Directory Record management. These APIs are only available to the
      customers using the new Onboarding experience.
    x-displayName: Directory Record
  - name: esper_cloud_api_Tile Icon
    description: >
      APIs to manage tile icons. Tile icons allow Templates-based users to apply
      a icons to devices.
    x-displayName: Tile Icon
  - name: esper_cloud_api_Alerts
    x-displayName: Alerts
  - name: esper_cloud_api_Alarms
    x-displayName: Alarms
  - name: esper_cloud_api_Wallpapers
    x-displayName: Wallpapers
  - name: esper_cloud_api_Device Telemetry
    x-displayName: Device Telemetry
  - name: esper_cloud_api_Daily and Custom Reports
    x-displayName: Daily and Custom Reports
  - name: esper_cloud_api_SSO Connections
    x-displayName: SSO Connections
  - name: esper_cloud_api_Roles
    x-displayName: Roles
  - name: esper_cloud_api_Personal Access Token
    x-displayName: Personal Access Token
  - name: blueprints_Blueprints API
    description: >-
      APIs to manage blueprints. Learn more about
      [blueprints](https://help.esper.io/hc/en-us/articles/19118758564369-Introduction-to-Blueprints).
    x-displayName: Blueprints API
  - name: blueprints_Custom Actions API
    description: >-
      APIs to manage custom actions. Custom actions allow you to define custom
      scripts and commands that can be executed on Linux devices. Currently,
      only Linux platform is supported for custom actions.
    x-displayName: Custom Actions API
  - name: blueprints_Background Scripts API
    description: >-
      APIs to manage background scripts. Background scripts are scripts that can
      be configured to run continuously or at specified intervals on devices.
    x-displayName: Background Scripts API
  - name: pipelines_System Status Code
    description: |
      System status code descriptions
        * 900 (INTERNAL_REQUEST_SKIPPED) - Response code is used when a request is valid, but cannot be fulfilled.
    x-displayName: System Status Code
  - name: pipelines_System
    description: System level APIs
    x-displayName: System
  - name: pipelines_Pipelines
    description: Pipelines composition APIs
    x-displayName: Pipelines
  - name: pipelines_Stages
    description: APIs to modify Stage information
    x-displayName: Stages
  - name: pipelines_Target Lists
    description: APIs to modify Target List
    x-displayName: Target Lists
  - name: pipelines_Targets
    description: Targets subsystem
    x-displayName: Targets
  - name: pipelines_Device Groups
    description: APIs to modify Device Groups
    x-displayName: Device Groups
  - name: pipelines_Operation Lists
    description: APIs to modify Operation List
    x-displayName: Operation Lists
  - name: pipelines_Operations
    description: Operations subsystem
    x-displayName: Operations
  - name: pipelines_Pipeline Runs
    description: |
      APIs to manage Pipeline Runs. Pipeline run status descriptions
        * PENDING - Pipeline run created.
        * QUEUED - Pipeline run queued for processing.
        * PROCESSING - Pipeline run received by scheduler for processing. (Processing a pipeline involves performing the operations required before starting a pipeline)
        * RUNNING - Pipeline run has started running.
        * WAITING -  Pipeline run is waiting for an action (manual/automatic).
        * COMPLETE - The pipeline run has completed processing i.e. All stage runs are processed. A complete pipeline run can move to success or failure.
        * SUCCESS - A completed pipeline run moves to success if all stage runs are successful.
        * FAILURE - A completed pipeline run moves to failure if all stage runs are not successful.
        * CANCELLED - Pipeline run is cancelled by the user.
        * TIMEOUT -  The pipeline run has a timed out. This happens when the pipeline has not completed processing even after the timeout period (Default 21 days).
        * INVALID - A pipeline run moves to invalid state when Pipeline run has no stageruns i.e pipeline has zero stages.
    x-displayName: Pipeline Runs
  - name: pipelines_Stage Runs
    description: |
      APIs to manage Stage Runs. Stage run status descriptions
        * PENDING - Stage run created.
        * QUEUED - Stage run queued for processing.
        * PROCESSING - Stage run received by scheduler for processing.(Processing a stage run can involve performing the operations required before starting a stage run. In this case creating the target runs for the stage.)
        * RUNNING - Stage run has started running.  
        * COMPLETE - Stage run moves to complete if all target runs are complete (target runs are complete if they are in a terminal state).
        * SUCCESS - A completed stage run moves to success if all target runs are successful. 
        * FAILURE - A completed stage moves to failure if all target runs are not successful.
        * CANCELLED - Stage run cancelled by user.
        * TIMEOUT - The stage run has a timed out. This happens when the stage run has not completed processing even after the timeout period (Default 7 days).
        * INVALID -  A stage run moves to invalid state when 
                      a. The associated stage has no targets.
                      b. The associated stage has no operations.
    x-displayName: Stage Runs
  - name: pipelines_Target Runs
    description: |
      APIs to manage Target Runs. Target run status descriptions
        * PENDING - Target run created.
        * QUEUED - Target run queued for processing.
        * PROCESSING - Target run received by scheduler for processing (During target run processing the command request for the target run is created).
        * DISPATCHED - Target run moves to dispatched when a command is successfully queued for the target run. (Command status - QUEUED)
        * RUNNING - Target run moves to running state when the command has been sent to the device (Command status - INITIATED, ACKNOWLEDGED, INPROGRESS)
        * COMPLETE - Target run moves to complete state when it has completed running (Command status - FAILURE, SUCCESS, TIMEOUT, CANCELLED)
        * SUCCESS - A completed target run moves to success when the associated command is successful (Command status - SUCCESS)
        * FAILURE - A completed target run moves to success when the associated command is unsuccessful (Command status - FAILED, TIMEOUT, CANCELLED)
        * CANCELLED - Target run cancelled by the user (Target runs ind Pending, Queued and Processing state can be cancelled by the user)
        * TIMEOUT -  The target run has a timed out. This happens when the target run has not completed processing even after the timeout period (7 days).
        * INVALID - Target run is invalid.
    x-displayName: Target Runs
  - name: device_Device
    description: APIs to retrieve information about the device or delete the device.
    x-displayName: Device
  - name: device_Device Heartbeat
    description: >-
      APIs to retrieve information about device's heartbeat which contains the
      last seen details.
    x-displayName: Device Heartbeat
  - name: device_Device Apps
    description: >-
      APIs to get apps installed on iOS devices. Use
      [Application](https://api.esper.io/tag/Application/) to get apps for
      Android devices.
    x-displayName: Device Apps
  - name: device_Device Enrollment in EMM
    description: APIs to enroll device with Google EMM
    x-displayName: Device Enrollment in EMM
  - name: device_Operations
    description: APIs to get information about operations
    x-displayName: Operations
  - name: device_DeviceOperations
    description: APIs to get information about device operations
    x-displayName: DeviceOperations
  - name: device_MultiOS Remote Viewer
    description: >-
      API to get Remote Viewer activity for the tenant. Currently supports only
      Android devices with DPC 8.4 and above along with RemoteViewer 3.x.
    x-displayName: MultiOS Remote Viewer
  - name: apps_management_VPP License Management
    description: >-
      APIs for managing VPP licenses for apps. Learn more about [VPP
      licenses](https://help.esper.io/hc/en-us/articles/20361103311761-Setting-Up-Apple-MDM-Management).
    x-displayName: VPP License Management
  - name: apps_management_VPP App Management
    description: >-
      APIs for getting information about VPP apps. Learn more about [VPP
      apps](https://help.esper.io/hc/en-us/articles/20518326865681-Managing-iOS-Applications).
    x-displayName: VPP App Management
  - name: apps_management_Tenant Apps
    description: API to manage Enterprise iOS apps for a tenant.
    x-displayName: Tenant Apps
  - name: apps_management_Apple App Store
    description: API to search apple app store for apps
    x-displayName: Apple App Store
  - name: apps_management_App List
    description: Unified API to query Webclips and Tenant IOS Apps
    x-displayName: App List
  - name: apps_management_Webclips
    description: API to manage webclips for a tenant
    x-displayName: Webclips
  - name: apps_management_Provisioning Profiles
    description: APIs for managing iOS provisioning profiles for app distribution
    x-displayName: Provisioning Profiles
  - name: apps_management_Preferred Regions
    description: >-
      APIs for managing a tenant's preferred country/region list for App Store
      lookups
    x-displayName: Preferred Regions
  - name: apps_management_OEM Config Schema
    description: APIs for retrieving OEM config schemas parsed from OEM APKs
    x-displayName: OEM Config Schema
  - name: apps_management_Esper Apps
    x-displayName: Esper Apps
  - name: apps_management_Tenant Esper Apps
    x-displayName: Tenant Esper Apps
  - name: commands_Command Request
    description: >-
      APIs to view and manage command requests. Learn more about
      [commands](https://help.esper.io/hc/en-us/articles/16036992814609-Commonly-Used-APIs#h_01H2GZ8WM86BSQBGXE998QY8SM)
      or how to [schedule a
      command](https://help.esper.io/hc/en-us/articles/16036992814609-Commonly-Used-APIs#h_01H2GZ8WM86BSQBGXE998QY8SM).


      Scheduled commands are currently compatible with Android devices.
    x-displayName: Command Request
  - name: commands_Command Status
    description: APIs to view, filter, and manage command requests.
    x-displayName: Command Status
  - name: drift_Converge
    description: >-
      APIs to list and create converge actions for devices. Learn more about
      [converge](https://help.esper.io/hc/en-us/articles/24210344910865-Blueprint-Converge-and-Revert).
    x-displayName: Converge
  - name: drift_Converge Command
    description: API for converge command
    x-displayName: Converge Command
  - name: device_onboarding_DEP Sync Request
    description: >-
      APIs to create and access DEP sync request information. Use DEP sync to
      sync the information from your Apple Business Manager account to the Esper
      console.
    x-displayName: DEP Sync Request
  - name: device_onboarding_ABM Provisioning
    description: >-
      APIs to perform ABM provisioning. Learn more about [ABM
      provisioning](https://help.esper.io/hc/en-us/articles/20361103311761-Setting-Up-Apple-MDM-Management)
    x-displayName: ABM Provisioning
  - name: tenant_APNs certificate
    description: >-
      APIs for managing APNS certificates. Learn more about [APNS
      certificates](https://help.esper.io/hc/en-us/articles/20361103311761-Setting-Up-Apple-MDM-Management)
    x-displayName: APNs certificate
  - name: tenant_DEP Profile
    description: >-
      APIs to create and manage DEP profiles. Learn more about [DEP
      profiles](https://help.esper.io/hc/en-us/articles/20361103311761-Setting-Up-Apple-MDM-Management)
    x-displayName: DEP Profile
  - name: tenant_DEP Tokens
    description: >-
      APIs to create and access DEP tokens. Learn more about [DEP
      tokens](https://help.esper.io/hc/en-us/articles/20361103311761-Setting-Up-Apple-MDM-Management)
    x-displayName: DEP Tokens
  - name: tenant_VPP Token Management
    description: >-
      APIs to create, access, and delete VPP tokens. Learn more about [VPP
      tokens](https://help.esper.io/hc/en-us/articles/20361103311761-Setting-Up-Apple-MDM-Management).
    x-displayName: VPP Token Management
  - name: tenant_Google Enterprise
    description: APIs to enroll the enterprise in Google EMM.
    x-displayName: Google Enterprise
  - name: tenant_MDM Service Config
    description: Unauthenticated discovery endpoint for Apple's MDMServiceConfig spec.
    x-displayName: MDM Service Config
  - name: foundation_FoundryBuilds
    x-displayName: FoundryBuilds
  - name: foundation_FoundryDeviceModels
    x-displayName: FoundryDeviceModels
  - name: foundation_FoundryEvents
    x-displayName: FoundryEvents
  - name: reports_Reports API
    description: >-
      APIs for managing reports.<br /> Currently supports [App
      Reports](https://help.esper.io/hc/en-us/articles/27379366650257-App-Reports).
    x-displayName: Reports API
  - name: geofence_Geofences
    x-displayName: Geofences
  - name: geofence_Device State
    x-displayName: Device State
paths:
  /enterprise/{enterprise_id}/application/:
    get:
      x-badges:
        - name: Stable
          color: green
      tags:
        - esper_cloud_api_Application
      summary: List apps in enterprise
      description: >-
        **Alternative Available**


        GET "/v2/apps (tenant iOS and Windows apps only)" or GET
        "https://{foo}-api.esper.cloud/api/v1/enterprise/{enterprise_id}/application/"


        Lists all applications uploaded to an enterprise's application library.
        Returns a paginated collection of application records, including
        metadata such as package name, developer, category, and active status,
        with filter options to narrow results by name, package, SDK version,
        upload status, and timestamps. Default page size is 20.


        **About List Enterprise Applications**


        Esper's application library is the enterprise-level repository where APK
        files are uploaded and managed before deployment to devices. Each
        application entry groups multiple uploaded versions under a single
        record identified by package name. Applications can be filtered by
        active state, hidden status, and whether they have at least one uploaded
        version ready for deployment.


        **Key Query Parameters**


        application_name — partial or exact name filter

        package_name — filter by Android package name (e.g. com.example.app)

        has_uploaded_version — when true, returns only apps with at least one
        APK version on record

        is_hidden — filters default Esper system apps; defaults to false

        is_active — filter for currently active applications

        created_on_gt / created_on_lt / updated_on_gt / updated_on_lt —
        timestamp range filters for audit or sync **Workflow**s

        limit — results per page (default: 20)


        **Common Use Cases**


        Inventory the full set of applications available for deployment across
        an enterprise

        Locate a specific app by package name before retrieving its versions for
        installation

        Identify apps that have no uploaded versions and may need attention


        **Best Practices**


        No need to delete prior versions. Multiple, different versions of apps
        can exist simultaneously. 

        Applications must be removed from a blueprint before the blueprint can
        be deleted. 


        **Workflow**


        Call this endpoint with relevant filters (name, package, active state)
        to find the target application

        Note the id field from the matching result — this is the application_id
        UUID needed for version lookups and installs

        Proceed to GET .../application/{application_id}/version/ to retrieve
        available versions
      operationId: getAllApplications
      parameters:
        - name: enterprise_id
          in: path
          description: A UUID string identifying this enterprise.
          required: true
          schema:
            type: string
        - name: application_name
          in: query
          description: filter by application name
          schema:
            type: string
        - name: package_name
          in: query
          description: filter by package name
          schema:
            type: string
        - name: package_name_exact
          in: query
          description: filter by package name (exact match)
          schema:
            type: string
        - name: has_uploaded_version
          in: query
          description: Returns applications having atleast one version uploaded
          schema:
            type: boolean
        - name: category
          in: query
          description: filter by category
          schema:
            type: string
        - name: supported_sdk
          in: query
          description: filter by supported sdk versions
          schema:
            type: integer
        - name: is_active
          in: query
          description: filter by active applications
          schema:
            type: boolean
        - name: is_hidden
          in: query
          description: filter default esper apps
          schema:
            type: boolean
            default: false
        - name: created_on_gt
          in: query
          description: filter applications created after a given timestamp
          schema:
            type: string
            format: datetime
        - name: created_on_lt
          in: query
          description: filter applications created before a given timestamp
          schema:
            type: string
            format: datetime
        - name: updated_on_gt
          in: query
          description: filter applications updated after a given timestamp
          schema:
            type: string
            format: datetime
        - name: updated_on_lt
          in: query
          description: filter applications updated before a given timestamp
          schema:
            type: string
            format: datetime
        - name: limit
          in: query
          description: Number of results to return per page.
          schema:
            type: integer
            default: 20
        - name: offset
          in: query
          description: Return results from this index.
          schema:
            type: integer
            default: 0
      responses:
        '200':
          description: successful operation
          content:
            application/json:
              schema:
                required:
                  - count
                  - results
                type: object
                properties:
                  count:
                    type: integer
                  next:
                    type: string
                    format: url
                    nullable: true
                  previous:
                    type: string
                    format: url
                    nullable: true
                  results:
                    type: array
                    items:
                      $ref: '#/components/schemas/esper_cloud_api_Application'
        '401':
          description: Authorization information is missing or invalid.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
      security:
        - esper_cloud_api_apiKey: []
  /enterprise/{enterprise_id}/application/{application_id}/:
    get:
      x-badges:
        - name: Stable
          color: green
      tags:
        - esper_cloud_api_Application
      summary: Get application information
      description: >-
        Lists all versions of a specific application registered in the
        enterprise library.

        Returns a paginated collection of AppVersion records for the specified
        application, filterable by version code, build number. Default page size
        is 20; results can be ordered by install count.


        About List App Versions


        An Esper application can have multiple versions, each tracked as a
        distinct AppVersion record with its own UUID (version_id).The version_id
        is required when issuing install commands to specific devices.


        **Key Query Parameters**


        version_code — filter by the version code string (as set in the APK
        manifest)

        build_number — filter by build number

        approval_status — filter by lifecycle status: AVAILABLE, ACCEPTED,
        APPROVED, or REJECTED

        is_enabled — filter for enabled versions only

        is_default — filter for the default version of the application

        ordering — sort by installed_count (ascending) or -installed_count
        (descending)

        limit — results per page (default: 20)


        **Common Use Cases**


        Retrieve the list of versions before selecting one for a device install
        command


        **Best Practices**


        Store version_id values from results — these UUIDs are required for
        device install and app detail lookups


        **Workflow**


        Call this endpoint with the target application_id and any filters 

        Select the appropriate version from the results and record its id
        (version_id)

        Use version_id in install commands or in GET .../version/{version_id}/
        for full version detail
      operationId: getApplication
      parameters:
        - name: application_id
          in: path
          description: A UUID string identifying this application.
          required: true
          schema:
            type: string
            format: uuid
        - name: enterprise_id
          in: path
          description: A UUID string identifying enterprise.
          required: true
          schema:
            type: string
      responses:
        '200':
          description: successful operation
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_Application'
        '401':
          description: Authorization information is missing or invalid.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '404':
          description: Not Found.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
      security:
        - esper_cloud_api_apiKey: []
    delete:
      x-badges:
        - name: Stable
          color: green
      tags:
        - esper_cloud_api_Application
      summary: Delete an application
      description: >-
        Alternative Available: DELETE
        /v1/enterprise/{enterprise_id}/application/{application_id}/

        To remove an iOS or Windows application version: DELETE
        /v2/tenant-apps/{appId}/versions/{versionId}

        Delete Android enterprise application. Permanently removes an
        application and all of its associated versions from the enterprise. Once
        deleted, the application can no longer be assigned to devices or
        policies and cannot be managed or distributed unless re-uploaded.

        **Common Use Cases** Removing deprecated or unsupported applications
        from the enterprise catalog, cleaning up unused or test applications,
        eliminating duplicate entries, and decommissioning applications no
        longer approved for distribution.

        **Best Practices** Before deleting, download a backup copy of the
        application package from the Apps section in the console — deletion is
        permanent and cannot be undone. Verify the application is not referenced
        in any active blueprints before calling this endpoint; an application
        associated with a blueprint must be removed from that blueprint first or
        the deletion will fail. Review device and policy assignments to avoid
        unintended disruption to managed devices.

        Note: This endpoint removes the entire application record along with all
        versions. To remove iOS or Windows tenant application versions
        individually, use DELETE /v2/tenant-apps/{appId}/versions/{versionId}
        instead.

        **Workflow**:


        1. Use the List apps in enterprise endpoint to retrieve the
        application_id.

        2. Check whether the application is present in any blueprints: GET
        /v2/blueprints/

        3. If the application appears in one or more blueprints, note the
        relevant blueprint_id values.

        4. For each affected blueprint, remove the application by calling: PUT
        /v2/blueprints/{blueprint_id}/

        5. Once the application has been removed from all blueprints, call this
        endpoint with the application_id to permanently delete it and all
        associated versions from the enterprise.
      operationId: deleteApplication
      parameters:
        - name: application_id
          in: path
          description: A UUID string identifying this application.
          required: true
          schema:
            type: string
            format: uuid
        - name: enterprise_id
          in: path
          description: A UUID string identifying enterprise.
          required: true
          schema:
            type: string
      responses:
        '204':
          description: The resource was deleted successfully.
        '401':
          description: Authorization information is missing or invalid.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '403':
          description: Forbidden, no permission to perform this action.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '404':
          description: Not Found.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
      security:
        - esper_cloud_api_apiKey: []
  /enterprise/{enterprise_id}/application/{application_id}/version/:
    get:
      x-badges:
        - name: Stable
          color: green
      tags:
        - esper_cloud_api_Application
      summary: List App versions
      description: >-
        Lists all versions of a specific application registered in the
        enterprise library.


        Returns a paginated collection of AppVersion records for the specified
        application, filterable by version code, build number, approval status,
        Google Play origin, enabled state, and timestamps. Default page size is
        20; results can be ordered by install count.


        **About List App Versions**


        An Esper application can have multiple versions, each tracked as a
        distinct AppVersion record with its own UUID (version_id). Versions may
        originate from a direct APK upload or from the Console Google Play Store
        (identifiable via is_g_play). Each version carries an approval_status
        (AVAILABLE, ACCEPTED, APPROVED, or REJECTED) and can be enabled or
        disabled independently. The version_id is required when issuing install
        commands to specific devices.


        **Key Query Parameters**


        version_code — filter by the version code string (as set in the APK
        manifest)


        build_number — filter by build number


        is_g_play — true returns only versions sourced from the Console Google
        Play Store


        approval_status — filter by lifecycle status: AVAILABLE, ACCEPTED,
        APPROVED, or REJECTED


        is_enabled — filter for enabled versions only


        is_default — filter for the default version of the application


        ordering — sort by installed_count (ascending) or -installed_count
        (descending)


        limit — results per page (default: 20)


        **Common Use Cases**


        Retrieve the list of approved, enabled versions before selecting one for
        a device install command

        Audit which app versions are currently deployed across devices using
        installed_count ordering

        Identify versions with approval_status=REJECTED or is_enabled=false to
        clean up the library


        **Best Practices**


        Filter by approval_status=APPROVED and is_enabled=true to limit results
        to deployment-ready versions

        Use is_g_play=false when working exclusively with internally uploaded
        APKs to exclude Play Store-sourced versions

        Store version_id values from results — these UUIDs are required for
        device install and app detail lookups


        **Workflow**


        Call this endpoint with the target application_id and any filters
        (approval status, enabled state)

        Select the appropriate version from the results and record its id
        (version_id)

        Use version_id in install commands or in GET .../version/{version_id}/
        for full version detail
      operationId: getAppVersions
      parameters:
        - name: application_id
          in: path
          description: A UUID string identifying this application.
          required: true
          schema:
            type: string
            format: uuid
        - name: enterprise_id
          in: path
          description: A UUID string identifying enterprise.
          required: true
          schema:
            type: string
        - name: version_code
          in: query
          description: filter by version code
          schema:
            type: string
        - name: build_number
          in: query
          description: filter by build number
          schema:
            type: string
        - name: is_g_play
          in: query
          description: filter google play applications
          schema:
            type: boolean
        - name: approval_status
          in: query
          description: filter by approval status
          schema:
            type: string
            enum:
              - AVAILABLE
              - ACCEPTED
              - APPROVED
              - REJECTED
        - name: is_enabled
          in: query
          description: filter by enabled versions
          schema:
            type: boolean
        - name: is_default
          in: query
          description: filter by default versions
          schema:
            type: boolean
        - name: created_on_gt
          in: query
          description: filter applications created after a given timestamp
          schema:
            type: string
            format: datetime
        - name: created_on_lt
          in: query
          description: filter applications created before a given timestamp
          schema:
            type: string
            format: datetime
        - name: updated_on_gt
          in: query
          description: filter applications updated after a given timestamp
          schema:
            type: string
            format: datetime
        - name: updated_on_lt
          in: query
          description: filter applications updated before a given timestamp
          schema:
            type: string
            format: datetime
        - name: limit
          in: query
          description: Number of results to return per page.
          schema:
            type: integer
            default: 20
        - name: offset
          in: query
          description: Return results from this index.
          schema:
            type: integer
            default: 0
        - name: ordering
          in: query
          schema:
            type: string
          description: |
            Order result set by field name.
            * installed_count: order by asc
            * -installed_count: order by desc
      responses:
        '200':
          description: successful operation
          content:
            application/json:
              schema:
                required:
                  - count
                  - results
                type: object
                properties:
                  count:
                    type: integer
                  next:
                    type: string
                    format: url
                    nullable: true
                  previous:
                    type: string
                    format: url
                    nullable: true
                  results:
                    type: array
                    items:
                      $ref: '#/components/schemas/esper_cloud_api_AppVersion'
        '401':
          description: Authorization information is missing or invalid.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
      security:
        - esper_cloud_api_apiKey: []
  /enterprise/{enterprise_id}/application/{application_id}/version/{version_id}/:
    get:
      x-badges:
        - name: Stable
          color: green
      tags:
        - esper_cloud_api_Application
      summary: Get app version information
      description: >-
        Retrieves full details for a single application version by its UUID.

        Returns the AppVersion object including version code, build number,
        release name, release track, approval status, enabled/default state, SDK
        version constraints, and install count. Use when you need complete
        metadata on a specific version identified by version_id.


        About Get App Version


        AppVersion records in Esper represent individual APK builds associated
        with an application. Each version has its own version_id UUID and
        carries release lifecycle metadata — including its release_track (Alpha,
        Beta, or Production), approval_status, and is_enabled flag — that
        governs whether it is eligible for deployment. This endpoint also
        includes a request_id query parameter that, when matched in cache,
        triggers deletion of the cached application and entry, useful for
        invalidating stale state during upload **Workflow**s.


        Key Fields / Query Parameters


        application_id - The UUID of the application


        version_id — path parameter UUID identifying this specific version


        version_code — the version identifier from the APK manifest


        build_number — build-level identifier for the release


        is_enabled — whether this version is available for deployment


        is_default — whether this version is the designated default for the
        application


        **Common Use Cases**


        Confirm the approval status and release track of a version before
        scheduling a device install

        Retrieve SDK version constraints (min_sdk_version, target_sdk_version)
        to verify device compatibility

        Look up a version's installed_count to understand deployment breadth
        before deprecating or replacing it


        **Best Practices**


        Verify is_enabled=true before using a version_id in an install command

        Use this endpoint rather than the version list when you already have the
        version_id and need authoritative metadata fast


        **Workflow**


        Obtain the version_id from a prior version list call or stored reference

        Call this endpoint to retrieve full version metadata

        Confirm release track and approval status, then proceed with install or
        deployment commands
      operationId: getAppVersion
      parameters:
        - name: version_id
          in: path
          description: A UUID string identifying this app version.
          required: true
          schema:
            type: string
            format: uuid
        - name: application_id
          in: path
          description: A UUID string identifying this application.
          required: true
          schema:
            type: string
            format: uuid
        - name: enterprise_id
          in: path
          description: A UUID string identifying enterprise.
          required: true
          schema:
            type: string
        - name: request_id
          in: query
          description: >-
            If this value exists in cache, delete the application and cache
            entry.
          schema:
            type: string
      responses:
        '200':
          description: successful operation
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_AppVersion'
        '401':
          description: Authorization information is missing or invalid.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '404':
          description: Not Found.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
      security:
        - esper_cloud_api_apiKey: []
    delete:
      x-badges:
        - name: Stable
          color: green
      tags:
        - esper_cloud_api_Application
      summary: Delete app version
      description: >-
        Alternative Available: DELETE
        /v1/enterprise/{enterprise_id}/application/{application_id}/version/{version_id}/
        To remove an iOS or Windows application version: DELETE
        /v2/tenant-apps/{appId}/versions/{versionId}


        Delete Android enterprise application version. Permanently removes a
        specific version of an application from the enterprise app catalog. Only
        the targeted version is deleted — the application record and all other
        versions remain intact and unaffected.


        **Common Use Cases** Removing a buggy or recalled release, cleaning up
        test or development builds, and reducing catalog clutter by retiring
        outdated versions no longer approved for distribution.


        Important behavior: You do not need to delete older versions before
        uploading a new one. Use this endpoint only when you want the selected
        version fully and permanently removed from the catalog.


        **Best Practices** Before deleting, download and retain a copy of the
        build artifact outside of Esper — this action is irreversible and the
        version cannot be recovered through the API. Verify the version is not
        referenced in any active blueprints before calling this endpoint; a
        version associated with a blueprint must be removed from that blueprint
        first or the deletion will fail. Review any deployment **Workflow**s
        that may reference this specific version to avoid unintended disruption.


        **Workflow**: 1. Use the List apps in enterprise endpoint to retrieve
        the application_id. 2. Use the List app versions endpoint to identify
        the version_id you want to remove. 3. Check whether the version is
        present in any blueprints: GET /v2/blueprints/ 4. If the version appears
        in one or more blueprints, note the relevant blueprint_id values. 5. For
        each affected blueprint, remove the version reference by calling: PUT
        /v2/blueprints/{blueprint_id}/ 6. Once the version has been removed from
        all blueprints, call this endpoint with the application_id and
        version_id to permanently delete it.
      operationId: deleteAppVersion
      parameters:
        - name: version_id
          in: path
          description: A UUID string identifying this app version.
          required: true
          schema:
            type: string
            format: uuid
        - name: application_id
          in: path
          description: A UUID string identifying this application.
          required: true
          schema:
            type: string
            format: uuid
        - name: enterprise_id
          in: path
          description: A UUID string identifying enterprise.
          required: true
          schema:
            type: string
      responses:
        '200':
          description: >-
            No request id is provided and the application is linked to one or
            more templates. Returns a request_id. Call with this request id to
            delete the resource.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_AppVersionDelete'
        '204':
          description: The resource was deleted successfully.
        '400':
          description: Invalid request.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '401':
          description: Authorization information is missing or invalid.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '403':
          description: Forbidden, no permission to perform this action.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '404':
          description: Not Found.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
      security:
        - esper_cloud_api_apiKey: []
    patch:
      x-badges:
        - name: Stable
          color: green
      tags:
        - esper_cloud_api_Application
      summary: Patch an App version instance
      description: >-
        Alternative Available: PATCH
        /v1/enterprise/{enterprise_id}/application/{application_id}/version/{version_id}/

        To update an iOS or Windows application version: PUT
        /v2/tenant-apps/{appId}/versions/{versionId}


        Patch Android enterprise application version. Updates editable metadata
        for a specific application version without changing the underlying
        build. Use this endpoint to modify fields such as release name, release
        comments, release track, approval status, SDK targets, and whether the
        version is enabled or set as the default.


        **Common Use Cases** Updating release notes or comments after upload,
        changing a version's release track (Alpha, Beta, or Production),
        enabling or disabling a specific version, setting a version as the
        default, and updating approval status as part of a review **Workflow**.


        Important behavior: This endpoint does not upload or replace the app
        binary. To publish a new build, use: POST
        /enterprise/{enterprise_id}/application/upload/


        **Best Practices** Only include the fields you intend to change —
        unspecified fields will remain unchanged. Confirm the version_id before
        patching to avoid updating the wrong release. If updating
        approval_status or is_enabled as part of a release **Workflow**, verify
        downstream policies and blueprints referencing this version are ready
        before making the version active.

        **Workflow**:


        1. Use the List apps in enterprise endpoint to retrieve the
        application_id.

        2. Use the List app versions endpoint to identify the version_id you
        want to update.

        3. Send a PATCH request with only the metadata fields you want to
        modify.
      operationId: patchAppVersion
      parameters:
        - name: version_id
          in: path
          description: A UUID string identifying this app version.
          required: true
          schema:
            type: string
            format: uuid
        - name: application_id
          in: path
          description: A UUID string identifying this application.
          required: true
          schema:
            type: string
            format: uuid
        - name: enterprise_id
          in: path
          description: A UUID string identifying enterprise.
          required: true
          schema:
            type: string
      requestBody:
        content:
          '*/*':
            schema:
              type: object
              properties:
                release_name:
                  title: Release name
                  type: string
                  description: Name of the Release
                release_comments:
                  title: Release comments
                  type: string
                  description: Additional comments about the release
                release_track:
                  title: Release track
                  type: string
                  description: Description of the content
                  enum:
                    - Alpha
                    - Beta
                    - Production
                is_enabled:
                  title: Is Enabled
                  type: boolean
                  description: Is the app version enabled
                min_sdk_version:
                  title: Minimum SDK version
                  type: string
                  description: >-
                    Version number of minimum SDK version that supports this app
                    version
                target_sdk_version:
                  title: Target SDK version
                  type: string
                  description: Target SDK version that supports this app version
                build_number:
                  title: Build Number
                  type: string
                  description: Build number of this app version
                version_code:
                  title: Version Code
                  type: string
                  description: Verion code of this app version
                approval_status:
                  title: Approval Status
                  type: string
                  description: Approval status of this app version
                  enum:
                    - AVAILABLE
                    - ACCEPTED
                    - APPROVED
                    - REJECTED
                is_default:
                  title: Is default
                  type: boolean
                  description: Is the app version default
        required: false
      responses:
        '200':
          description: successful operation
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_AppVersion'
        '400':
          description: Bad request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '401':
          description: Authorization information is missing or invalid.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '403':
          description: Forbidden, no permission to perform this action.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '404':
          description: Not Found.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
      security:
        - esper_cloud_api_apiKey: []
      x-codegen-request-body-name: data
  /enterprise/{enterprise_id}/application/{application_id}/version/{version_id}/installdevices:
    get:
      x-badges:
        - name: Stable
          color: green
      tags:
        - esper_cloud_api_Application
      summary: List install devices
      description: >-
        List all devices with a specific app version installed. Retrieves a
        paginated list of devices on which the specified application version is
        currently installed. Results can be searched by device name, device
        alias, or group name.


        About App Install Tracking


        Esper tracks the installation state of each app version across enrolled
        devices. This endpoint provides an app-centric view of device coverage —
        rather than querying each device individually for its installed apps,
        you can query a specific app version to see exactly which devices have
        it installed. This is particularly useful for verifying deployment
        coverage after issuing an install command across a fleet.


        Platform limitations


        This endpoint is not supported for iOS, Linux, or Windows devices —
        retrieving a list of devices by app version is an Android-only
        capability. Additionally, kiosk-specific app attributes such as
        KioskAppName are not included in the summary-level device records
        returned by this endpoint; retrieving those attributes requires
        individual device detail calls via GET
        /enterprise/{enterprise_id}/device/{device_id}/.


        **Workflow**


        1. Call GET /enterprise/{enterprise_id}/application/ to retrieve the
        application_id for the app you want to audit.

        2. Call GET
        /enterprise/{enterprise_id}/application/{application_id}/version/ to
        retrieve the version_id for the specific version.

        3. Call this endpoint to retrieve the list of devices with that version
        installed.

        4. Cross-reference results against your target device list to identify
        any devices that are missing the installation.

        5. Use POST /commands/v0/commands/ to issue an install command to
        devices that have not yet received the app version.
      operationId: getInstallDevices
      parameters:
        - name: version_id
          in: path
          description: A UUID string identifying this app version.
          required: true
          schema:
            type: string
            format: uuid
        - name: application_id
          in: path
          description: A UUID string identifying this application.
          required: true
          schema:
            type: string
            format: uuid
        - name: enterprise_id
          in: path
          description: A UUID string identifying enterprise.
          required: true
          schema:
            type: string
        - name: search
          in: query
          description: >-
            A search term, search based on device name, device alias_name, group
            name
          schema:
            type: string
        - name: limit
          in: query
          description: Number of results to return per page
          schema:
            type: integer
        - name: offset
          in: query
          description: Return results from this index.
          schema:
            type: integer
      responses:
        '200':
          description: successful operation
          content:
            application/json:
              schema:
                required:
                  - count
                  - results
                type: object
                properties:
                  count:
                    type: integer
                  next:
                    type: string
                    format: url
                    nullable: true
                  previous:
                    type: string
                    format: url
                    nullable: true
                  results:
                    type: array
                    items:
                      $ref: '#/components/schemas/esper_cloud_api_InstallDevices'
        '401':
          description: Authorization information is missing or invalid.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '403':
          description: Forbidden, no permission to perform this action.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '404':
          description: Not Found.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
      security:
        - esper_cloud_api_apiKey: []
  /enterprise/{enterprise_id}/application/upload/:
    post:
      x-badges:
        - name: Stable
          color: green
      tags:
        - esper_cloud_api_Application
      summary: Upload an application to enterprise
      description: >-
        ⚠️ Android only. This endpoint accepts APK files and applies exclusively
        to Android-managed devices. See iOS and Windows application endpoints
        for **Workflow**s.


        Uploads an APK file to the enterprise application library, creating or
        updating an application and version record.

        Accepts a multipart/form-data payload with a single required field
        (app_file), and returns the resulting Application object including the
        newly created version upon success. This is the primary mechanism for
        adding privately distributed APKs to the Esper platform for enterprise
        deployment.


        About Upload Application


        The upload endpoint ingests an APK binary and parses it to extract
        metadata such as package name, version code, and SDK requirements,
        automatically associating the upload with the correct application record
        (creating one if none exists for the package name). The returned
        Application object includes the new version in its versions array. 


        Key Fields


        app_file — required; the binary APK file to upload, sent as
        multipart/form-data


        **Common Use Cases**


        Add a new internal or privately distributed app to the enterprise
        library for managed deployment

        Upload a new version of an existing app, updating the version catalog
        without creating a duplicate application record

        Automate app updates as part of a CI/CD pipeline that pushes new APK
        builds to Esper. Use the Operations endpoint for large deployments.


        **Best Practices**


        Ensure the APK is valid and signed before uploading — malformed or
        unsigned APKs will result in a 400 Bad Request

        Store the application_id and version_id from the response to use
        directly in install commands without a subsequent lookup


        **Workflow**


        Build and sign your APK

        POST the APK binary as app_file in a multipart/form-data request to this
        endpoint

        Retrieve the application_id and new version_id from the response, then
        proceed with install **Workflow**s
      operationId: upload
      parameters:
        - name: enterprise_id
          in: path
          description: A UUID string identifying this enterprise.
          required: true
          schema:
            type: string
      requestBody:
        content:
          multipart/form-data:
            schema:
              required:
                - app_file
              properties:
                app_file:
                  type: string
                  description: Valid APK file
                  format: binary
          application/x-www-form-urlencoded:
            schema:
              required:
                - app_file
              properties:
                app_file:
                  type: string
                  description: Valid APK file
                  format: binary
        required: true
      responses:
        '201':
          description: successful operation
          content:
            application/json:
              schema:
                type: object
                properties:
                  application:
                    $ref: '#/components/schemas/esper_cloud_api_Application'
        '400':
          description: Bad request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '401':
          description: Authorization information is missing or invalid.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '403':
          description: Forbidden, no permission to perform this action.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '415':
          description: Unsupported media type.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
      security:
        - esper_cloud_api_apiKey: []
  /v0/enterprise/{enterprise_id}/emm:
    get:
      x-badges:
        - name: Stable
          color: green
      tags:
        - esper_cloud_api_Application
      summary: List Google enterprises
      description: >-
        List all Google Enterprise (EMM) instances for the enterprise. Retrieves
        all Google Enterprise bindings associated with the specified Esper
        enterprise, including the google_enterprise_id that links each binding
        to Google's EMM infrastructure.


        About Google EMM


        A Google Enterprise binding connects an Esper enterprise to Google's
        Enterprise Mobility Management (EMM) infrastructure, enabling management
        of GMS-enabled Android devices. This binding is the foundation for
        silent app installation, Play Store customization, managed
        configurations, and advanced device provisioning across a GMS fleet.
        Without an active EMM binding, Google Play-dependent management features
        are unavailable.



        **Common Use Cases** 


        Confirming that a Google Enterprise binding exists before attempting
        GMS-dependent operations, retrieving the emm_id needed to call related
        EMM endpoints, and auditing the EMM enrollment state for a given
        enterprise.


        **Workflow**


        1. Call this endpoint to confirm the enterprise has an active EMM
        binding and retrieve the emm_id.

        2. Use GET /v0/enterprise/{enterprise_id}/emm/{emm_id}/ to retrieve full
        details for a specific EMM instance.
      operationId: getEMMInstances
      parameters:
        - name: enterprise_id
          in: path
          description: A UUID string identifying this enterprise.
          required: true
          schema:
            type: string
      responses:
        '200':
          description: successful operation
          content:
            application/json:
              schema:
                required:
                  - count
                  - results
                properties:
                  count:
                    type: integer
                  next:
                    type: string
                    format: url
                    nullable: true
                  previous:
                    type: string
                    format: url
                    nullable: true
                  results:
                    type: array
                    items:
                      $ref: '#/components/schemas/esper_cloud_api_GoogleEnterprise'
        '400':
          description: Invalid request.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '401':
          description: Authorization information is missing or invalid.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
      security:
        - esper_cloud_api_apiKey: []
  /v0/enterprise/{enterprise_id}/emm/{emm_id}:
    get:
      x-badges:
        - name: Stable
          color: green
      tags:
        - esper_cloud_api_Application
      summary: Get Google enterprise information
      description: >-
        Get a specific Google Enterprise (EMM) instance for the enterprise.
        Retrieves the details of a single Google Enterprise binding identified
        by emm_id, including its association with the Esper enterprise and the
        google_enterprise_id that links it to Google's EMM infrastructure.


        **Common Use Cases** 


        Confirming the details of a specific EMM binding before performing
        GMS-dependent operations, retrieving the google_enterprise_id for use in
        downstream **Workflow**s, and validating that the correct EMM instance
        is associated with the enterprise before managing web tokens or Google
        Play applications.


        **Workflow**


        1. Call GET /v0/enterprise/{enterprise_id}/emm/ to retrieve the emm_id.

        2. Call this endpoint to confirm the details of a specific EMM instance.
      operationId: getEMMInstance
      parameters:
        - name: enterprise_id
          in: path
          description: A UUID string identifying this enterprise.
          required: true
          schema:
            type: string
        - name: emm_id
          in: path
          description: An integer representing the ID of enterprise.
          required: true
          schema:
            type: integer
      responses:
        '200':
          description: successful operation
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_GoogleEnterprise'
        '401':
          description: Authorization information is missing or invalid.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
      security:
        - esper_cloud_api_apiKey: []
  /v0/enterprise/{enterprise_id}/emm/{emm_id}/webtoken/:
    get:
      x-badges:
        - name: Stable
          color: green
      tags:
        - esper_cloud_api_Application
      summary: List webtokens
      operationId: getWebtokens
      description: >-
        List all web tokens for a Google Enterprise (EMM) instance. Retrieves
        all web tokens associated with the specified EMM binding, including each
        token's value, parent_url, active status, and creation timestamp.
        Retrieve your webtoken from the Apps section of the console by using the
        inspector's network tab.


        About Web Tokens


        A Google web token is a credential required to access the Managed Google
        Play interface within the Esper Console. Web tokens are also a key part
        of the EMM enterprise enrollment **Workflow** — if token generation or
        retrieval fails, it can block new device onboarding and prevent access
        to app management features entirely.


        **Common Use Cases** 


        Retrieving existing web tokens to verify their active status before
        launching the Managed Play Store interface, auditing which parent_url
        values are authorized for console Google Play Store use, and obtaining a
        webtoken_id needed to update or delete a specific token.


        **Workflow**


        1. Call GET /v0/enterprise/{enterprise_id}/emm/ to retrieve the emm_id
        for the enterprise's Google Enterprise binding.

        2. Call this endpoint to list all existing web tokens and check their
        active status and associated parent_url.

        3. If a suitable active token exists, use it to access the Managed
        Google Play interface for app selection, managed configurations, and
        Play Store customization.
      parameters:
        - name: enterprise_id
          in: path
          description: A UUID string identifying this enterprise.
          required: true
          schema:
            type: string
        - name: emm_id
          in: path
          description: An integer representing the ID of enterprise.
          required: true
          schema:
            type: integer
      responses:
        '200':
          description: successful operation
          content:
            application/json:
              schema:
                required:
                  - count
                  - results
                properties:
                  count:
                    type: integer
                  next:
                    type: string
                    format: url
                    nullable: true
                  previous:
                    type: string
                    format: url
                    nullable: true
                  results:
                    type: array
                    items:
                      $ref: '#/components/schemas/esper_cloud_api_GoogleWebToken'
        '401':
          description: Authorization information is missing or invalid.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '404':
          description: Not Found.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
      security:
        - esper_cloud_api_apiKey: []
    post:
      x-badges:
        - name: Stable
          color: green
      tags:
        - esper_cloud_api_Application
      summary: Creates a webtoken instance
      description: >-
        We recommend enrolling in EMM (Google Play) through the UI. See [Setting
        Up Google
        Play](https://help.esper.io/hc/en-us/articles/12652188061585-Setting-Up-Google-Play-EMM-Enrollment)
        for more information. Create a new web token for a Google Enterprise
        (EMM) instance. Generates a new web token scoped to a specified
        parent_url, which can then be used to access the Managed Google Play
        interface within the Esper Console or a custom management application.
        Returns the created token including its id, token value, parent_url, and
        active status.


        Required request body fields


        emm — the integer ID of the EMM instance (from GET
        /v0/enterprise/{enterprise_id}/emm/)


        parent_url — the URL of the application that will host the Play Store
        iFrame; must use the https scheme
      operationId: createWebtoken
      parameters:
        - name: enterprise_id
          in: path
          description: A UUID string identifying this enterprise.
          required: true
          schema:
            type: string
        - name: emm_id
          in: path
          description: An integer representing the ID of enterprise.
          required: true
          schema:
            type: integer
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/esper_cloud_api_GoogleWebTokenUpdate'
        required: true
      responses:
        '201':
          description: successful operation
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_GoogleWebToken'
        '401':
          description: Authorization information is missing or invalid.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
      security:
        - esper_cloud_api_apiKey: []
  /v0/enterprise/{enterprise_id}/emm/{emm_id}/webtoken/{webtoken_id}:
    get:
      x-badges:
        - name: Stable
          color: green
      tags:
        - esper_cloud_api_Application
      summary: Get webtoken instance
      description: >-
        Get a specific web token for a Google Enterprise (EMM) instance. See
        [Setting Up Google
        Play](https://help.esper.io/hc/en-us/articles/12652188061585-Setting-Up-Google-Play-EMM-Enrollment)
        for more information. Retrieves the details of a single web token
        identified by webtoken_id, including its token value, associated emm ID,
        parent_url, active status, and creation timestamp.


        **Common Use Cases** Verifying the active status and parent_url of a
        specific token before using it to render the Managed Google Play iFrame,
        retrieving token details for auditing or troubleshooting app management
        issues, and confirming a token's configuration before updating or
        deleting it.


        **Workflow**:


        1. Call GET /v0/enterprise/{enterprise_id}/emm/ to retrieve the emm_id
        for the enterprise's Google Enterprise binding.

        2. Call GET /v0/enterprise/{enterprise_id}/emm/{emm_id}/webtoken/ to
        list all web tokens and identify the webtoken_id for the token you want
        to inspect.

        4. Call this endpoint to retrieve the full details of the specific
        token.

        5. If the token is active and the parent_url is correct, use the token
        value to authenticate the Managed Google Play iFrame.

        6. Use PUT
        /v0/enterprise/{enterprise_id}/emm/{emm_id}/webtoken/{webtoken_id}/ to
        update the token, or DELETE to remove it if it is no longer needed.
        After deleting, reach out to Esper Support.
      operationId: getWebtokenInstance
      parameters:
        - name: enterprise_id
          in: path
          description: A UUID string identifying this enterprise.
          required: true
          schema:
            type: string
        - name: emm_id
          in: path
          description: An integer representing the ID of enterprise.
          required: true
          schema:
            type: integer
        - name: webtoken_id
          in: path
          description: An integer identifying the webtoken.
          required: true
          schema:
            type: string
      responses:
        '200':
          description: successful operation
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_GoogleWebToken'
        '401':
          description: Authorization information is missing or invalid.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '404':
          description: Not Found.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
      security:
        - esper_cloud_api_apiKey: []
    put:
      x-badges:
        - name: Stable
          color: green
      tags:
        - esper_cloud_api_Application
      summary: Updates webtoken instance
      description: >-
        See [Setting Up Google
        Play](https://help.esper.io/hc/en-us/articles/12652188061585-Setting-Up-Google-Play-EMM-Enrollment)
        for more information. We generally recommend updating the token via the
        UI. Update a specific web token for a Google Enterprise (EMM) instance.
        Performs a full replacement of the web token record identified by
        webtoken_id, updating its configuration and returning the updated token
        object.


        Required request body fields:


        emm — the integer ID of the EMM instance (from GET
        /v0/enterprise/{enterprise_id}/emm/)

        parent_url — the URL of the application that will host the Play Store
        iFrame; must use the https scheme
      operationId: updateWebtokenInstance
      parameters:
        - name: enterprise_id
          in: path
          description: A UUID string identifying this enterprise.
          required: true
          schema:
            type: string
        - name: emm_id
          in: path
          description: An integer representing the ID of enterprise.
          required: true
          schema:
            type: integer
        - name: webtoken_id
          in: path
          description: An integer identifying the webtoken.
          required: true
          schema:
            type: string
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/esper_cloud_api_GoogleWebTokenUpdate'
      responses:
        '200':
          description: successful operation
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_GoogleWebToken'
        '400':
          description: Invalid request.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '401':
          description: Authorization information is missing or invalid.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
      security:
        - esper_cloud_api_apiKey: []
    patch:
      x-badges:
        - name: Stable
          color: green
      tags:
        - esper_cloud_api_Application
      summary: Patches webtoken instance
      description: >-
        We recommend handling EMM updates through the UI. See [Setting Up Google
        Play](https://help.esper.io/hc/en-us/articles/12652188061585-Setting-Up-Google-Play-EMM-Enrollment)
        for more information. Partially update a specific web token for a Google
        Enterprise (EMM) instance. Applies a partial update to the web token
        record identified by webtoken_id, modifying only the fields included in
        the request body and returning the updated token object. 


        Updatable fields:


        emm — the integer ID of the associated EMM instance

        parent_url — the URL of the application hosting the Play Store iFrame;
        must use the https scheme

        is_active — whether the token is currently active
      operationId: patchWebtokenInstance
      parameters:
        - name: enterprise_id
          in: path
          description: A UUID string identifying this enterprise.
          required: true
          schema:
            type: string
        - name: emm_id
          in: path
          description: An integer representing the ID of enterprise.
          required: true
          schema:
            type: integer
        - name: webtoken_id
          in: path
          description: An integer identifying the webtoken.
          required: true
          schema:
            type: string
      requestBody:
        content:
          application/json:
            schema:
              $ref: >-
                #/components/schemas/esper_cloud_api_GoogleWebTokenUpdateNoRequirements
      responses:
        '200':
          description: successful operation
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_GoogleWebToken'
        '400':
          description: Invalid request.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '401':
          description: Authorization information is missing or invalid.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
      security:
        - esper_cloud_api_apiKey: []
    delete:
      x-badges:
        - name: Stable
          color: green
      tags:
        - esper_cloud_api_Application
      summary: Deletes a webtoken instance
      description: >-
        We recommend unenrollment from the UI. See [Setting Up Google
        Play](https://help.esper.io/hc/en-us/articles/12652188061585-Setting-Up-Google-Play-EMM-Enrollment)
        for more information. Delete a specific web token for a Google
        Enterprise (EMM) instance. Permanently removes the web token identified
        by webtoken_id from the specified EMM instance. Returns an empty
        response on success (204 No Content). Reach out to Esper Support after
        unsubscribing from Managed Google Play. 
      operationId: deleteWebtokenInstance
      parameters:
        - name: enterprise_id
          in: path
          description: A UUID string identifying this enterprise.
          required: true
          schema:
            type: string
        - name: emm_id
          in: path
          description: An integer representing the ID of enterprise.
          required: true
          schema:
            type: integer
        - name: webtoken_id
          in: path
          description: An integer identifying the webtoken.
          required: true
          schema:
            type: string
      responses:
        '204':
          description: The resource was deleted successfully.
        '400':
          description: Invalid request.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '401':
          description: Authorization information is missing or invalid.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '403':
          description: Forbidden, no permission to perform this action.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '404':
          description: Not Found.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
      security:
        - esper_cloud_api_apiKey: []
  /v0/enterprise/{enterprise_id}/emm/{emm_id}/product/:
    get:
      x-badges:
        - name: Stable
          color: green
      tags:
        - esper_cloud_api_Application
      summary: List Google Play applications
      description: >-
        List all Google Play applications approved for a Google Enterprise (EMM)
        instance. See [Managing Google Play
        Apps](https://help.esper.io/hc/en-us/articles/12652339776401-Managing-Google-Play-Store-Apps)
        for more information. Retrieves a paginated list of Google Play apps
        that have been approved and associated with the specified EMM binding,
        including each app's google_product_id, package_name, title, icon_url,
        min_sdk_version, active status, and approval state. Results can be
        filtered by google_product_id, package_name, or creation and update
        timestamps.


        About Google Play Products

         When an enterprise enrolls in Google EMM, administrators approve specific apps from the Google Play Store for use across their GMS device fleet. Each approved app is represented as a product record tied to the EMM instance. These product records are the foundation for silent app installation and Play Store customization — only apps that appear in this list can be silently pushed to devices or made available to end users through the managed Play Store.

        Available query parameters


        google_product_id — filter by the Google product ID (formatted as
        app:<package_name>, e.g. app:com.android.chrome)

        package_name — filter by the app's package name

        created_on — filter by the date the product record was created

        updated_on — filter by the date the product record was last updated

        limit / offset — for pagination (default page size: 20)


        **Workflow**:


        1. Call GET /v0/enterprise/{enterprise_id}/emm/ to retrieve the emm_id
        for the enterprise's Google Enterprise binding.

        2. Call this endpoint to retrieve the list of approved Google Play apps
        and identify the google_product_id or id for the app you want to work
        with.

        3. Use GET
        /v0/enterprise/{enterprise_id}/emm/{emm_id}/product/{product_id}/ to
        retrieve full details for a specific app.
      operationId: getGoogleApps
      parameters:
        - name: enterprise_id
          in: path
          description: A UUID string identifying this enterprise.
          required: true
          schema:
            type: string
        - name: emm_id
          in: path
          description: An integer representing the ID of enterprise.
          required: true
          schema:
            type: integer
        - name: google_product_id
          in: query
          description: filter by Google product id
          schema:
            type: string
        - name: package_name
          in: query
          description: filter by package name
          schema:
            type: string
        - name: created_on
          in: query
          description: filter by date app created
          schema:
            type: string
            format: date-time
        - name: updated_on
          in: query
          description: filter by date app updated
          schema:
            type: string
            format: date-time
        - name: limit
          in: query
          description: Number of results to return per page.
          schema:
            type: integer
            default: 20
        - name: offset
          in: query
          description: Return results from this index.
          schema:
            type: integer
            default: 0
      responses:
        '200':
          description: successful operation
          content:
            application/json:
              schema:
                required:
                  - count
                  - results
                properties:
                  count:
                    type: integer
                  next:
                    type: string
                    format: url
                    nullable: true
                  previous:
                    type: string
                    format: url
                    nullable: true
                  results:
                    type: array
                    items:
                      $ref: '#/components/schemas/esper_cloud_api_GoogleProduct'
        '401':
          description: Authorization information is missing or invalid.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
      security:
        - esper_cloud_api_apiKey: []
    post:
      x-badges:
        - name: Stable
          color: green
      tags:
        - esper_cloud_api_Application
      summary: Post a Google play application
      description: >-
        Add a Google Play application to a Google Enterprise (EMM) instance. We
        recommend adding and approving Google Play applications through the UI.
        See Managing [Google Play
        Store](https://help.esper.io/hc/en-us/articles/12652339776401-Managing-Google-Play-Store-Apps)Apps
        for more information.
      operationId: addGoogleApp
      parameters:
        - name: enterprise_id
          in: path
          description: A UUID string identifying this enterprise.
          required: true
          schema:
            type: string
        - name: emm_id
          in: path
          description: An integer representing the ID of enterprise.
          required: true
          schema:
            type: integer
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/esper_cloud_api_GoogleProduct'
        required: true
      responses:
        '201':
          description: successful operation
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_GoogleProduct'
        '400':
          description: Invalid request.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '401':
          description: Authorization information is missing or invalid.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '404':
          description: Not Found.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
      security:
        - esper_cloud_api_apiKey: []
  /v0/enterprise/{enterprise_id}/emm/{emm_id}/product/{product_id}:
    get:
      x-badges:
        - name: Stable
          color: green
      tags:
        - esper_cloud_api_Application
      summary: Get application information
      description: >-
        Get a specific Google Play application from a Google Enterprise (EMM)
        instance. Retrieves the full details of a single Google Play product
        record identified by product_id, including its google_product_id,
        package_name, title, icon_url, min_sdk_version, active status, and
        approval state.


        **Common Use Cases** 


        Confirming the google_product_id and active status of a specific app
        before using it in a silent install command, verifying that an app's
        approval state is valid after it has been added to the EMM instance, and
        retrieving full product details for auditing or troubleshooting app
        deployment issues.


        **Best Practices** 


        Use GET /v0/enterprise/{enterprise_id}/emm/{emm_id}/product/ first to
        list all product records and obtain the product_id (the Esper-generated
        UUID id field in the response) before calling this endpoint.
      operationId: getAppInfo
      parameters:
        - name: enterprise_id
          in: path
          description: A UUID string identifying this enterprise.
          required: true
          schema:
            type: string
        - name: emm_id
          in: path
          description: An integer representing the ID of enterprise.
          required: true
          schema:
            type: integer
        - name: product_id
          in: path
          description: A string identifying the product.
          required: true
          schema:
            type: string
      responses:
        '200':
          description: successful operation
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_GoogleProduct'
        '401':
          description: Authorization information is missing or invalid.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
      security:
        - esper_cloud_api_apiKey: []
    put:
      x-badges:
        - name: Stable
          color: green
      tags:
        - esper_cloud_api_Application
      summary: Update application instance
      description: >-
        Update or approve a specific Google Play application for a Google
        Enterprise (EMM) instance. We recommend handling Google Play application
        modifications via the UI. See [Managing Google Play Store
        Apps](https://help.esper.io/hc/en-us/articles/12652339776401-Managing-Google-Play-Store-Apps)
        for more information.
      operationId: updateAppInfo
      parameters:
        - name: enterprise_id
          in: path
          description: A UUID string identifying this enterprise.
          required: true
          schema:
            type: string
        - name: emm_id
          in: path
          description: An integer representing the ID of enterprise.
          required: true
          schema:
            type: integer
        - name: product_id
          in: path
          description: A string identifying the product.
          required: true
          schema:
            type: string
      requestBody:
        content:
          '*/*':
            schema:
              type: object
              properties:
                icon_url:
                  type: string
                  format: url
                is_active:
                  title: Is Active
                  type: boolean
                updated_on:
                  type: string
                  format: date-time
                min_sdk_version:
                  title: Minimum SDK Version
                  type: integer
                unapproved:
                  type: boolean
                  title: Unapproving an app deletes it
        required: false
      responses:
        '200':
          description: successful operation
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_GoogleProduct'
        '204':
          description: The resource was deleted successfully.
        '400':
          description: Invalid request.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '401':
          description: Authorization information is missing or invalid.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
      security:
        - esper_cloud_api_apiKey: []
    patch:
      x-badges:
        - name: Stable
          color: green
      tags:
        - esper_cloud_api_Application
      summary: Patch application instance
      description: >-
        Partially update specific fields of a managed Google Play application
        for a Google Enterprise (EMM) instance. We recommend handling Google
        Play application modifications via the UI. See [Managing Google Play
        Store
        Apps](https://help.esper.io/hc/en-us/articles/12652339776401-Managing-Google-Play-Store-Apps)
        for more information.
      operationId: patchAppInfo
      parameters:
        - name: enterprise_id
          in: path
          description: A UUID string identifying this enterprise.
          required: true
          schema:
            type: string
        - name: emm_id
          in: path
          description: An integer representing the ID of enterprise.
          required: true
          schema:
            type: integer
        - name: product_id
          in: path
          description: A string identifying the product.
          required: true
          schema:
            type: string
      requestBody:
        content:
          '*/*':
            schema:
              type: object
              properties:
                icon_url:
                  type: string
                  format: url
                is_active:
                  title: Is Active
                  type: boolean
                updated_on:
                  type: string
                  format: date-time
                min_sdk_version:
                  title: Minimum SDK Version
                  type: integer
        required: false
      responses:
        '200':
          description: successful operation
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_PatchGoogleProduct'
        '204':
          description: The resource was deleted successfully.
        '400':
          description: Invalid request.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '401':
          description: Authorization information is missing or invalid.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
      security:
        - esper_cloud_api_apiKey: []
    delete:
      x-badges:
        - name: Stable
          color: green
      tags:
        - esper_cloud_api_Application
      summary: Delete application instance
      description: >-
        Delete application. Permanently removes an application from the
        enterprise. This action deletes the application record and its
        associated metadata, preventing it from being assigned to devices,
        policies, or blueprints. Once deleted, the application cannot be managed
        or distributed unless it is re-uploaded.


        **Common Use Cases** 


        Removing deprecated or unsupported applications, cleaning up unused or
        test applications, eliminating duplicate entries, or decommissioning
        applications that are no longer approved for distribution.


        **Best Practices**


        Before deleting an application, download a copy for backup and archival
        purposes. To do this, navigate to the Apps section in the console and
        download the application package. Deletion is permanent and cannot be
        undone.


        Additionally, ensure the application is not referenced in any blueprints
        prior to deletion. An application associated with a blueprint must be
        removed from that blueprint before it can be successfully deleted.
        Review device and blueprint assignments to avoid unintended disruption.


        **Workflow**


        Use the List apps in enterprise endpoint to retrieve the application_id.


        Check whether the application is present in any blueprints by calling:

        GET https://{foo}-api.esper.cloud/api/v2/blueprints/


        If the application appears in one or more blueprints, note the relevant
        blueprint_id values.


        For each affected blueprint, update it to remove the application entry
        by calling:

        PUT https://{foo}-api.esper.cloud/api/v2/blueprints/{blueprint_id}/


        After the application has been removed from all blueprints, call this
        endpoint with the application_id to permanently delete the application
        from the enterprise.
      operationId: deleteAppInstance
      parameters:
        - name: enterprise_id
          in: path
          description: A UUID string identifying this enterprise.
          required: true
          schema:
            type: string
        - name: emm_id
          in: path
          description: An integer representing the ID of enterprise.
          required: true
          schema:
            type: integer
        - name: product_id
          in: path
          description: A string identifying the product.
          required: true
          schema:
            type: string
      responses:
        '204':
          description: The resource was deleted successfully.
        '400':
          description: Invalid request.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '401':
          description: Authorization information is missing or invalid.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '403':
          description: Forbidden, no permission to perform this action.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '404':
          description: Not Found.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
      security:
        - esper_cloud_api_apiKey: []
  /v0/enterprise/{enterprise_id}/emm/{emm_id}/product/{product_id}/install/:
    get:
      x-badges:
        - name: Stable
          color: green
      tags:
        - esper_cloud_api_Application
      summary: List product installations
      description: >-
        List all installation records for Google Play applications on a Google
        Enterprise (EMM) instance. Retrieves a paginated list of installation
        records for the specified product, each representing the install state
        of the app on a specific GMS device. Results can be filtered by Google
        device ID, install state, version code, creation timestamp range, and
        active status. 



        **Best Practices** 


        Call GET /v0/enterprise/{enterprise_id}/emm/{emm_id}/product/ to
        retrieve the Esper-generated id UUID for the app you want to audit —
        this is the value used as product_id in the path.
      operationId: listProducts
      parameters:
        - name: enterprise_id
          in: path
          description: A UUID string identifying this enterprise.
          required: true
          schema:
            type: string
        - name: emm_id
          in: path
          description: An integer representing the ID of enterprise.
          required: true
          schema:
            type: integer
        - name: product_id
          in: path
          description: A string identifying the product.
          required: true
          schema:
            type: string
        - name: google_product
          in: query
          description: Filter by Google product
          schema:
            type: string
        - name: google_device
          in: query
          description: Filter by Google device
          schema:
            type: string
        - name: install_state
          in: query
          description: Filter by install state
          schema:
            type: string
        - name: version_code
          in: query
          description: Filter by version code
          schema:
            type: string
        - name: created_on_gt
          in: query
          description: filter installations created after a given timestamp
          schema:
            type: string
            format: datetime
        - name: created_on_lt
          in: query
          description: filter installations created before a given timestamp
          schema:
            type: string
            format: datetime
        - name: is_active
          in: query
          description: filter by active installations
          schema:
            type: boolean
      responses:
        '200':
          description: successful operation
          content:
            application/json:
              schema:
                required:
                  - count
                  - results
                properties:
                  count:
                    type: integer
                  next:
                    type: string
                    format: url
                    nullable: true
                  previous:
                    type: string
                    format: url
                    nullable: true
                  results:
                    type: array
                    items:
                      $ref: >-
                        #/components/schemas/esper_cloud_api_GoogleProductInstall
        '401':
          description: Authorization information is missing or invalid.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '404':
          description: Not Found.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
      security:
        - esper_cloud_api_apiKey: []
  /v1/enterprise/{enterprise_id}/applications-minimal/:
    get:
      x-badges:
        - name: Stable
          color: green
      tags:
        - esper_cloud_api_Application
      summary: Gets minimum information regarding application
      description: >-
        List minimal application information for all applications in the
        enterprise. Returns a lightweight list containing only the id (UUID) and
        package_name for each application uploaded to the enterprise. Use this
        endpoint instead of the full application list endpoints when you only
        need to look up an application_id by package name, or build a quick
        reference map of all applications in the enterprise without the overhead
        of retrieving full application metadata.


        This endpoint returns Android applications only. For other platforms,
        use the following alternatives:


        iOS (tenant/enterprise apps): GET /v2/tenant-apps/ — returns iOS IPAs
        and supports filtering by package_name and app_name

        iOS (VPP and App Store apps): GET /v2/ios-apps/ — returns information
        about VPP-managed and App Store iOS apps

        iOS (unified app list including webclips): GET /v2/apps/ — returns a
        unified list of iOS apps and webclips for the tenant


        **Workflow**


        Call this endpoint to retrieve the full list of Android application id
        and package_name pairs for the enterprise.

        Identify the application_id UUID for the package you want to work with.

        Use GET
        /v1/enterprise/{enterprise_id}/application/{application_id}/version/ to
        retrieve available versions for that application.

        Use the version_id from step 3 in POST /commands/v0/commands/ to issue
        an install command to target devices.
      operationId: getMinAppInfo
      parameters:
        - name: enterprise_id
          in: path
          description: A UUID string identifying this enterprise.
          required: true
          schema:
            type: string
      responses:
        '200':
          description: successful operation
          content:
            application/json:
              schema:
                required:
                  - count
                  - results
                properties:
                  count:
                    type: integer
                  next:
                    type: string
                    format: url
                    nullable: true
                  previous:
                    type: string
                    format: url
                    nullable: true
                  results:
                    type: array
                    items:
                      properties:
                        id:
                          type: string
                          format: uuid
                        package_name:
                          type: string
        '401':
          description: Authorization information is missing or invalid.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '404':
          description: Not Found.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
      security:
        - esper_cloud_api_apiKey: []
  /enterprise/{enterprise_id}/device/:
    get:
      x-badges:
        - name: Stable
          color: green
      tags:
        - esper_cloud_api_AndroidDevice
      summary: Fetch all devices in an enterprise
      description: >-
        ⚠️ Android only. This endpoint applies exclusively to Android-managed
        devices enrolled in Esper. For other devices, use the other device
        management endpoints.


        Lists all devices enrolled in an enterprise, with rich filtering
        options.


        Returns a paginated collection of DeviceInfo records with filters for
        device name, group, IMEI, serial number, state, brand, GMS support,
        tags, blueprint assignment, and more. Default page size is 20.


        About List Enterprise Devices


        Devices in Esper represent Android endpoints enrolled under enterprise
        management. Each device record contains hardware identifiers (IMEI,
        serial), current state, group membership, blueprint assignment, and
        status metadata. The group filter traverses the full subtree — filtering
        by a parent group will include all devices in its subgroups. This
        endpoint is the primary entry point for fleet-wide device discovery and
        inventory.


        **Key Query Parameters**


        name — filter by device display name

        group — filter by group UUID; returns all devices in that group and all
        of its subgroups

        imei — filter by IMEI number

        serial — filter by device serial number

        state — filter by enrollment state (see DeviceStateEnum)

        brand — filter by device manufacturer/brand

        is_gms — filter for GMS (Google Mobile Services)-capable devices

        search — free-text search across device name, IMEI, and MAC address

        tags — partial text search across device tags

        assigned_blueprint_id — filter devices by their assigned blueprint UUID

        current_blueprint_id — filter devices by the blueprint currently applied

        current_blueprint_version_id — filter by the specific blueprint version
        currently applied

        limit — results per page (default: 20)


        **Common Use Cases**


        Enumerate all devices in a specific group (including subgroups) for bulk
        operations or reporting

        Search for a device by serial number or IMEI when responding to a field
        support request

        Filter by blueprint assignment to identify devices running a specific
        configuration or a stale blueprint version


        **Best Practices**


        Use the group filter to scope operations to a target group's subtree
        rather than processing the full enterprise list

        Combine search with state to quickly isolate enrolled-but-offline
        devices in large fleets

        Use assigned_blueprint_id vs. current_blueprint_id deliberately — a
        device may have a new blueprint assigned but not yet applied


        **Workflow**


        Call this endpoint with relevant filters (group, state, blueprint) to
        identify the target device set

        Collect device_id values from the paginated results

        Use individual device IDs for detail lookups, command dispatch, or app
        queries
      operationId: getAllDevices
      parameters:
        - name: enterprise_id
          in: path
          description: ID of the enterprise
          required: true
          schema:
            type: string
            format: uuid
        - name: name
          in: query
          description: filter by device name
          schema:
            type: string
        - name: group
          in: query
          description: >-
            filter by group id. It will list all the devices under this gorup
            including the subgroups
          schema:
            type: string
            format: uuid
        - name: imei
          in: query
          description: filter by imei
          schema:
            type: string
        - name: serial
          in: query
          description: filter by serial number
          schema:
            type: string
        - name: state
          in: query
          schema:
            $ref: '#/components/schemas/esper_cloud_api_DeviceStateEnum'
        - name: brand
          in: query
          description: filter by brand
          schema:
            type: string
        - name: is_gms
          in: query
          description: filter for gms devices
          schema:
            type: boolean
        - name: search
          in: query
          description: A search term. Search by device name, imei or mac address
          schema:
            type: string
        - name: tags
          in: query
          description: A partial text search for device tags
          schema:
            type: string
        - name: assigned_blueprint_id
          in: query
          description: Filter by assigned blueprint id
          schema:
            type: string
            format: uuid
        - name: current_blueprint_id
          in: query
          description: Filter by current blueprint id
          schema:
            type: string
            format: uuid
        - name: current_blueprint_version_id
          in: query
          description: Filter by current blueprint version id
          schema:
            type: string
            format: uuid
        - name: limit
          in: query
          description: Number of results to return per page.
          schema:
            type: integer
            default: 20
        - name: offset
          in: query
          description: Return results from this index.
          schema:
            type: integer
            default: 0
      responses:
        '200':
          description: successful operation
          content:
            application/json:
              schema:
                type: object
                properties:
                  count:
                    type: integer
                    format: int64
                  next:
                    type: string
                    format: url
                  previous:
                    type: string
                    format: url
                  results:
                    type: array
                    items:
                      $ref: '#/components/schemas/esper_cloud_api_DeviceInfo'
        '401':
          description: Authorization information is missing or invalid.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '404':
          description: Not Found.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
      security:
        - esper_cloud_api_apiKey: []
  /enterprise/{enterprise_id}/device/{device_id}/:
    get:
      x-badges:
        - name: Legacy
          color: orange
      tags:
        - esper_cloud_api_AndroidDevice
      summary: Fetch device details by ID
      description: >-
        ⚠️ Android only. This endpoint applies exclusively to Android-managed
        devices enrolled in Esper. 


        Alternative Available


        Use the v2 endpoint /v2/devices/{id} for an updated and
        forward-compatible device model, especially in multi-OS environments.


        Retrieves the full DeviceInfo record for a single enrolled device by its
        UUID.

        Returns comprehensive device metadata including hardware identifiers,
        enrollment state, group membership, applied and assigned blueprint
        versions, and status information. Use when you already have a device_id
        and need complete, authoritative device detail.


        About Get Device


        The DeviceInfo object is Esper's full representation of an enrolled
        Android device. It includes all fields returned in list results, plus
        any additional status and configuration detail associated with the
        device's current enrollment state. Device IDs are stable UUIDs and do
        not change after enrollment; they are the primary reference for all
        device-specific API operations — commands, app installs, event feeds,
        and status queries.


        Key Fields


        device_id — path parameter UUID; Esper's stable internal identifier for
        this device


        Blueprint fields — reflect the gap between assigned_blueprint_id (what's
        intended) and current_blueprint_id / current_blueprint_version_id
        (what's applied)


        Enrollment state — current device lifecycle state (see DeviceStateEnum)


        **Common Use Cases**


        Retrieve full device details after discovering a device_id from a list
        or event payload


        Confirm current enrollment state before issuing a command or checking
        compliance


        Inspect blueprint assignment vs. applied blueprint to detect
        configuration drift


        **Best Practices**


        Use this endpoint for authoritative single-device lookups rather than
        scanning list results — it avoids pagination overhead and returns a
        complete record.

        Check state before dispatching commands; commands may not execute on
        devices in offline or unenrolled states.

        Store the device_id UUID in your system — it is the stable key for all
        downstream device operations and does not change.


        **Workflow**


        Obtain device_id from a device list call, enrollment event, or stored
        reference.

        Call this endpoint to retrieve the full DeviceInfo record.

        Use the returned state and configuration data to determine the
        appropriate next action (command, install, group operation).
      operationId: getDeviceById
      parameters:
        - name: enterprise_id
          in: path
          description: ID of the enterprise
          required: true
          schema:
            type: string
            format: uuid
        - name: device_id
          in: path
          description: ID of the device
          required: true
          schema:
            type: string
            format: uuid
      responses:
        '200':
          description: successful operation
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_DeviceInfo'
        '400':
          description: Bad request
      security:
        - esper_cloud_api_apiKey: []
  /enterprise/{enterprise_id}/device/{device_id}/app/:
    get:
      x-badges:
        - name: Legacy
          color: orange
      tags:
        - esper_cloud_api_AndroidDevice
      summary: List all device apps
      description: >-
        ⚠️ Android only. This endpoint applies exclusively to Android-managed
        devices enrolled in Esper. 

        Alternative Available


        For iOS and Windows device applications, use /api/v2/tenant-esper-apps


        Lists all apps present on a specific enrolled device, as tracked by
        Esper.

        Returns a paginated DeviceApp collection reflecting the apps Esper is
        aware of on the device, filterable by package name or app name. Default
        page size is 20.


        About List Device Apps


        The DeviceApp resource represents the per-device app inventory as seen
        by Esper — each record corresponds to an app instance on the device,
        tied to the device's reported state. This differs from the enterprise
        application library (.../application/) which tracks apps available for
        deployment; the device app list reflects what is actually installed and
        known on a given device. Results can be filtered by package name for
        precise lookups or searched by app name for broader discovery.


        **Key Query Parameters**


        package_name — filter by exact Android package name (e.g.
        com.example.app)


        whitelisted — filter by whitelist status


        search — free-text search by app name (app_name field)


        limit — results per page (default: 20)


        **Common Use Cases**


        Audit which apps are installed on a specific device for compliance or
        security review.

        Verify that a target app (by package name) is present on the device
        before or after an install command.

        Check whitelist status of installed apps on a managed device.


        **Best Practices**


        Use package_name for targeted lookups rather than fetching the full list
        and filtering client-side.

        Cross-reference results with the enterprise application library to
        identify apps on the device that are not managed through Esper.

        Confirm app presence via this endpoint after issuing an install command
        to verify successful delivery.


        **Workflow**


        Obtain the device_id from a device list or stored reference.

        Call this endpoint, optionally filtering by package_name or search.

        Review the returned DeviceApp records to confirm installation state and
        whitelist status.
      operationId: getDeviceApps
      parameters:
        - name: enterprise_id
          in: path
          description: A UUID string identifying this enterprise.
          required: true
          schema:
            type: string
        - name: device_id
          in: path
          description: A UUID string identifying device.
          required: true
          schema:
            type: string
        - name: package_name
          in: query
          description: Filter by Package name
          schema:
            type: string
        - name: whitelisted
          in: query
          description: Whitelist filter
          schema:
            type: string
        - name: search
          in: query
          description: A search term. Search by app_name.
          schema:
            type: string
        - name: limit
          in: query
          description: Number of results to return per page.
          schema:
            type: integer
            default: 20
        - name: offset
          in: query
          description: Return results from this index.
          schema:
            type: integer
      responses:
        '200':
          description: successful operation
          content:
            application/json:
              schema:
                required:
                  - count
                  - results
                type: object
                properties:
                  count:
                    type: integer
                  next:
                    type: string
                    format: url
                    nullable: true
                  previous:
                    type: string
                    format: url
                    nullable: true
                  results:
                    type: array
                    items:
                      $ref: '#/components/schemas/esper_cloud_api_DeviceApp'
        '401':
          description: Authorization information is missing or invalid.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '404':
          description: Not Found.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
      security:
        - esper_cloud_api_apiKey: []
  /enterprise/{enterprise_id}/device/{device_id}/app/{app_id}/:
    get:
      x-badges:
        - name: Stable
          color: green
      tags:
        - esper_cloud_api_AndroidDevice
      summary: Get device app details
      description: >-
        Get details of a specific app installed on an Android device. Retrieves
        the full DeviceApp record for a single app identified by app_id on the
        specified Android device, including the app's app_name, package_name,
        state, app_type, version_code, version_name, is_active, is_kiosk_app,
        is_esper_controlled, whitelisted, is_data_clearable, and
        is_uninstallable fields.


        **Workflow**


        Call this endpoint to retrieve the full list of Android application id
        and package_name pairs for the enterprise.

        Identify the application_id UUID for the package you want to work with.

        Use GET
        /v1/enterprise/{enterprise_id}/application/{application_id}/version/ to
        retrieve available versions for that application.

        Use the version_id from step 3 in POST /commands/v0/commands/ to issue
        an install command to target devices.
      operationId: getDeviceAppById
      parameters:
        - name: app_id
          in: path
          description: A UUID string identifying this device app.
          required: true
          schema:
            type: string
            format: uuid
        - name: enterprise_id
          in: path
          description: A UUID string identifying this device.
          required: true
          schema:
            type: string
        - name: device_id
          in: path
          description: A UUID string identifying this enteprise.
          required: true
          schema:
            type: string
      responses:
        '200':
          description: successful operation
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_DeviceApp'
        '401':
          description: Authorization information is missing or invalid.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '404':
          description: Not Found.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
      security:
        - esper_cloud_api_apiKey: []
  /enterprise/{enterprise_id}/device/{device_id}/install/:
    get:
      x-badges:
        - name: Stable
          color: green
      tags:
        - esper_cloud_api_AndroidDevice
      summary: List installed apps
      description: >-
        Get details of a specific app installed on an Android device. Retrieves
        the full DeviceApp record for a single app identified by app_id on the
        specified Android device, including the app's app_name, package_name,
        state, app_type, version_code, version_name, is_active, is_kiosk_app,
        is_esper_controlled, whitelisted, is_data_clearable, and
        is_uninstallable fields.


        This endpoint is for Android devices only. For other platforms use the
        following alternatives:


        iOS and other non-Android devices: GET
        /v2/devices/{deviceId}/device-apps/ — returns apps for a device and
        supports filtering by app type including VPP, TENANT_IOS, ESPER_IOS,
        WEBCLIP, ESPER_WINDOWS, and TENANT_WINDOWS


        **Common Use Cases** 


        Retrieving the full details of a specific app on an Android device to
        check its current state, version, or kiosk configuration, confirming
        whether an app is set as the kiosk app (is_kiosk_app: true) on a device,
        verifying app attributes such as is_uninstallable or is_data_clearable
        before issuing an uninstall or data-clear command, and auditing whether
        a specific app is whitelisted on a device.



        **Workflow**


        1. Call GET /enterprise/{enterprise_id}/device/{device_id}/app/ and
        filter by package_name to locate the app and retrieve its app_id.

        2. Call this endpoint to retrieve the full DeviceApp record for that
        specific app.

        3. Check state, version_code, and is_active to confirm the app's current
        status on the device.
      operationId: getAppInstalls
      parameters:
        - name: enterprise_id
          in: path
          description: A UUID string identifying this enterprise.
          required: true
          schema:
            type: string
        - name: device_id
          in: path
          description: A UUID string identifying device.
          required: true
          schema:
            type: string
        - name: device
          in: query
          description: filter by device id
          schema:
            type: string
        - name: package_name
          in: query
          description: filter by package name
          schema:
            type: string
        - name: application_name
          in: query
          description: filter by application name
          schema:
            type: string
        - name: install_state
          in: query
          description: filter by install state
          schema:
            type: string
        - name: limit
          in: query
          description: Number of results to return per page.
          schema:
            type: integer
            default: 20
        - name: offset
          in: query
          description: Return results from this index.
          schema:
            type: integer
            default: 0
      responses:
        '200':
          description: successful operation
          content:
            application/json:
              schema:
                required:
                  - count
                  - results
                type: object
                properties:
                  count:
                    type: integer
                  next:
                    type: string
                    format: url
                    nullable: true
                  previous:
                    type: string
                    format: url
                    nullable: true
                  results:
                    type: array
                    items:
                      $ref: '#/components/schemas/esper_cloud_api_AppInstall'
        '401':
          description: Authorization information is missing or invalid.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '404':
          description: Not Found.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
      security:
        - esper_cloud_api_apiKey: []
  /enterprise/{enterprise_id}/device/{device_id}/status/:
    get:
      x-badges:
        - name: Stable
          color: green
      tags:
        - esper_cloud_api_AndroidDevice
      summary: Get latest device event
      description: >-
        Get the latest status event for an Android device. Retrieves the most
        recent DeviceStatus record for the specified Android device, containing
        a data payload with the device's current telemetry snapshot — including
        battery, connectivity, memory, storage, and other real-time device state
        information — along with the associated device and enterprise references
        and the event created_on timestamp.

        This endpoint is for Android devices only. For other platforms, use the
        following alternatives:


        iOS, Linux, and Windows devices: GET /device/v0/devices/{id}/devicestate
        — returns current device state for non-Android platforms

        Android (v2): GET /v2/devices/{id}/ — returns a broader Android device
        record including current state fields in a more structured format


        Note The latest_event query parameter must be set to 1 to return the
        most recent status event. Without this parameter the endpoint may return
        a paginated list of historical status records rather than the current
        snapshot.

        **Common Use Cases** Retrieving a real-time telemetry snapshot of an
        Android device's current state before issuing commands, checking battery
        level, connectivity, and storage availability as part of a
        pre-deployment health check, monitoring device state in custom
        dashboards or alerting **Workflow**s, and diagnosing device issues by
        reviewing the most recent reported status.


        **Best Practices** 


        Always include latest_event=1 when you need the current device state
        rather than historical events — omitting it may return a paginated
        history rather than the snapshot you expect. For broader device metadata
        including policy assignments, group membership, and hardware
        information, use GET /enterprise/{enterprise_id}/device/{device_id}/
        instead. For a full history of device events over time, use GET
        /enterprise/{enterprise_id}/device/{device_id}/report/eventfeed/.
      operationId: getDeviceEvent
      parameters:
        - name: enterprise_id
          in: path
          description: A UUID string identifying this enterprise.
          required: true
          schema:
            type: string
        - name: device_id
          in: path
          description: A UUID string identifying device.
          required: true
          schema:
            type: string
        - name: latest_event
          in: query
          description: Returns the latest event. Must be set to 1.
          required: true
          schema:
            type: integer
      responses:
        '200':
          description: successful operation
          content:
            application/json:
              schema:
                required:
                  - count
                  - results
                type: object
                properties:
                  count:
                    type: integer
                  next:
                    type: string
                    format: url
                    nullable: true
                  previous:
                    type: string
                    format: url
                    nullable: true
                  results:
                    type: array
                    items:
                      $ref: '#/components/schemas/esper_cloud_api_DeviceStatus'
        '401':
          description: Authorization information is missing or invalid.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '404':
          description: Not Found.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
      security:
        - esper_cloud_api_apiKey: []
  /enterprise/{enterprise_id}/device/{device_id}/download/eventfeed/:
    get:
      x-badges:
        - name: Stable
          color: green
      tags:
        - esper_cloud_api_AndroidDevice
      summary: Download Event Feed for Device
      description: >-
        Download the event feed for an Android device. Retrieves a paginated,
        chronologically ordered list of EventFeed records for the specified
        Android device, each containing an event id, message_id,
        device_status_id, created_on timestamp, and a message describing what
        occurred — including commands issued, who issued them, and from which
        state they were issued. Results default to 250 records per page.


        This endpoint is for Android devices only. For group-level event
        history, use GET
        /enterprise/{enterprise_id}/group/{group_id}/download/eventfeed/
        instead.


        About the Event Feed


        The event feed is a chronological record of activity on a device,
        capturing commands, state transitions, and other significant events. It
        is the primary source for auditing device history, investigating
        incidents, and understanding the sequence of operations performed on a
        device. Each event links back to a device_status_id, which can be used
        to retrieve the full telemetry snapshot associated with that event.

        Available query parameters:


        limit — number of results per page (default: 250)

        offset — pagination offset (default: 0)


        **Common Use Cases** 


        Auditing the full history of commands issued to a specific Android
        device, investigating device incidents by reviewing the sequence of
        events leading up to a failure or unexpected state change, downloading a
        complete event log for offline analysis or compliance reporting, and
        correlating device events with command requests to verify that
        operations were executed as expected.


        **Best Practices** 


        For large event histories, use limit and offset to paginate through
        results rather than fetching everything in a single call. If you only
        need the most recent device status snapshot rather than a full event
        history, use GET
        /enterprise/{enterprise_id}/device/{device_id}/status/?latest_event=1
        instead — it is significantly lighter. For the Esper Console timeline
        view of device events, use GET
        /v1/enterprise/{enterprise_id}/device/{device_id}/report/eventfeed/
        instead, which returns the same data with a smaller default page size
        suited to UI rendering.


        **Workflow**


        1. Call GET /enterprise/{enterprise_id}/device/{device_id}/ to confirm
        the device details and retrieve the device_id.

        2. Call this endpoint to retrieve the full chronological event feed for
        the device.

        3. Use message and created_on to identify the events relevant to your
        investigation or audit.

        4. Use device_status_id from a specific event to retrieve the associated
        telemetry snapshot via GET
        /enterprise/{enterprise_id}/device/{device_id}/status/ if deeper context
        is needed.
      parameters:
        - name: enterprise_id
          in: path
          description: A UUID string identifying this enterprise.
          required: true
          schema:
            type: string
        - name: device_id
          in: path
          description: A UUID string identifying the device
          required: true
          schema:
            type: string
        - name: limit
          in: query
          description: Number of results to return per page.
          schema:
            type: integer
            default: 250
        - name: offset
          in: query
          description: Return results from this index.
          schema:
            type: integer
            default: 0
      responses:
        '200':
          description: successful operation
          content:
            application/json:
              schema:
                required:
                  - count
                  - results
                type: object
                properties:
                  count:
                    type: integer
                  next:
                    type: string
                    format: url
                    nullable: true
                  previous:
                    type: string
                    format: url
                    nullable: true
                  results:
                    type: array
                    items:
                      $ref: '#/components/schemas/esper_cloud_api_EventFeed'
        '401':
          description: Authorization information is missing or invalid.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
      security:
        - esper_cloud_api_apiKey: []
  /enterprise/{enterprise_id}/group/{group_id}/download/eventfeed/:
    get:
      x-badges:
        - name: Stable
          color: green
      tags:
        - esper_cloud_api_AndroidDevice
      summary: Download Event Feed for Group
      description: >-
        Download the event feed for an Android device group. Retrieves a
        paginated, chronologically ordered list of command request records for
        the specified group, each containing details of operations issued to the
        group. Results default to 250 records per page.


        This endpoint is for Android device groups only. For device-level event
        history, use GET
        /enterprise/{enterprise_id}/device/{device_id}/download/eventfeed/
        instead.

        About the Group Event Feed: The group event feed provides a
        chronological record of command requests issued at the group level,
        making it the primary source for auditing bulk operations across a
        device group. Rather than reviewing events device by device, this
        endpoint surfaces the group-level commands that were dispatched — useful
        for understanding the sequence of operations applied to a group as a
        whole, and for correlating group-level actions with individual device
        outcomes.


        **Common Use Cases** 


        Auditing the history of commands issued to a specific Android device
        group, investigating incidents by reviewing the sequence of group-level
        operations leading up to an unexpected fleet state, downloading a
        complete group command log for offline analysis or compliance reporting,
        and verifying that scheduled or bulk operations were dispatched to the
        group as expected.


        **Best Practices** 


        Use limit and offset to paginate through results for groups with long
        command histories rather than fetching everything in a single call. For
        individual device-level event history within the group, use GET
        /enterprise/{enterprise_id}/device/{device_id}/download/eventfeed/ per
        device. To check the execution status of a specific command request
        returned in this feed, use GET /commands/v0/status/?request={request_id}
        to retrieve per-device status records for that command.


        Available query parameters


        limit — number of results per page (default: 250)

        offset — pagination offset (default: 0)


        **Workflow**


        1. Call GET /enterprise/{enterprise_id}/devicegroup/ to list all groups
        and retrieve the group_id for the group you want to audit.

        2. Call this endpoint to retrieve the chronological command history for
        that group.

        3. Identify the command requests relevant to your investigation using
        the event details and timestamps.

        4. Use GET /commands/v0/status/?request={request_id} to retrieve
        per-device execution status for any specific command request returned in
        the feed.
      parameters:
        - name: enterprise_id
          in: path
          description: A UUID string identifying this enterprise.
          required: true
          schema:
            type: string
        - name: group_id
          in: path
          description: A UUID string identifying the group
          required: true
          schema:
            type: string
        - name: limit
          in: query
          description: Number of results to return per page.
          schema:
            type: integer
            default: 250
        - name: offset
          in: query
          description: Return results from this index.
          schema:
            type: integer
            default: 0
      responses:
        '200':
          description: successful operation
          content:
            application/json:
              schema:
                required:
                  - count
                  - results
                type: object
                properties:
                  count:
                    type: integer
                  next:
                    type: string
                    format: url
                    nullable: true
                  previous:
                    type: string
                    format: url
                    nullable: true
                  results:
                    type: array
                    items:
                      $ref: '#/components/schemas/esper_cloud_api_V0CommandRequest'
        '401':
          description: Authorization information is missing or invalid.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
      security:
        - esper_cloud_api_apiKey: []
  /v1/enterprise/{enterprise_id}/device/{device_id}/report/eventfeed/:
    get:
      x-badges:
        - name: Stable
          color: green
      tags:
        - esper_cloud_api_AndroidDevice
      summary: Lists event feed for device
      description: >-
        List event feed for device. Retrieves a device’s event history,
        including command activity and system events, in reverse-chronological
        order. The response is paginated and returns entries in the results
        array.


        About Device Event Feed


        The event feed provides an audit trail of significant device lifecycle
        events — enrollment state transitions, command executions, and status
        changes — as recorded by Esper. Each record includes a message field
        that describes the event in plain language (including the command issued
        and the initiating user), a device_status_id linking to the device
        status snapshot at the time of the event, and a message_id UUID. This
        endpoint returns paginated JSON; for bulk export of event history, use
        the download variant at GET .../device/{device_id}/download/eventfeed/
        (default page size: 250). 

        This endpoint is for Event Feed activities for device commands. Use (GET
        https://{foo}-api.esper.cloud/api/v0/devices/{deviceId}/operations/) for
        dispatch (Operations) commands. 


        **Common Use Cases**


        Auditing who issued commands and when, tracking command state changes
        (acknowledged → in progress → success/failure), investigating device
        activity over time, and correlating events to operational issues.


        **Best Practices**


        Use limit and pagination (next/previous, or offset) to manage large
        event histories and reduce response size. When troubleshooting a
        specific window of time, page in smaller increments to avoid missing
        relevant events.


        **Workflow**


        Identify the device_id using a device listing endpoint.


        Call this endpoint with the device_id to retrieve the device’s event
        feed.


        Follow the next URL (or increment offset) until you’ve collected the
        events you need.


        Learn more:
        https://help.esper.io/hc/en-us/articles/43110064004881-What-Are-Device-Commands
      operationId: getEventFeed
      parameters:
        - name: enterprise_id
          in: path
          description: A UUID string identifying this enterprise.
          required: true
          schema:
            type: string
        - name: device_id
          in: path
          description: A UUID string identifying the device
          required: true
          schema:
            type: string
        - name: limit
          in: query
          description: Number of results to return per page.
          schema:
            type: integer
            default: 20
        - name: offset
          in: query
          description: Return results from this index.
          schema:
            type: integer
            default: 0
      responses:
        '200':
          description: successful operation
          content:
            application/json:
              schema:
                required:
                  - count
                  - results
                type: object
                properties:
                  count:
                    type: integer
                  next:
                    type: string
                    format: url
                    nullable: true
                  previous:
                    type: string
                    format: url
                    nullable: true
                  results:
                    type: array
                    items:
                      $ref: '#/components/schemas/esper_cloud_api_EventFeed'
        '401':
          description: Authorization information is missing or invalid.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
      security:
        - esper_cloud_api_apiKey: []
  /enterprise/{enterprise_id}/devicegroup/:
    get:
      x-badges:
        - name: Stable
          color: green
      tags:
        - esper_cloud_api_Device Group
      summary: List device groups
      description: >-
        Returns a paginated list of all device groups in the enterprise. Device
        groups organize devices into logical collections by location, use case,
        or deployment stage, and serve as the primary unit for policy
        assignment, app deployment, and bulk commands.

         **Common Use Cases** 
         
         Discovering group IDs for downstream operations; auditing group structure; populating group selectors in custom tools; confirming a group exists before assigning devices or Blueprints.

        **Best Practices** 


        Use the `name` query parameter to filter instead of fetching all groups;
        cache group IDs for use in commands and policy calls; paginate with
        `limit` and `offset` for large enterprises.
      operationId: getAllGroups
      parameters:
        - name: enterprise_id
          in: path
          description: A UUID string identifying enterprise.
          required: true
          schema:
            type: string
        - name: name
          in: query
          description: Filter by group name
          schema:
            type: string
        - name: limit
          in: query
          description: Number of results to return per page.
          schema:
            type: integer
            default: 20
        - name: offset
          in: query
          description: The initial index from which to return the results.
          schema:
            type: integer
            default: 0
      responses:
        '200':
          description: successful operation
          content:
            application/json:
              schema:
                required:
                  - count
                  - results
                type: object
                properties:
                  count:
                    type: integer
                  next:
                    type: string
                    format: url
                    nullable: true
                  previous:
                    type: string
                    format: url
                    nullable: true
                  results:
                    type: array
                    items:
                      $ref: '#/components/schemas/esper_cloud_api_DeviceGroup'
        '401':
          description: Authorization information is missing or invalid.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '404':
          description: Not Found.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
      security:
        - esper_cloud_api_apiKey: []
    post:
      x-badges:
        - name: Stable
          color: green
      tags:
        - esper_cloud_api_Device Group
      summary: Create a device group
      description: >-
        Creates a new device group within the enterprise. Device groups organize
        devices into logical collections for policy assignment, app deployment,
        Blueprint application, and bulk command targeting. Groups can be nested
        — pass a parent group ID to create a subgroup within an existing group
        hierarchy.


        Request body fields


        name (required) — Display name for the new group

        parent (optional) — UUID of the parent group; omit to create a top-level
        group

        device_ids (optional) — Array of device UUIDs to add to the group at
        creation time


        **Common Use Cases**


        Setting up a new group before provisioning a batch of devices into it

        Creating subgroups to represent locations, departments, or device roles
        within a larger fleet segment

        Programmatically building out a group hierarchy as part of an onboarding
        or deployment **Workflow**


        **Best Practices**


        Group names should be descriptive and consistent with your naming
        convention — they appear throughout the Console and API responses

        You can add devices at creation via device_ids, or add them later using
        the update endpoint

        Store the id from the 201 response immediately — it's required for all
        subsequent group operations (policy assignment, commands, Blueprint
        targeting, etc.)

        Use GET /enterprise/{enterprise_id}/devicegroup/ first to confirm the
        group doesn't already exist before creating a duplicate
      operationId: createGroup
      parameters:
        - name: enterprise_id
          in: path
          description: A UUID string identifying enterprise.
          required: true
          schema:
            type: string
      requestBody:
        content:
          '*/*':
            schema:
              $ref: '#/components/schemas/esper_cloud_api_DeviceGroupUpdate'
        required: true
      responses:
        '201':
          description: successful operation
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_DeviceGroup'
        '400':
          description: Bad request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '401':
          description: Authorization information is missing or invalid.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '403':
          description: Forbidden, no permission to perform this action.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
      security:
        - esper_cloud_api_apiKey: []
      x-codegen-request-body-name: data
  /enterprise/{enterprise_id}/devicegroup/{group_id}/:
    get:
      x-badges:
        - name: Stable
          color: green
      tags:
        - esper_cloud_api_Device Group
      summary: Get device group information
      description: >-
        Retrieves full details for a single device group by its UUID.


        Use this endpoint to fetch group metadata — including name, device
        count, child group count, hierarchy path, and associated blueprint —
        when you have a specific group_id and need its current state rather than
        a paginated list.

        About Get Device Group Information

        Device groups in Esper are hierarchical collections of devices used to
        organize and apply policies at scale. Each group can have a parent
        group, child groups, and an associated blueprint that defines the
        configuration applied to devices in that group. This endpoint returns a
        snapshot of a single group's metadata and is commonly used to validate
        group structure before performing bulk operations or blueprint
        assignments. To retrieve a group_id, use the List Device Groups endpoint
        first.


        Key Fields


        id — The group's UUID; use this as group_id in subsequent group-scoped
        requests

        path — The full hierarchy path of the group within the enterprise's
        group tree

        parent — URL reference to the parent group, if the group is nested

        device_count — Number of devices directly in this group

        children_count — Number of child groups nested under this group

        blueprint — URL reference to the blueprint currently associated with
        this group


        **Common Use Cases**


        Confirm a group exists and retrieve its metadata before applying a
        blueprint or running a pipeline

        Inspect a group's position in the hierarchy (path, parent) when managing
        nested group structures

        Verify device_count before initiating bulk device operations against a
        group


        **Best Practices**


        Use List Device Groups to discover group_id values; avoid hardcoding
        UUIDs across environments

        Check children_count before deleting a group — child groups must be
        removed first, and groups containing devices cannot be deleted until
        devices are moved or removed

        Cache group metadata conservatively; group structure can change as
        devices are enrolled or moved


        **Workflow**


        1. Call List Device Groups (GET
        /enterprise/{enterprise_id}/devicegroup/) to find the target group and
        retrieve its group_id

        2. Call this endpoint with the group_id to fetch full group details

        3. Use the returned blueprint, path, and device_count to inform
        downstream operations such as blueprint updates, pipeline targeting, or
        group deletion
      operationId: getGroupById
      parameters:
        - name: group_id
          in: path
          description: A UUID string identifying this enterprise device group.
          required: true
          schema:
            type: string
            format: uuid
        - name: enterprise_id
          in: path
          description: A UUID string identifying enterprise.
          required: true
          schema:
            type: string
      responses:
        '200':
          description: successful operation
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_DeviceGroup'
        '401':
          description: Authorization information is missing or invalid.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '404':
          description: Not Found.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
      security:
        - esper_cloud_api_apiKey: []
    put:
      x-badges:
        - name: Stable
          color: green
      tags:
        - esper_cloud_api_Device Group
      summary: Update device group
      description: >-
        Fully updates a device group's properties using the action query
        parameter to specify the operation being performed. This endpoint
        controls group membership, naming, and hierarchy — use it to add or
        remove devices, rename a group, or move it to a different parent in the
        group tree.


        action query parameter values


        add — Add the devices specified in device_ids to the group

        remove — Remove the devices specified in device_ids from the group

        rename — Rename the group using the name field

        move — Move the group under a new parent using the parent field


        Request body fields (DeviceGroupUpdate)


        name (required by schema, contextual by action) — Group display name;
        used with rename

        parent — UUID of the new parent group; used with move

        device_ids — Array of device UUIDs to add or remove; used with add /
        remove


        **Common Use Cases**


        Adding newly provisioned devices into their target group

        Reorganizing a group hierarchy by moving subgroups to a new parent

        Renaming a group to reflect a changed location, team, or deployment role

        Removing retired or reassigned devices from a group


        **Best Practices**


        Always supply the correct action value — omitting it or mismatching it
        with the body fields will produce unexpected behavior

        For bulk membership changes, prefer passing all affected device_ids in a
        single call rather than iterating per device

        Use GET /enterprise/{enterprise_id}/devicegroup/{group_id}/ to verify
        current group state before and after updates

        For partial updates (e.g., updating only one field without requiring all
        required fields), prefer PATCH
        /enterprise/{enterprise_id}/devicegroup/{group_id}/ instead
      operationId: updateGroup
      parameters:
        - name: group_id
          in: path
          description: A UUID string identifying this enterprise device group.
          required: true
          schema:
            type: string
            format: uuid
        - name: enterprise_id
          in: path
          description: A UUID string identifying enterprise.
          required: true
          schema:
            type: string
        - name: action
          in: query
          description: add / remove / rename / move
          schema:
            type: string
      requestBody:
        content:
          '*/*':
            schema:
              $ref: '#/components/schemas/esper_cloud_api_DeviceGroupUpdate'
        required: true
      responses:
        '200':
          description: successful operation
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_DeviceGroup'
        '400':
          description: User update error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '401':
          description: Authorization information is missing or invalid
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '404':
          description: Not Found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
      security:
        - esper_cloud_api_apiKey: []
      x-codegen-request-body-name: data
    delete:
      x-badges:
        - name: Stable
          color: green
      tags:
        - esper_cloud_api_Device Group
      summary: Delete a device group
      description: >-
        Permanently deletes a device group from the enterprise. The group must
        be empty — groups containing one or more devices cannot be deleted. Move
        all member devices to another group first before issuing the delete
        request.


        **Common Use Cases**


        Removing groups that are no longer needed after a deployment phase ends

        Cleaning up duplicate or incorrectly named groups

        Reorganizing fleet structure by consolidating groups


        **Best Practices**


        Ensure the group has no devices before calling this endpoint — the
        operation will fail if any devices remain in the group; use PUT
        /enterprise/{enterprise_id}/devicegroup/{group_id}/ with action=remove
        or action=move to empty the group first

        Confirm the group ID is correct using GET
        /enterprise/{enterprise_id}/devicegroup/{group_id}/ before issuing the
        delete — this action is irreversible

        Check for any active Pipelines, Blueprints, or scheduled commands
        targeting this group before deleting to avoid orphaned configurations

        If the goal is to reorganize rather than fully remove, consider using
        action=move to reassign the group to a new parent instead
      operationId: deleteGroup
      parameters:
        - name: group_id
          in: path
          description: A UUID string identifying this enterprise device group.
          required: true
          schema:
            type: string
            format: uuid
        - name: enterprise_id
          in: path
          description: A UUID string identifying enterprise.
          required: true
          schema:
            type: string
      responses:
        '204':
          description: The resource was deleted successfully.
        '400':
          description: Invalid request.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '401':
          description: Authorization information is missing or invalid.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '403':
          description: Forbidden, no permission to perform this action.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '404':
          description: Not Found.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
      security:
        - esper_cloud_api_apiKey: []
    patch:
      x-badges:
        - name: Stable
          color: green
      tags:
        - esper_cloud_api_Device Group
      summary: Partially update a device group
      description: >-
        Partially updates one or more properties of a device group without
        requiring all fields to be present in the request body. Like the full
        update endpoint, the action query parameter specifies the operation
        being performed — but here only the fields relevant to that action need
        to be included. Use this endpoint instead of PUT when making a single
        targeted change, such as renaming a group or adding a small set of
        devices, without needing to supply the full group object.


        action query parameter values


        add — Add the devices specified in device_ids to the group

        remove — Remove the devices specified in device_ids from the group

        rename — Rename the group using the name field

        move — Move the group under a new parent using the parent field


        Request body fields (all optional)


        name — Group display name; used with rename

        parent — UUID of the new parent group; used with move

        device_ids — Array of device UUIDs; used with add / remove


        **Common Use Cases**


        Renaming a group without affecting its membership or hierarchy

        Adding or removing a subset of devices without resending the full group
        payload

        Moving a group to a new parent as part of a hierarchy reorganization


        **Best Practices**


        Prefer this endpoint over PUT for single-field changes — it reduces
        payload size and minimizes the risk of accidentally overwriting other
        fields

        Always supply the action query parameter and ensure the body fields
        match the intended action

        Use GET /enterprise/{enterprise_id}/devicegroup/{group_id}/ to verify
        the current group state before and after updates
      operationId: partialUpdateGroup
      parameters:
        - name: group_id
          in: path
          description: A UUID string identifying this enterprise device group.
          required: true
          schema:
            type: string
            format: uuid
        - name: enterprise_id
          in: path
          description: A UUID string identifying enterprise.
          required: true
          schema:
            type: string
        - name: action
          in: query
          description: add / remove / rename / move
          schema:
            type: string
      requestBody:
        content:
          '*/*':
            schema:
              $ref: '#/components/schemas/esper_cloud_api_DeviceGroupPartialUpdate'
        required: true
      responses:
        '200':
          description: successful operation
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_DeviceGroup'
        '400':
          description: Bad request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '401':
          description: Authorization information is missing or invalid.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '403':
          description: Forbidden, no permission to perform this action.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '404':
          description: Not Found.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
      security:
        - esper_cloud_api_apiKey: []
      x-codegen-request-body-name: data
  /enterprise/{enterprise_id}/devicegroup/thumbnail/:
    post:
      x-badges:
        - name: Stable
          color: green
      parameters:
        - $ref: '#/components/parameters/esper_cloud_api_EnterpriseID'
      tags:
        - esper_cloud_api_Device Group
      summary: Upload a thumbnail pic
      description: Upload an image to represent the group in Devices & Groups.
      operationId: uploadGroupThumbnail
      requestBody:
        required: true
        content:
          multipart/form-data:
            schema:
              type: object
              properties:
                image_file:
                  type: string
                  format: binary
      responses:
        '200':
          description: Thumbnail
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_GroupThumbnail'
      security:
        - esper_cloud_api_apiKey: []
      x-codegen-request-body-name: data
    get:
      x-badges:
        - name: Stable
          color: green
      parameters:
        - $ref: '#/components/parameters/esper_cloud_api_EnterpriseID'
      tags:
        - esper_cloud_api_Device Group
      summary: List thumbnail pics
      description: Get a list of group thumbnail image files in Devices & Groups.
      operationId: listGroupThumbnail
      security:
        - esper_cloud_api_apiKey: []
      responses:
        '200':
          description: Thumbnail
          content:
            application/json:
              schema:
                type: object
                properties:
                  count:
                    type: integer
                  previous:
                    type: string
                  next:
                    type: string
                  results:
                    type: array
                    items:
                      $ref: '#/components/schemas/esper_cloud_api_GroupThumbnail'
  /enterprise/{enterprise_id}/devicegroup/thumbnail/{thumbnail_id}/:
    get:
      x-badges:
        - name: Stable
          color: green
      parameters:
        - $ref: '#/components/parameters/esper_cloud_api_EnterpriseID'
        - $ref: '#/components/parameters/esper_cloud_api_GroupThumbnailID'
      tags:
        - esper_cloud_api_Device Group
      summary: Get thumbnail detail
      description: "Get a thumbnail by its ID. Use List thumbnail pics to find thumbnail IDs.\_"
      operationId: getGroupThumbnail
      security:
        - esper_cloud_api_apiKey: []
      responses:
        '200':
          description: Thumbnail
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_GroupThumbnail'
    delete:
      x-badges:
        - name: Stable
          color: green
      parameters:
        - $ref: '#/components/parameters/esper_cloud_api_EnterpriseID'
        - $ref: '#/components/parameters/esper_cloud_api_GroupThumbnailID'
      tags:
        - esper_cloud_api_Device Group
      summary: Delete group thumbnail
      description: Delete a thumbnail in Devices & Groups.
      operationId: deleteGroupThumbnail
      security:
        - esper_cloud_api_apiKey: []
      responses:
        '204':
          description: Deleted group thumbnail
        '401':
          description: Group thumbnail delete error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
  /api/v2/subgroups/:
    get:
      x-badges:
        - name: Stable
          color: green
      tags:
        - esper_cloud_api_Device Group
      summary: List the subgroups of list of groups
      description: >-
        Returns a list of subgroup UUIDs for one or more parent groups. Use the
        parent_group_ids parameter to specify which parent groups to query, and
        the immediate parameter to control whether the response includes only
        direct children or all descendants at every level of the hierarchy.


        Note that the response contains only subgroup UUIDs — not full group
        objects. Use GET /enterprise/{enterprise_id}/devicegroup/{group_id}/ to
        retrieve full details for any returned group ID.


        Query parameters


        parent_group_ids (optional) — Comma-separated list of parent group UUIDs
        to query; omitting this parameter may return subgroups across all groups

        immediate (optional, default: false) — When false, returns all
        descendant subgroups at every level; when true, returns only the
        immediate (direct) children of the specified parent groups


        **Common Use Cases**


        Traversing a group hierarchy to discover all subgroups beneath one or
        more parent groups

        Checking whether a group has children before deciding to delete or
        restructure it

        Collecting a full list of descendant group IDs to use as targets for
        bulk operations


        **Best Practices**


        When only direct children are needed, set immediate=true to avoid
        retrieving the full descendant tree, which may be large in deep
        hierarchies

        Since the response returns UUIDs only, plan for follow-up calls to GET
        /devicegroup/{group_id}/ if group names, device counts, or other
        metadata are required

        Use parent_group_ids to scope the query — querying without it may return
        more data than expected
      operationId: getAllSubGroups
      parameters:
        - name: parent_group_ids
          in: query
          description: >-
            Filter by parent group ids. This is a comma separated list of group
            ids.
          schema:
            type: string
        - name: immediate
          in: query
          description: >-
            This is a boolean value. If true, only immediate subgroups are
            returned.
          schema:
            type: boolean
            default: false
      responses:
        '200':
          description: successful operation
          content:
            application/json:
              schema:
                required:
                  - content
                type: object
                properties:
                  content:
                    items:
                      $ref: '#/components/schemas/esper_cloud_api_DeviceSubGroup'
        '400':
          description: Bad Request.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '401':
          description: Authorization information is missing or invalid.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '500':
          description: Internal server error.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
      security:
        - esper_cloud_api_apiKey: []
  /enterprise/{enterprise_id}/policy/:
    get:
      x-badges:
        - name: Stable
          color: green
      tags:
        - esper_cloud_api_Enterprise Policy
      summary: List all policies in enterprise
      description: Returns Policies list
      operationId: listPolicies
      parameters:
        - name: enterprise_id
          in: path
          description: ID of the enterprise
          required: true
          schema:
            type: string
            format: uuid
        - name: name
          in: query
          description: filter by policy name
          schema:
            type: string
        - name: is_active
          in: query
          description: filter by Active policies
          schema:
            type: boolean
        - name: limit
          in: query
          description: Number of results to return per page.
          schema:
            type: integer
            default: 20
        - name: offset
          in: query
          description: Return results from this index.
          schema:
            type: integer
            default: 0
      responses:
        '200':
          description: successful operation
          content:
            application/json:
              schema:
                required:
                  - count
                  - results
                type: object
                properties:
                  count:
                    type: integer
                  next:
                    type: string
                    format: url
                    nullable: true
                  previous:
                    type: string
                    format: url
                    nullable: true
                  results:
                    type: array
                    items:
                      $ref: '#/components/schemas/esper_cloud_api_EnterprisePolicy'
        '401':
          description: Authorization information is missing or invalid.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '404':
          description: Not Found.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
      security:
        - esper_cloud_api_apiKey: []
    post:
      x-badges:
        - name: Stable
          color: green
      tags:
        - esper_cloud_api_Enterprise Policy
      summary: Create a new Enterprise Policy
      description: API to create a new Enterprise Policy
      operationId: createPolicy
      parameters:
        - name: enterprise_id
          in: path
          description: ID of the enterprise
          required: true
          schema:
            type: string
            format: uuid
      requestBody:
        description: The request body to create an Enteprise Policy
        content:
          '*/*':
            schema:
              $ref: '#/components/schemas/esper_cloud_api_EnterprisePolicy'
        required: true
      responses:
        '201':
          description: command request successfully created
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_EnterprisePolicy'
        '400':
          description: Bad request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '401':
          description: Authorization information is missing or invalid.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '403':
          description: Forbidden, no permission to perform this action.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
      security:
        - esper_cloud_api_apiKey: []
      x-codegen-request-body-name: request
  /enterprise/{enterprise_id}/policy/{policy_id}/:
    get:
      x-badges:
        - name: Stable
          color: green
      tags:
        - esper_cloud_api_Enterprise Policy
      summary: Get Enterprise Policy
      description: Returns EnterprisePolicy instance
      operationId: getPolicyById
      parameters:
        - name: policy_id
          in: path
          description: An integer identifying this enterprise policy.
          required: true
          schema:
            type: integer
        - name: enterprise_id
          in: path
          description: A UUID string identifying enterprise.
          required: true
          schema:
            type: string
      responses:
        '200':
          description: successful operation
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_EnterprisePolicy'
        '401':
          description: Authorization information is missing or invalid.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '404':
          description: Not Found.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
      security:
        - esper_cloud_api_apiKey: []
    put:
      x-badges:
        - name: Stable
          color: green
      tags:
        - esper_cloud_api_Enterprise Policy
      summary: Update Enterprise Policy
      description: Returns Enterprise Policy instance
      operationId: updatePolicy
      parameters:
        - name: policy_id
          in: path
          description: An integer identifying this enterprise policy.
          required: true
          schema:
            type: integer
        - name: enterprise_id
          in: path
          description: A UUID string identifying enterprise.
          required: true
          schema:
            type: string
      requestBody:
        content:
          '*/*':
            schema:
              $ref: '#/components/schemas/esper_cloud_api_EnterprisePolicy'
        required: true
      responses:
        '200':
          description: successful operation
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_EnterprisePolicy'
        '400':
          description: User update error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '401':
          description: Authorization information is missing or invalid
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '404':
          description: Not Found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
      security:
        - esper_cloud_api_apiKey: []
      x-codegen-request-body-name: data
    delete:
      x-badges:
        - name: Stable
          color: green
      tags:
        - esper_cloud_api_Enterprise Policy
      summary: Delete a Enterprise Policy
      description: Emtpy response
      operationId: deleteEnterprisePolicy
      parameters:
        - name: policy_id
          in: path
          description: An integer identifying this enterprise policy.
          required: true
          schema:
            type: integer
        - name: enterprise_id
          in: path
          description: A UUID string identifying enterprise.
          required: true
          schema:
            type: string
      responses:
        '204':
          description: The resource was deleted successfully.
        '400':
          description: Invalid request.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '401':
          description: Authorization information is missing or invalid.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '403':
          description: Forbidden, no permission to perform this action.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '404':
          description: Not Found.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
      security:
        - esper_cloud_api_apiKey: []
    patch:
      x-badges:
        - name: Stable
          color: green
      tags:
        - esper_cloud_api_Enterprise Policy
      summary: Partial update EnterprisePolicy
      description: Returns EnterprisePolicy instance
      operationId: partialupdatePolicy
      parameters:
        - name: policy_id
          in: path
          description: An integer identifying this enterprise policy.
          required: true
          schema:
            type: integer
        - name: enterprise_id
          in: path
          description: A UUID string identifying enterprise.
          required: true
          schema:
            type: string
      requestBody:
        content:
          '*/*':
            schema:
              $ref: >-
                #/components/schemas/esper_cloud_api_EnterprisePolicyPartialUpdate
        required: true
      responses:
        '200':
          description: successful operation
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_EnterprisePolicy'
        '400':
          description: Bad request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '401':
          description: Authorization information is missing or invalid.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '403':
          description: Forbidden, no permission to perform this action.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '404':
          description: Not Found.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
      security:
        - esper_cloud_api_apiKey: []
      x-codegen-request-body-name: data
  /v0/enterprise/{enterprise_id}/command/:
    get:
      x-badges:
        - name: Legacy
          color: orange
      tags:
        - esper_cloud_api_Commands V2
      summary: List command requests
      description: >-
        Alternative Available (recommended): For broader multi-OS support and
        enhanced command visibility, use the stable command request API:
        https://api.esper.io/openapi/command-request/listcommandrequests


        Returns a paginated list of command requests within the enterprise. Each
        record includes the command type, targeted devices or groups, schedule
        details, arguments, and current status.


        This endpoint provides visibility into commands that have been issued,
        whether they are queued, in progress, successful, or failed.
      operationId: listCommandRequest
      parameters:
        - name: enterprise_id
          in: path
          description: ID of the enterprise
          required: true
          schema:
            type: string
            format: uuid
        - name: command_type
          in: query
          description: Filter by type of command request i.e device, group etc
          schema:
            type: string
        - name: devices
          in: query
          description: Filter by device IDs. Accepts comma separated values.
          schema:
            type: string
        - name: device_type
          in: query
          description: Filter by device type i.e active, inactive etc
          schema:
            type: string
        - name: command
          in: query
          description: Filter by command name
          schema:
            type: string
        - name: issued_by
          in: query
          description: Filter by user. Accepts user id.
          schema:
            type: string
      responses:
        '200':
          description: on successful request
          content:
            application/json:
              schema:
                type: object
                properties:
                  count:
                    type: integer
                    format: int64
                  next:
                    type: string
                    format: url
                  previous:
                    type: string
                    format: url
                  results:
                    type: array
                    items:
                      $ref: '#/components/schemas/esper_cloud_api_V0CommandRequest'
        '401':
          description: Authorization information is missing or invalid.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '404':
          description: Not Found.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
      security:
        - esper_cloud_api_apiKey: []
    post:
      x-badges:
        - name: Legacy
          color: orange
      tags:
        - esper_cloud_api_Commands V2
      summary: Create a command request
      description: >-
        ⚠️ Android only. This endpoint issues commands to Android-managed
        devices.


        Alternative Available


        A newer, multi-OS commands API is available and recommended for most use
        cases

        https://api.esper.io/openapi/command-request/createcommandrequest


        Creates a command request targeting one or more devices or groups,
        dispatching a managed operation such as an install, reboot, lock, or
        configuration change. Accepts a V0CommandRequest body specifying the
        target scope (DEVICE, GROUP, or DYNAMIC), the command type, any required
        arguments, and an optional schedule. Returns the created command request
        including its id (request_id), which is used to poll for per-device
        execution status. Alternative endpoint-
        https://{foo}-api.esper.cloud/api/commands/v0/commands/


        About Create Command Request


        Esper's command system dispatches operations to enrolled Android devices
        asynchronously. A command request defines what to do (command), who to
        do it to (devices or groups), any parameters the command requires
        (command_args), and when to do it (schedule and schedule_args). The
        command_type field determines targeting scope: DEVICE targets up to
        1,000 specific devices, GROUP targets up to 500 groups, and DYNAMIC
        targets a custom cross-group subset. After creation, use the request_id
        to query per-device execution status at the status endpoint.


        Key Fields


        command_type — targeting scope: DEVICE, GROUP, or DYNAMIC


        devices — list of device UUIDs to target (up to 1,000); used with
        command_type: DEVICE


        groups — list of group UUIDs to target (up to 500); used with
        command_type: GROUP


        command — the operation to perform (e.g. INSTALL, REBOOT, LOCK; see
        V0DeviceCommandEnum for the full list)



        command_args — command-specific parameters (e.g. app_version UUID for
        INSTALL, package_name for CLEAR_APP_DATA)


        schedule — scheduling mode (immediate or deferred)


        schedule_args — scheduling parameters when using deferred execution


        See
        https://help.esper.io/hc/en-us/articles/29710806069393-Creating-API-Commands
        for command examples.
      parameters:
        - name: enterprise_id
          in: path
          description: ID of the enterprise
          required: true
          schema:
            type: string
            format: uuid
      requestBody:
        description: The request body to create a command for set of devices or groups
        content:
          '*/*':
            schema:
              $ref: '#/components/schemas/esper_cloud_api_V0CommandRequest'
        required: true
      responses:
        '201':
          description: command request successfully created
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_V0CommandRequest'
        '400':
          description: Bad request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '401':
          description: Authorization information is missing or invalid.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '403':
          description: Forbidden, no permission to perform this action.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
      security:
        - esper_cloud_api_apiKey: []
      x-codegen-request-body-name: request
  /v0/enterprise/{enterprise_id}/command/{request_id}/status/:
    get:
      x-badges:
        - name: Legacy
          color: orange
      tags:
        - esper_cloud_api_Commands V2
      summary: get status list for command request
      description: >-
        ⚠️ Android only. This endpoint applies to command requests issued to
        Android-managed devices.


        Alternative Available


        A newer, multi-OS commands API is available and recommended for most use
        cases https://api.esper.io/openapi/command-request/listcommandrequests


        Returns the per-device execution status for a specific command request,
        with optional filtering by device or command state.

        Returns a paginated list of V0CommandStatus1 records — one per targeted
        device — each showing the device reference, current execution state,
        reason, and timestamps. Use this to monitor command propagation after
        creating a request via POST .../command/.


        About Get Command Request Status


        When a command request is created, Esper generates a per-device status
        record for each target in the request. This endpoint surfaces those
        records, allowing integrators to track whether each device has queued,
        acknowledged, completed, failed, timed out, or been cancelled. The state
        field reflects the full command lifecycle from Command Queued through
        Command Success or Command Failure. The reason field provides detail on
        why a command reached its current state — useful for diagnosing
        failures.


        Key Fields / Query Parameters


        request_id — path parameter; UUID of the command request whose status to
        retrieve.


        device — optional query filter; narrows results to a single device UUID.


        state — optional query filter; narrows results to a specific execution
        state (e.g. Command Failure, Command Success).


        state values: Command Queued, Command Initiated, Command Acknowledged,
        Command In Progress, Command TimeOut, Command Success

        , Command Failure, Command Scheduled, Command Cancelled.


        reason — plain-language explanation of why the command is in its current
        state.


        **Common Use Cases**


        Monitor rollout progress for a group-scoped install command by checking
        how many devices have reached Command Success.

        Identify devices that failed or timed out by filtering on state=Command
        Failure or state=Command TimeOut. Note: timeout status will continue to
        scuees or failur.

        Confirm that a specific device received and acknowledged a command
        before proceeding with a dependent operation.


        **Best Practices**


        Poll this endpoint periodically after creating a command request rather
        than expecting immediate completion — devices may be offline or slow to
        respond

        Filter by state=Command Failure first to quickly surface problem devices
        before reviewing overall progress

        Store request_id from the create response immediately — it cannot be
        recovered from the status endpoint itself


        **Workflow**


        After creating a command request, capture the request_id from the POST
        response.

        Call this endpoint with the request_id to retrieve per-device status
        records.

        Filter by state to isolate devices in specific execution states; retry
        or investigate failures as needed.
      operationId: getCommandRequestStatus
      parameters:
        - name: enterprise_id
          in: path
          description: ID of the enterprise
          required: true
          schema:
            type: string
            format: uuid
        - name: request_id
          in: path
          description: ID for the command request
          required: true
          schema:
            type: string
            format: uuid
        - name: device
          in: query
          description: Filter status result by device id.
          schema:
            type: string
        - name: state
          in: query
          description: Filter by command state
          schema:
            type: string
      responses:
        '200':
          description: on successful request
          content:
            application/json:
              schema:
                type: object
                properties:
                  count:
                    type: integer
                    format: int64
                  next:
                    type: string
                    format: url
                  previous:
                    type: string
                    format: url
                  results:
                    type: array
                    items:
                      $ref: '#/components/schemas/esper_cloud_api_V0CommandStatus1'
        '401':
          description: Authorization information is missing or invalid.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '404':
          description: Not Found.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
      security:
        - esper_cloud_api_apiKey: []
  /v0/enterprise/{enterprise_id}/content/:
    get:
      x-badges:
        - name: Stable
          color: green
      tags:
        - esper_cloud_api_Content
      summary: List content
      description: >-
        Returns a paginated list of all files uploaded to the enterprise's
        Content Management library. Each result includes file metadata such as
        MIME type, size, tags, description, path, and ownership — but not the
        file content itself. Use this endpoint to discover content IDs for use
        in downstream operations such as pushing files to devices.


        **Query parameters:**


        search (optional) — Filter results by tags or description; does not
        search by filename


        limit (optional, default: 20) — Number of results to return per page


        offset (optional, default: 0) — Index from which to start returning
        results


        **Response fields of note** (Content schema):


        key — The filename or identifier for the content


        kind — MIME type of the file (e.g., application/pdf, image/png)


        size — File size in bytes


        tags — Array of tag strings; searchable via the search parameter


        description — Optional description for the file; also searchable via
        search


        path — Path to the content within the library


        is_dir — Whether the entry represents a directory rather than a file


        owner — User who uploaded the content


        **Common Use Cases**


        Discovering content IDs needed to reference files in device push
        operations


        Auditing the enterprise content library for stale, duplicate, or
        untagged files


        Building content browsing or selection UIs in custom management tools


        Verifying a file exists and retrieving its metadata before issuing a
        push command


        **Best Practices**


        Use the search parameter to filter by tags or description rather than
        fetching all content and filtering client-side — note that search does
        not match on filename (key)


        Use descriptive tags at upload time to make content discoverable via
        this endpoint's search


        Paginate with limit and offset for enterprises with large content
        libraries
      operationId: getAllContent
      parameters:
        - name: enterprise_id
          in: path
          description: A UUID string identifying this enterprise.
          required: true
          schema:
            type: string
        - name: search
          in: query
          description: Seach by tags, description
          schema:
            type: string
        - name: limit
          in: query
          description: Number of results to return per page.
          schema:
            type: integer
            default: 20
        - name: offset
          in: query
          description: The initial index from which to return the results.
          schema:
            type: integer
            default: 0
      responses:
        '200':
          description: successful operation
          content:
            application/json:
              schema:
                required:
                  - count
                  - results
                type: object
                properties:
                  count:
                    type: integer
                  next:
                    type: string
                    format: url
                    nullable: true
                  previous:
                    type: string
                    format: url
                    nullable: true
                  results:
                    type: array
                    items:
                      $ref: '#/components/schemas/esper_cloud_api_Content'
        '401':
          description: Authorization information is missing or invalid.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
      security:
        - esper_cloud_api_apiKey: []
  /v0/enterprise/{enterprise_id}/content/{content_id}/:
    get:
      x-badges:
        - name: Stable
          color: green
      tags:
        - esper_cloud_api_Content
      summary: Get content information
      description: >-
        Returns metadata for a single content item in the enterprise's Content
        Management library, identified by its content_id. The response includes
        the same fields as the list endpoint — filename, MIME type, size, tags,
        description, path, and ownership — but scoped to a single file. Does not
        return the file's binary content.


        **Common Use Cases**


        Verifying a specific file's metadata (type, size, tags, path) before
        referencing it in a device push operation

        Confirming a file exists and retrieving its details after upload

        Checking ownership or modification timestamps for auditing purposes


        **Best Practices**


        Use GET /v0/enterprise/{enterprise_id}/content/ with the search
        parameter to find a content_id if you don't already have it — this
        endpoint requires knowing the ID in advance

        This endpoint returns metadata only
      operationId: getContent
      parameters:
        - name: content_id
          in: path
          description: A UUID string identifying a content instance.
          required: true
          schema:
            type: string
            format: uuid
        - name: enterprise_id
          in: path
          description: A UUID string identifying enterprise.
          required: true
          schema:
            type: string
      responses:
        '200':
          description: successful operation
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_Content'
        '401':
          description: Authorization information is missing or invalid.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '404':
          description: Not Found.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
      security:
        - esper_cloud_api_apiKey: []
    delete:
      x-badges:
        - name: Stable
          color: green
      tags:
        - esper_cloud_api_Content
      summary: Delete Content
      description: >-
        Permanently deletes a content item from the enterprise's Content
        Management library by content_id. This action is irreversible — the file
        and its metadata are removed immediately and cannot be recovered.


        **Common Use Cases**


        Removing outdated or superseded files from the content library

        Cleaning up test or temporary files uploaded during development

        Maintaining a tidy library by removing content that is no longer
        referenced in any active device operations


        **Best Practices**


        Confirm the correct content_id using GET
        /v0/enterprise/{enterprise_id}/content/{content_id}/ before deleting —
        this action cannot be undone

        Verify the file is not actively referenced in any pending or scheduled
        device push operations before deleting to avoid broken references

        Use GET /v0/enterprise/{enterprise_id}/content/ to audit the library and
        identify candidates for deletion
      operationId: deleteContent
      parameters:
        - name: content_id
          in: path
          description: A UUID string identifying a content instance.
          required: true
          schema:
            type: string
            format: uuid
        - name: enterprise_id
          in: path
          description: A UUID string identifying enterprise.
          required: true
          schema:
            type: string
      responses:
        '204':
          description: The resource was deleted successfully.
        '401':
          description: Authorization information is missing or invalid.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '403':
          description: Forbidden, no permission to perform this action.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '404':
          description: Not Found.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
      security:
        - esper_cloud_api_apiKey: []
    patch:
      x-badges:
        - name: Stable
          color: green
      tags:
        - esper_cloud_api_Content
      summary: Patch a content instance
      description: >-
        Partially updates the metadata of an existing content item in the
        enterprise's Content Management library. Only tags and description can
        be updated — the file itself and its core properties (filename, size,
        MIME type, path) cannot be modified through this endpoint.


        Request body fields (all optional)


        Replaces the existing tag array with the new set of tag strings provided

        Updates the human-readable description for the content item


        **Common Use Cases**


        Adding or correcting tags to improve discoverability via the search
        parameter on GET /v0/enterprise/{enterprise_id}/content/

        Updating a description to reflect a file's current purpose after it has
        changed

        Retroactively tagging content that was uploaded without tags


        **Best Practices**


        Tags is a full replacement, not an append — if you want to add a tag
        while preserving existing ones, retrieve the current tags first via GET
        /v0/enterprise/{enterprise_id}/content/{content_id}/ and include them
        all in the patch body

        This endpoint cannot be used to replace or rename the file itself —
        upload a new file via POST
        /v0/enterprise/{enterprise_id}/content/upload/ and delete the old one if
        the file content needs to change

        Apply consistent, descriptive tags across your library to make content
        searchable and auditable
      operationId: patchContent
      parameters:
        - name: content_id
          in: path
          description: A UUID string identifying a content instance.
          required: true
          schema:
            type: string
            format: uuid
        - name: enterprise_id
          in: path
          description: A UUID string identifying enterprise.
          required: true
          schema:
            type: string
      requestBody:
        content:
          '*/*':
            schema:
              type: object
              properties:
                tags:
                  title: Tags
                  type: array
                  description: Tags for the content
                  items:
                    maxLength: 255
                    type: string
                description:
                  title: Description
                  type: string
                  description: Description of the content
        required: false
      responses:
        '200':
          description: successful operation
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_Content'
        '400':
          description: Bad request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '401':
          description: Authorization information is missing or invalid.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '403':
          description: Forbidden, no permission to perform this action.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '404':
          description: Not Found.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '415':
          description: Unsupported media type.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
      security:
        - esper_cloud_api_apiKey: []
      x-codegen-request-body-name: data
  /v0/enterprise/{enterprise_id}/content/upload/:
    post:
      x-badges:
        - name: Stable
          color: green
      tags:
        - esper_cloud_api_Content
      summary: Upload new content
      description: >-
        Uploads a file to the enterprise content library, creating a new Content
        record.

        Accepts a multipart/form-data payload with the binary file in the key
        field and returns the resulting Content object including id,
        download_url, MIME type, hash, and size. This is the primary mechanism
        for adding files to Esper's content library for device distribution.


        About Upload Content


        The content upload endpoint stores an arbitrary file in Esper's
        enterprise content library, which acts as a managed file repository for
        pushing files to enrolled devices. This is not intented for application
        uploads. Use the app upload enpoint instead. On successful upload, Esper
        returns a Content record with a download_url, a computed hash for
        integrity verification, and a detected kind (MIME type). The returned id
        is used to reference the content in distribution commands and PATCH
        operations. Unlike the APK upload endpoint, content upload accepts any
        supported file type — configuration files, scripts, media, documents,
        and more.


        Key Fields


        key — required; the binary file to upload, sent as multipart/form-data


        id — returned in the response; integer identifier for this content
        record used in downstream operations


        download_url — direct URL to retrieve the uploaded file


        hash — SHA hash of the uploaded file for integrity verification


        kind — MIME type detected from the uploaded file


        tags / description — not set at upload; add via PATCH
        .../content/{content_id}/ after upload


        **Common Use Cases**


        Upload configuration files, scripts, or reference documents to the
        content library for device distribution.

        Add media or resource files that devices need to download as part of a
        provisioning **Workflow**.

        Automate content updates as part of a CI/CD or content management
        pipeline.


        **Best Practices**


        Tags and descriptions cannot be set at upload time — immediately follow
        a successful upload with PATCH .../content/{content_id}/ to add tags and
        a description, which are needed for the search parameter on the list
        endpoint to find this file later.

        Store the id from the response; it is an integer (not a UUID) and is the
        reference for all downstream content operations.

        Verify the returned hash against your local file hash to confirm upload
        integrity.


        **Workflow**


        POST the file binary as key in a multipart/form-data request.

        Capture the id, download_url, and hash from the response.

        Immediately PATCH the new content record to add tags and description for
        searchability.
      operationId: postContent
      parameters:
        - name: enterprise_id
          in: path
          description: A UUID string identifying this enterprise.
          required: true
          schema:
            type: string
      requestBody:
        content:
          multipart/form-data:
            schema:
              required:
                - key
              properties:
                key:
                  type: string
                  description: Valid file to upload
                  format: binary
        required: true
      responses:
        '200':
          description: Successful Operation
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_Content'
        '400':
          description: Bad request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '401':
          description: Authorization information is missing or invalid.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '403':
          description: Forbidden, no permission to perform this action.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '415':
          description: Unsupported media type.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
      security:
        - esper_cloud_api_apiKey: []
  /v0/enterprise/{enterprise_id}/content/remote-file/:
    post:
      x-badges:
        - name: Stable
          color: green
      tags:
        - esper_cloud_api_Content
      summary: Upload file to Remote File Manager
      description: >
        Uploads a file to the Remote File Manager bucket for temporary storage.


        Accepts a multipart file upload up to 50MB and returns a file_key,
        bucket name, size, content type, and a pre-signed download_url. Files
        uploaded here are automatically deleted after 1 day, so this is intended
        for short-lived transfers rather than long-term content storage.


        **About Upload File to Remote File Manager**


        The Remote File Manager bucket is a temporary staging area distinct from
        Esper's main Content management system. Because files here are
        auto-deleted after 1440 minutes (1 day), it's best suited for
        short-lived use cases such as generating a one-time download link or
        briefly staging a file for another workflow, rather than for files
        devices need to reference long-term.


        **Key Fields / Request Body**


        file — the file to upload, required, maximum 50MB


        filename — an optional custom filename; defaults to the uploaded file's
        name


        content_type — an optional MIME type override, auto-detected if omitted


        **Common Use Cases**


        Generating a short-lived, shareable download link for a file


        Staging a file temporarily for a downstream automation step


        **Best Practices**


        Do not rely on this endpoint for files that need to persist beyond 1
        day; use the Content API for anything longer-lived


        Capture the file_key immediately, since it is required to generate
        additional download URLs later


        **Workflow**


        POST the file as multipart form data to this endpoint


        Capture the returned file_key and download_url


        Use the generate_download_url endpoint with the file_key if you need a
        new pre-signed URL after the original expires
      operationId: uploadRemoteFile
      parameters:
        - name: enterprise_id
          in: path
          description: A UUID string identifying this enterprise.
          required: true
          schema:
            type: string
      requestBody:
        content:
          multipart/form-data:
            schema:
              required:
                - file
              properties:
                file:
                  type: string
                  description: The file to upload (max 50MB)
                  format: binary
                filename:
                  type: string
                  description: Custom filename (optional, defaults to uploaded file name)
                content_type:
                  type: string
                  description: MIME type of the file (optional, auto-detected)
        required: true
      responses:
        '201':
          description: File uploaded successfully
          content:
            application/json:
              schema:
                type: object
                properties:
                  file_key:
                    type: string
                    description: Unique storage key for the file
                    example: 123/files/document_abc123.pdf
                  bucket:
                    type: string
                    description: Storage bucket name
                    example: REMOTE_FILE_MANAGER
                  file_size:
                    type: integer
                    description: Size of uploaded file in bytes
                    example: 1048576
                  content_type:
                    type: string
                    description: Detected/validated MIME type
                    example: application/pdf
                  auto_delete_after_minutes:
                    type: integer
                    description: When file will be auto-deleted
                    example: 1440
                  download_url:
                    type: string
                    description: Pre-signed URL for downloading the file
                    example: >-
                      https://s3.amazonaws.com/REMOTE_FILE_MANAGER/123/files/document_abc123.pdf?AWSAccessKeyId=...
                  download_expires_in:
                    type: integer
                    description: Download URL expiration time in seconds
                    example: 3600
        '400':
          description: Bad request
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: string
                    example: No file provided
        '401':
          description: Authorization information is missing or invalid.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '403':
          description: Forbidden, no permission to perform this action.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '413':
          description: File too large (max 50MB)
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: string
                    example: File size exceeds maximum allowed size of 52428800 bytes
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: string
                    example: Failed to upload file
      security:
        - esper_cloud_api_apiKey: []
  /v0/enterprise/{enterprise_id}/content/remote-file/generate_download_url/:
    post:
      x-badges:
        - name: Stable
          color: green
      tags:
        - esper_cloud_api_Content
      summary: Generate download URL for existing file
      description: >
        Generates a new pre-signed download URL for a file already stored in the
        Remote File Manager bucket.


        Use this when the original download_url returned at upload time has
        expired but the file itself (auto-deleted after 1 day from upload) is
        still available. Accepts an optional expires_in value to control how
        long the new URL remains valid.


        **About Generate Download URL**

        The download_url returned when a file is uploaded expires after a set
        duration; this endpoint issues a fresh pre-signed URL against the same
        file_key without re-uploading the file. It only works while the
        underlying file still exists in the bucket, which is limited to roughly
        1 day after upload.


        **Key Fields / Request Body**


        file_key — the storage key of the file, required, returned from the
        original upload


        expires_in — how long the new URL should remain valid, in seconds;
        defaults to 3600, minimum 60, maximum 86400


        **Common Use Cases**


        Re-generating a download link after the original one expired but before
        the file's 1-day auto-delete window closes


        Issuing a longer- or shorter-lived download URL than the one originally
        returned at upload time


        **Best Practices**


        Track each file's upload time so you don't attempt to generate a URL for
        a file that has already been auto-deleted


        Set expires_in to match how long the downstream consumer actually needs
        access, rather than defaulting to the maximum


        **Workflow**


        Retrieve the file_key from the original upload response


        POST the file_key and desired expires_in to this endpoint


        Share the returned download_url before it expires
      operationId: generateDownloadUrl
      parameters:
        - name: enterprise_id
          in: path
          description: A UUID string identifying this enterprise.
          required: true
          schema:
            type: string
      requestBody:
        content:
          application/json:
            schema:
              required:
                - file_key
              properties:
                file_key:
                  type: string
                  description: The storage key of the file to download
                  example: 123/files/document_abc123.pdf
                expires_in:
                  type: integer
                  description: URL expiration time in seconds (optional, default 3600)
                  default: 3600
                  minimum: 60
                  maximum: 86400
        required: true
      responses:
        '200':
          description: Download URL generated successfully
          content:
            application/json:
              schema:
                type: object
                properties:
                  file_key:
                    type: string
                    description: The storage key of the file
                    example: 123/files/document_abc123.pdf
                  download_url:
                    type: string
                    description: Pre-signed URL for downloading the file
                    example: >-
                      https://s3.amazonaws.com/REMOTE_FILE_MANAGER/123/files/document_abc123.pdf?AWSAccessKeyId=...
                  expires_in:
                    type: integer
                    description: URL expiration time in seconds
                    example: 3600
        '400':
          description: Bad request
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: string
                    example: file_key is required
        '401':
          description: Authorization information is missing or invalid.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '403':
          description: Forbidden, no permission to perform this action.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: string
                    example: Failed to generate download URL
      security:
        - esper_cloud_api_apiKey: []
  /v1/enterprise/{enterprise_id}/alertchannels/:
    get:
      x-badges:
        - name: Stable
          color: green
      tags:
        - esper_cloud_api_Alerts
      summary: List alert channels in enterprise
      description: >

        ⚠️ Android only. 


        Returns a paginated list of all alert channels configured in the
        enterprise. Alert channels define the destinations where alert
        notifications are sent when alarm rules are triggered — currently
        supporting email as the delivery type. Use this endpoint to discover
        channel IDs for associating with alarm rules, or to audit existing
        notification destinations.


        **Common use cases**


        Retrieving channel IDs to associate with new or existing alarm rules


        Auditing notification destinations across the enterprise


        Verifying which alarm rules are linked to a given channel before
        updating or deleting it


        **Best practices**


        Check linked_alerts in the response before deleting a channel — removing
        a channel that is actively linked to alarm rules will affect those
        rules' notification delivery


        Use the name filter to quickly locate a specific channel without
        paginating through all results


        Note that id is an integer, not a UUID — use it as-is in subsequent
        calls to GET, PUT, PATCH, or DELETE on /alertchannels/{alert_id}
      operationId: listAlertChannels
      parameters:
        - name: enterprise_id
          in: path
          description: A UUID string identifying this enterprise.
          required: true
          schema:
            type: string
        - name: name
          in: query
          description: Filter alert channels by name.
          schema:
            type: string
        - name: limit
          in: query
          description: Number of results to return per page.
          schema:
            type: integer
            default: 20
        - name: offset
          in: query
          description: Return results from this index.
          schema:
            type: integer
            default: 0
      responses:
        '200':
          description: successful operation
          content:
            application/json:
              schema:
                required:
                  - count
                  - results
                type: object
                properties:
                  count:
                    type: integer
                  next:
                    type: string
                    format: url
                    nullable: true
                  previous:
                    type: string
                    format: url
                    nullable: true
                  results:
                    type: array
                    items:
                      $ref: '#/components/schemas/esper_cloud_api_AlertChannelsV1'
        '401':
          description: Authorization information is missing or invalid.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '404':
          description: Not Found.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
      security:
        - esper_cloud_api_apiKey: []
    post:
      x-badges:
        - name: Stable
          color: green
      tags:
        - esper_cloud_api_Alerts
      summary: Creates alert channel
      description: >
        Creates a new alert channel in the enterprise, defining a notification
        destination to be used when alarm rules are triggered. Alert channels
        are prerequisites for alarm rules — a channel must exist before it can
        be linked to any rule. Currently, email is the supported delivery type.


        **Workflow**


        Create an alert channel using this endpoint → receive a channel id in
        the response


        Use that id when creating or updating an alarm rule via POST
        /v1/enterprise/{enterprise_id}/alarmrules/ to link the channel as a
        notification destination


        **Common use cases**


        Setting up a new email destination for device or fleet alert
        notifications


        Creating dedicated channels for different teams (e.g., a channel for
        ops, another for IT support) so alarm rules can target the appropriate
        recipients


        Programmatically provisioning notification infrastructure as part of an
        enterprise onboarding workflow


        **Best practices**


        Use a descriptive name that makes the channel's purpose and recipient
        clear (e.g., "IT Ops - Device Offline Alerts") — this is how channels
        are identified in the Console and when auditing via GET /alertchannels/


        Store the integer id from the 201 response — it is required for all
        subsequent operations on this channel and for linking it to alarm rules


        A channel can be linked to multiple alarm rules; create shared channels
        for common recipients rather than duplicating channels per rule
      operationId: createAlertChannel
      parameters:
        - name: enterprise_id
          in: path
          description: A UUID string identifying this enterprise.
          required: true
          schema:
            type: string
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/esper_cloud_api_UpdateAlertChannelsV1'
        required: true
      responses:
        '201':
          description: successful operation
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_AlertChannelsV1'
        '400':
          description: Bad request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '401':
          description: Authorization information is missing or invalid.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '403':
          description: Forbidden, no permission to perform this action.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
      security:
        - esper_cloud_api_apiKey: []
  /v1/enterprise/{enterprise_id}/alertchannels/{alert_id}:
    get:
      x-badges:
        - name: Stable
          color: green
      tags:
        - esper_cloud_api_Alerts
      summary: Get alert channel
      description: >
        ⚠️ Android only. 


        Returns the details of a single alert channel identified by its
        alert_id. Use this endpoint to retrieve the current configuration of a
        specific channel — including its delivery type, destination address, and
        any alarm rules it is linked to — before updating or deleting it.


        Note that alert_id is an integer, not a UUID. Use GET
        /v1/enterprise/{enterprise_id}/alertchannels/ to look up an alert_id if
        it is not already known.


        **Response fields of note**


        id — Integer identifier for the channel


        name — Display name for the channel


        type — Delivery format (e.g., email)


        properties.to_address — The email address notifications are sent to


        linked_alerts — Array of alarm rules currently using this channel


        created_on / updated_on — Timestamps for auditing purposes


        **Common use cases**


        Retrieving a channel's current configuration before issuing an update


        Checking linked_alerts to understand which alarm rules depend on this
        channel before modifying or deleting it


        Confirming a channel was created correctly after a POST /alertchannels/
        call


        **Best practices**


        Always retrieve the current state of a channel before updating it to
        avoid overwriting fields unintentionally


        Review linked_alerts before deletion — channels actively linked to alarm
        rules should be unlinked or replaced first to avoid disrupting alert
        delivery


        If the alert_id is not known, use GET /alertchannels/ with the name
        filter to locate it
      operationId: getAlertChannel
      parameters:
        - name: enterprise_id
          in: path
          description: A UUID string identifying this enterprise.
          required: true
          schema:
            type: string
        - name: alert_id
          in: path
          description: An integer identifying the alert channel.
          required: true
          schema:
            type: integer
      responses:
        '200':
          description: successful operation
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_AlertChannelsV1'
        '401':
          description: Authorization information is missing or invalid.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '404':
          description: Not Found.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
      security:
        - esper_cloud_api_apiKey: []
    put:
      x-badges:
        - name: Stable
          color: green
      tags:
        - esper_cloud_api_Alerts
      summary: Update alert channel information
      description: >
        Fully updates an existing alert channel identified by its integer
        alert_id. All writable fields should be included in the request body —
        this is a full replacement operation, not a partial update. To change
        only one field without affecting others, use PATCH
        /v1/enterprise/{enterprise_id}/alertchannels/{alert_id} instead.


        Request body fields


        name — Display name for the channel


        type — Delivery format (e.g., email)


        properties.to_address — The email address notifications are sent to


        **Common use cases**


        Updating the destination email address for a channel (e.g., when a
        team's distribution list changes)


        Renaming a channel to better reflect its current purpose or recipients


        Correcting a misconfigured channel after creation


        **Best practices**


        Retrieve the current channel state with GET
        /v1/enterprise/{enterprise_id}/alertchannels/{alert_id} before updating
        — since this is a full replacement, omitting fields may clear them
        unintentionally


        Prefer PATCH over PUT when only a single field needs to change, to
        reduce the risk of accidental data loss


        Note that alert_id is an integer, not a UUID — use GET /alertchannels/
        to look it up if needed


        Updating the destination address on a channel affects all alarm rules
        linked to it immediately — review linked_alerts on the channel before
        making changes that will affect notification routing
      operationId: updateAlertChannel
      parameters:
        - name: enterprise_id
          in: path
          description: A UUID string identifying the enterprise.
          required: true
          schema:
            type: string
            format: uuid
        - name: alert_id
          in: path
          description: An integer identifying the alert channel.
          required: true
          schema:
            type: integer
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/esper_cloud_api_UpdateAlertChannelsV1'
        required: true
      responses:
        '200':
          description: successful operation
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_AlertChannelsV1'
        '400':
          description: Invalid request.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '401':
          description: Authorization information is missing or invalid.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '404':
          description: Not Found.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
      security:
        - esper_cloud_api_apiKey: []
    patch:
      x-badges:
        - name: Stable
          color: green
      tags:
        - esper_cloud_api_Alerts
      summary: Partially updates alert channel information
      description: >
        Partially updates one or more fields of an existing alert channel
        identified by its integer alert_id. Only the fields included in the
        request body are modified — omitted fields retain their current values.
        Use this endpoint instead of PUT when making a targeted change to a
        single field without needing to resend the full channel object.


        **Request body fields (all optional)**


        name — Display name for the channel


        type — Delivery format (e.g., email)


        properties.to_address — The email address notifications are sent to


        **Common use cases**


        Updating only the destination email address without affecting the
        channel name or type


        Renaming a channel without modifying its delivery configuration


        Making a quick correction to a single field after creation


        **Best practices**


        Prefer this endpoint over PUT for single-field changes — it reduces
        payload size and eliminates the risk of accidentally clearing fields
        that are not included in the body


        Note that alert_id is an integer, not a UUID — use GET /alertchannels/
        with the name filter to look it up if needed


        Changes to properties.to_address take effect immediately and affect all
        alarm rules currently linked to this channel — review linked_alerts via
        GET /alertchannels/{alert_id} before updating the destination if
        multiple rules depend on it
      operationId: patchAlertChannel
      parameters:
        - name: enterprise_id
          in: path
          description: A UUID string identifying the enterprise.
          required: true
          schema:
            type: string
            format: uuid
        - name: alert_id
          in: path
          description: An integer identifying the alert channel.
          required: true
          schema:
            type: integer
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/esper_cloud_api_UpdateAlertChannelsV1'
      responses:
        '200':
          description: successful operation
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_AlertChannelsV1'
        '400':
          description: Invalid request.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '404':
          description: Not Found.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
      security:
        - esper_cloud_api_apiKey: []
    delete:
      x-badges:
        - name: Stable
          color: green
      tags:
        - esper_cloud_api_Alerts
      summary: Delete an alert channel
      description: >

        ⚠️ Android only. 


        Permanently deletes an alert channel identified by its integer alert_id.
        This action is irreversible. Any alarm rules that were linked to this
        channel will lose their association with it — verify the channel's
        linked_alerts before deleting to avoid silently disrupting alert
        delivery for active alarm rules.


        **Common use cases**


        Removing a channel whose destination email address is no longer valid or
        monitored


        Cleaning up duplicate or test channels created during setup


        Decommissioning a channel as part of a notification infrastructure
        reorganization


        **Best practices**


        Check linked_alerts by calling GET
        /v1/enterprise/{enterprise_id}/alertchannels/{alert_id} before deleting
        — if the channel is actively linked to alarm rules, update or delete
        those rules first, or reassign them to a different channel, to avoid
        broken alert delivery


        Confirm the correct alert_id before issuing the delete — this action
        cannot be undone and alert_id is an integer, not a UUID


        Use GET /v1/enterprise/{enterprise_id}/alertchannels/ with the name
        filter to locate the correct channel if the alert_id is not already
        known
      operationId: deleteAlertChannel
      parameters:
        - name: enterprise_id
          in: path
          description: A UUID string identifying the enterprise.
          required: true
          schema:
            type: string
            format: uuid
        - name: alert_id
          in: path
          description: An integer identifying the alert channel.
          required: true
          schema:
            type: integer
      responses:
        '204':
          description: The resource was deleted successfully.
        '400':
          description: Invalid request.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '401':
          description: Authorization information is missing or invalid.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '403':
          description: Forbidden, no permission to perform this action.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '404':
          description: Not Found.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
      security:
        - esper_cloud_api_apiKey: []
  /v1/enterprise/{enterprise_id}/alarmrules/:
    get:
      x-badges:
        - name: Stable
          color: green
      tags:
        - esper_cloud_api_Alarms
      summary: Get list of alarm rules
      description: >

        ⚠️ Android only. 


        Returns a paginated list of all alarm rules configured in the
        enterprise. Alarm rules define the conditions under which device or
        fleet alerts are triggered — specifying which metric to monitor, the
        threshold conditions, which devices or groups are in scope, and which
        alert channels receive notifications when the rule fires.


        **Key Query parameters**


        name (optional) — Filter rules by name


        description (optional) — Filter rules by description


        is_active (optional) — Filter by active (true) or inactive (false) rules



        **Response fields of note**


        id — UUID identifying the alarm rule; used in all subsequent rule
        operations


        name / description — Display name and description for the rule


        metric — The device metric being monitored (e.g., battery level,
        connectivity)


        conditions — Threshold definition including value, unit, comparator, and
        toggle_state


        devices / groups — The specific devices or device groups the rule
        applies to


        alert_channels — Array of alert channel IDs that receive notifications
        when the rule fires


        action_emails — Direct email recipients for notifications, independent
        of alert channels


        is_active — Whether the rule is currently enabled


        realert_interval — Interval in minutes before the rule re-alerts if the
        condition persists


        repeat_times — Number of times the alert will repeat


        trigger_count / daily_trigger_count — Cumulative and daily counts of how
        many times the rule has fired


        **Common use cases**


        Auditing all active alarm rules across the enterprise to review
        monitoring coverage


        Retrieving rule IDs for use in get, update, patch, or delete operations


        Filtering for inactive rules to identify stale or disabled monitoring
        configurations


        Reviewing trigger counts to assess alert frequency and rule health


        **Best practices**


        Use is_active=true to scope results to currently enabled rules when
        auditing live monitoring configuration


        Use created_on_gt / created_on_lt to scope results to a specific time
        window when reviewing recently added or historical rules


        Note that alarm_id used in single-rule operations is a UUID, unlike the
        integer alert_id used by alert channels
      operationId: getAlarmRules
      parameters:
        - name: enterprise_id
          in: path
          description: A UUID string identifying this enterprise.
          required: true
          schema:
            type: string
        - name: name
          in: query
          description: Filter alarm rules by name.
          schema:
            type: string
        - name: description
          in: query
          description: Filter alarm rules by description.
          schema:
            type: string
        - name: is_active
          in: query
          description: Filter active alarm rules.
          schema:
            type: boolean
        - name: created_on_gt
          in: query
          description: Filter alarm rules created after a given timestamp.
          schema:
            type: string
        - name: created_on_lt
          in: query
          description: Filter alarm rules created before a given timestamp.
          schema:
            type: string
        - name: limit
          in: query
          description: Number of results to return per page.
          schema:
            type: integer
            default: 20
        - name: offset
          in: query
          description: Return results from this index.
          schema:
            type: integer
            default: 0
      responses:
        '200':
          description: successful operation
          content:
            application/json:
              schema:
                required:
                  - count
                  - results
                type: object
                properties:
                  count:
                    type: integer
                  next:
                    type: string
                    format: url
                    nullable: true
                  previous:
                    type: string
                    format: url
                    nullable: true
                  results:
                    type: array
                    items:
                      $ref: '#/components/schemas/esper_cloud_api_AlarmRule'
        '401':
          description: Authorization information is missing or invalid.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '404':
          description: Not Found.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
      security:
        - esper_cloud_api_apiKey: []
    post:
      x-badges:
        - name: Stable
          color: green
      tags:
        - esper_cloud_api_Alarms
      summary: Creates instance of alarm rules
      description: >
        ⚠️ Android only. 


        Creates a new alarm rule in the enterprise, defining the conditions
        under which a device metric alert is triggered and where notifications
        are sent. Alarm rules combine a monitored metric, a threshold condition,
        a set of target devices or groups, and one or more notification
        destinations into a single automated monitoring configuration.


        An alert channel must already exist before it can be referenced in a new
        alarm rule. Create channels first via POST
        /v1/enterprise/{enterprise_id}/alertchannels/ if needed.


        **Request body fields**


        Required


        enterprise — UUID of the enterprise


        name — Display name for the rule


        metric — The device metric to monitor (e.g., battery level, connectivity
        status)


        conditions — Threshold definition object containing


        value — Numeric threshold value


        unit — Unit of measurement for the threshold


        comparator — Comparison operator (e.g., less than, greater than, equals)


        toggle_state — Boolean for toggle-based metrics (e.g., connectivity
        on/off)



        realert_interval — Interval in minutes before re-alerting if the
        condition continues to be met


        Optional


        description — Human-readable description of the rule's purpose


        devices — Array of specific device IDs to monitor; omit to target groups
        instead


        groups — Array of device group IDs to monitor


        alert_channels — Array of alert channel IDs (UUIDs) to notify when the
        rule fires


        action_emails — Array of email addresses to notify directly, independent
        of alert channels


        actions — Array of actions to perform when the rule fires


        is_active — Whether the rule is active immediately on creation (defaults
        to active if omitted)


        repeat_times — Number of times to repeat the alert


        **Workflow**


        Create alert channels via POST /alertchannels/ if they don't already
        exist


        Create the alarm rule using this endpoint, referencing the channel IDs
        in alert_channels


        Store the UUID id from the 201 response for future get, update, or
        delete operations


        Monitor firing activity via GET /alarmrules/{alarm_id}/alarmhistory/


        **Common use cases**


        Setting up automated alerts for low battery thresholds across a device
        group


        Monitoring connectivity status for devices in a specific location or
        fleet segment


        Configuring re-alert intervals for persistent conditions that require
        ongoing attention


        **Best practices**


        Target groups rather than individual devices where possible —
        group-scoped rules automatically apply to new devices added to the group


        Supply both alert_channels and action_emails if notifications need to
        reach both a shared channel and specific individuals


        Set a sensible realert_interval to avoid alert fatigue — too short an
        interval on frequently triggered conditions can flood notification
        recipients


        Use a descriptive name and description so the rule's purpose is clear
        when auditing via GET /alarmrules/
      operationId: addAlarmRule
      parameters:
        - name: enterprise_id
          in: path
          description: A UUID string identifying this enterprise.
          required: true
          schema:
            type: string
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/esper_cloud_api_UpdateAlarmRule'
        required: true
      responses:
        '201':
          description: successful operation
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_AlarmRule'
        '400':
          description: Bad request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '401':
          description: Authorization information is missing or invalid.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '403':
          description: Forbidden, no permission to perform this action.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
      security:
        - esper_cloud_api_apiKey: []
  /v1/enterprise/{enterprise_id}/alarmrules/{alarm_id}/:
    get:
      x-badges:
        - name: Stable
          color: green
      tags:
        - esper_cloud_api_Alarms
      summary: Get instance of alarm rule
      description: >
        ⚠️ Android only. 


        Returns the full details of a single alarm rule identified by its UUID
        alarm_id, including the monitored metric, threshold conditions, target
        devices or groups, linked alert channels, notification settings, and
        cumulative trigger counts. Use this endpoint to inspect a rule's current
        configuration before updating it, or to check trigger activity for a
        specific rule.


        **Response fields of note**


        id — UUID identifying the alarm rule


        name / description — Display name and description


        metric — The device metric being monitored


        conditions — Threshold definition including value, unit, comparator, and
        toggle_state


        devices / groups — The specific devices or groups the rule applies to


        alert_channels — Alert channel IDs receiving notifications when the rule
        fires


        action_emails — Direct email recipients independent of alert channels


        is_active — Whether the rule is currently enabled


        realert_interval — Minutes before re-alerting if the condition persists


        repeat_times — Number of times the alert repeats


        trigger_count / daily_trigger_count — Cumulative and daily counts of how
        many times the rule has fired


        **Common use cases**


        Retrieving a rule's current configuration before issuing an update or
        patch


        Inspecting trigger_count and daily_trigger_count to assess how
        frequently the rule is firing


        Confirming a rule was created correctly after a POST /alarmrules/ call


        Checking which devices, groups, and alert channels are currently
        associated with a rule


        **Best practices**


        Always retrieve the current state of a rule before updating it to avoid
        overwriting fields unintentionally when using PUT


        Use GET /alarmrules/ with the name filter to locate an alarm_id if it is
        not already known — note that alarm_id is a UUID, unlike the integer
        alert_id used by alert channels


        For a history of when and on which devices the rule has fired, use GET
        /alarmrules/{alarm_id}/alarmhistory/ rather than relying solely on
        trigger_count
      operationId: getAlarmRule
      parameters:
        - name: enterprise_id
          in: path
          description: A UUID string identifying this enterprise.
          required: true
          schema:
            type: string
        - name: alarm_id
          in: path
          description: A UUID string identifying the alarm ruleset.
          required: true
          schema:
            type: string
      responses:
        '200':
          description: successful operation
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_AlarmRule'
        '401':
          description: Authorization information is missing or invalid.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '404':
          description: Not Found.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
      security:
        - esper_cloud_api_apiKey: []
    put:
      x-badges:
        - name: Stable
          color: green
      tags:
        - esper_cloud_api_Alarms
      summary: Update alarm rules
      description: >
        ⚠️ Android only. 


        Fully updates an existing alarm rule identified by its UUID alarm_id.
        This is a full replacement operation — all required fields must be
        included in the request body and any optional fields not included may be
        cleared. To change only one or two fields without resending the full
        rule object, use PATCH
        /v1/enterprise/{enterprise_id}/alarmrules/{alarm_id}/ instead.


        **Request body fields (UpdateAlarmRule)**


        Required


        enterprise — UUID of the enterprise


        name — Display name for the rule


        metric — The device metric to monitor


        conditions — Threshold definition object containing value, unit,
        comparator, and toggle_state


        realert_interval — Interval in minutes before re-alerting if the
        condition persists


        Optional


        description — Human-readable description of the rule's purpose


        devices — Array of specific device UUIDs to monitor


        groups — Array of device group UUIDs to monitor


        alert_channels — Array of alert channel UUIDs to notify when the rule
        fires


        action_emails — Array of email addresses to notify directly


        actions — Array of actions to perform when the rule fires


        is_active — Whether the rule is enabled


        repeat_times — Number of times to repeat the alert


        **Common use cases**


        Updating the target devices or groups after a fleet restructure


        Changing the threshold condition or metric as monitoring requirements
        evolve


        Adding or swapping alert channels when notification routing changes


        Enabling or disabling a rule by toggling is_active


        **Best practices**


        Always retrieve the current rule state with GET
        /v1/enterprise/{enterprise_id}/alarmrules/{alarm_id}/ before updating —
        this is a full replacement and omitting optional fields that were
        previously set may clear them unintentionally


        Prefer PATCH over PUT for single-field changes to reduce payload size
        and risk of accidental data loss


        Note that alarm_id is a UUID, unlike the integer alert_id used by alert
        channels — use GET /alarmrules/ to look it up if needed


        Updating alert_channels replaces the existing channel associations
        entirely — include all desired channel IDs in the updated body, not just
        the new ones
      operationId: updateAlarmRule
      parameters:
        - name: enterprise_id
          in: path
          description: A UUID string identifying this enterprise.
          required: true
          schema:
            type: string
        - name: alarm_id
          in: path
          description: A UUID string identifying the alarm ruleset.
          required: true
          schema:
            type: string
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/esper_cloud_api_UpdateAlarmRule'
        required: true
      responses:
        '200':
          description: successful operation
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_AlarmRule'
        '400':
          description: Invalid request.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '401':
          description: Authorization information is missing or invalid.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '404':
          description: Not Found.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
      security:
        - esper_cloud_api_apiKey: []
    patch:
      x-badges:
        - name: Stable
          color: green
      tags:
        - esper_cloud_api_Alarms
      summary: Partially updates alarm rules
      description: >
        ⚠️ Android only. 


        Partially updates one or more fields of an existing alarm rule
        identified by its UUID alarm_id. Only the fields included in the request
        body are modified — omitted fields retain their current values. Use this
        endpoint instead of PUT when making a targeted change to a single field
        without needing to resend the full rule object.


        **Request body fields (all optional for PATCH)**


        enterprise — UUID of the enterprise


        name — Display name for the rule


        metric — The device metric to monitor


        conditions — Threshold definition object containing value, unit,
        comparator, and toggle_state


        realert_interval — Interval in minutes before re-alerting if the
        condition persists


        description — Human-readable description of the rule's purpose


        devices — Array of specific device UUIDs to monitor


        groups — Array of device group UUIDs to monitor


        alert_channels — Array of alert channel UUIDs to notify when the rule
        fires


        action_emails — Array of email addresses to notify directly


        actions — Array of actions to perform when the rule fires


        is_active — Whether the rule is enabled


        repeat_times — Number of times to repeat the alert


        **Common use cases**


        Toggling is_active to quickly enable or disable a rule without touching
        any other configuration


        Updating realert_interval to tune alert frequency without modifying
        threshold conditions


        Adding or replacing alert_channels or action_emails when notification
        routing changes


        Adjusting conditions thresholds as device fleet behavior or monitoring
        standards evolve


        **Best practices**


        Prefer this endpoint over PUT for targeted changes — it reduces payload
        size and eliminates the risk of accidentally clearing fields that are
        not included in the body


        Note that array fields such as alert_channels, devices, and groups are
        fully replaced when included — if adding to an existing array, retrieve
        the current values first via GET /alarmrules/{alarm_id}/ and include
        them all in the patch body


        alarm_id is a UUID, not an integer — use GET /alarmrules/ with the name
        filter to look it up if needed.
      operationId: patchAlarmRule
      parameters:
        - name: enterprise_id
          in: path
          description: A UUID string identifying this enterprise.
          required: true
          schema:
            type: string
        - name: alarm_id
          in: path
          description: A UUID string identifying the alarm ruleset.
          required: true
          schema:
            type: string
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/esper_cloud_api_UpdateAlarmRule'
      responses:
        '200':
          description: successful operation
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_AlarmRule'
        '400':
          description: Invalid request.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '401':
          description: Authorization information is missing or invalid.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '404':
          description: Not Found.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
      security:
        - esper_cloud_api_apiKey: []
    delete:
      x-badges:
        - name: Stable
          color: green
      tags:
        - esper_cloud_api_Alarms
      summary: Deletes alarm rule
      description: >
        ⚠️ Android only. 


        Permanently deletes an alarm rule identified by its UUID alarm_id. This
        action is irreversible — the rule, its configuration, and its
        association with any alert channels are removed immediately. Historical
        firing data for the rule is also no longer accessible after deletion.


        **Common use cases**


        Removing alarm rules that are no longer relevant after a fleet
        restructure or deployment phase ends


        Cleaning up duplicate or misconfigured rules created during setup


        Decommissioning monitoring configurations for device groups that have
        been dissolved


        **Best practices**


        Retrieve the rule with GET
        /v1/enterprise/{enterprise_id}/alarmrules/{alarm_id}/ before deleting to
        confirm it is the correct rule — this action cannot be undone


        If the intent is to stop the rule from firing temporarily rather than
        permanently remove it, consider using PATCH
        /v1/enterprise/{enterprise_id}/alarmrules/{alarm_id}/ to set
        is_active=false instead


        Review firing history via GET /alarmrules/{alarm_id}/alarmhistory/
        before deleting if the rule's historical trigger data is needed for
        reporting or auditing purposes — this data will not be recoverable after
        deletion


        Note that deleting an alarm rule does not delete the alert channels it
        referenced — channels are enterprise-level resources and remain
        available for use by other rules
      operationId: deleteAlarmRule
      parameters:
        - name: enterprise_id
          in: path
          description: A UUID string identifying this enterprise.
          required: true
          schema:
            type: string
        - name: alarm_id
          in: path
          description: A UUID string identifying the alarm ruleset.
          required: true
          schema:
            type: string
      responses:
        '204':
          description: The resource was deleted successfully.
        '400':
          description: Invalid request.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '401':
          description: Authorization information is missing or invalid.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '403':
          description: Forbidden, no permission to perform this action.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '404':
          description: Not Found.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
      security:
        - esper_cloud_api_apiKey: []
  /v1/enterprise/{enterprise_id}/alarmrules/{alarm_id}/alarmhistory/:
    get:
      x-badges:
        - name: Stable
          color: green
      tags:
        - esper_cloud_api_Alarms
      summary: Get history of alarm rule
      description: >
        ⚠️ Android only. 


        Returns the firing history for a specific alarm rule identified by its
        UUID alarm_id. Each record in the response represents an instance when
        the rule's conditions were met, identifying the device that triggered
        the alert, the group it belongs to, and the timestamps for when the
        alert fired and when the condition was last observed.


        **Response fields of note**


        device_name — Name of the device that triggered the alert


        device_id — UUID of the device that triggered the alert


        group_id — Array of group UUIDs the triggering device belongs to


        group_name — Name of the group the triggering device belongs to


        alert_time — Timestamp of when the alert fired


        latest_seen — Timestamp of when the triggering condition was last
        observed on the device


        **Common use cases**


        Investigating which specific devices triggered an alarm rule and when,
        to support troubleshooting or incident response


        Auditing alert activity before deleting an alarm rule to preserve a
        record of its history


        Assessing whether a rule is firing too frequently or on unexpected
        devices, to inform threshold tuning


        Generating compliance or operational reports on device health events
        over time


        **Best practices**


        Review this endpoint before deleting an alarm rule — firing history is
        not recoverable after the rule is deleted


        Cross-reference device_id values with GET
        /enterprise/{enterprise_id}/device/{device_id}/ to retrieve full device
        context for triggered alerts


        alarm_id is a UUID — use GET /alarmrules/ with the name filter to look
        it up if it is not already known
      operationId: getAlarmHistory
      parameters:
        - name: enterprise_id
          in: path
          description: A UUID string identifying this enterprise.
          required: true
          schema:
            type: string
        - name: alarm_id
          in: path
          description: A UUID string identifying the alarm ruleset.
          required: true
          schema:
            type: string
      responses:
        '200':
          description: successful operation
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_AlarmHistory'
        '401':
          description: Authorization information is missing or invalid.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '404':
          description: Not Found.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
      security:
        - esper_cloud_api_apiKey: []
  /v1/enterprise/{enterprise_id}/wallpaper/:
    get:
      x-badges:
        - name: Stable
          color: green
      tags:
        - esper_cloud_api_Wallpapers
      summary: Get list of wallpapers
      description: >-
        Returns a paginated list of all wallpaper images uploaded to the
        enterprise. Each result includes the image URL, thumbnail URL,
        orientation, and active status. Wallpapers can be uploaded directly via
        the API or may have been added through a blueprint configuration.


        **Response fields of note**


        id — UUID identifying the wallpaper; used to reference it in Windows
        blueprint wallpaper settings


        image_file — URL of the full-resolution wallpaper image


        thumbnail — URL of the thumbnail preview


        orientation — Orientation of the image (e.g., landscape)


        is_active — Whether the wallpaper is currently active


        created_on / updated_on — Timestamps for auditing purposes


        **Common Use Cases**


        Discovering wallpaper_id values to reference in Windows blueprint
        homescreen or lock screen wallpaper settings


        Verifying a wallpaper was successfully uploaded before referencing it in
        a blueprint


        Building wallpaper selection UIs in custom management tools


        **Best Practices**


        Use timestamp filters to scope results when auditing recently added or
        modified wallpapers rather than fetching the full list


        Store wallpaper_id UUIDs for use in Windows blueprint configuration —
        the wallpaper_id field appears in both homescreen and lock screen
        landscape settings


        Note that wallpapers uploaded as part of a blueprint configuration will
        also appear in this list and can be reused across multiple blueprints
      operationId: getWallpapers
      parameters:
        - name: enterprise_id
          in: path
          description: A UUID string identifying this enterprise.
          required: true
          schema:
            type: string
        - name: created_on_gt
          in: query
          description: Filter applications created after a given timestamp.
          schema:
            type: string
            format: datetime
        - name: created_on_lt
          in: query
          description: Filter applications created before a given timestamp.
          schema:
            type: string
            format: datetime
        - name: updated_on_gt
          in: query
          description: Filter applications updated after a given timestamp.
          schema:
            type: string
            format: datetime
        - name: updated_on_lt
          in: query
          description: Filter applications updated before a given timestamp.
          schema:
            type: string
            format: datetime
        - name: limit
          in: query
          description: Number of results to return per page.
          schema:
            type: integer
            default: 20
        - name: offset
          in: query
          description: Return results from this index.
          schema:
            type: integer
            default: 0
      responses:
        '200':
          description: successful operation
          content:
            application/json:
              schema:
                required:
                  - count
                  - results
                type: object
                properties:
                  count:
                    type: integer
                  next:
                    type: string
                    format: url
                    nullable: true
                  previous:
                    type: string
                    format: url
                    nullable: true
                  results:
                    type: array
                    items:
                      $ref: '#/components/schemas/esper_cloud_api_Wallpaper'
        '401':
          description: Authorization information is missing or invalid.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '404':
          description: Not Found.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
      security:
        - esper_cloud_api_apiKey: []
    post:
      x-badges:
        - name: Stable
          color: green
      tags:
        - esper_cloud_api_Wallpapers
      summary: Create wallpaper
      description: >-
        Uploads a new wallpaper image to the enterprise. The image is submitted
        as a multipart/form-data request and, once uploaded, can be referenced
        by wallpaper_id in Windows blueprint homescreen and lock screen
        settings. There is no dedicated wallpaper library in the console.
        Wallpapers are only visible by previewing their associated blueprint.


        **Request body (multipart/form-data)**


        image_file (required) — The image file to upload


        orientation (required) — Orientation of the image (e.g., landscape)


        **Common Use Cases**


        Adding a new branded wallpaper before assigning it to a blueprint


        Programmatically uploading wallpapers as part of an enterprise
        onboarding or branding 


        **Workflow**


        Replacing an outdated wallpaper by uploading a new version and updating
        blueprint references to point to the new wallpaper_id


        **Best Practices**


        Store the wallpaper_id UUID from the response — it is required to
        reference the wallpaper in a blueprint homescreen and lock screen
        settings


        Since wallpapers are not browsable in the Console, use GET
        /v1/enterprise/{enterprise_id}/wallpaper/ to audit what has been
        uploaded and avoid creating duplicates


        Specify orientation accurately at upload time — this metadata cannot be
        changed after upload; upload a new image if the orientation needs to be
        corrected


        Verify a wallpaper is not referenced in any active blueprint before
        deleting it, as there is no Console warning to flag active references
      operationId: addWallpaper
      parameters:
        - name: enterprise_id
          in: path
          description: A UUID string identifying this enterprise.
          required: true
          schema:
            type: string
      requestBody:
        content:
          multipart/form-data:
            schema:
              required:
                - image_file
                - orientation
              properties:
                image_file:
                  type: string
                  description: Valid file to upload
                  format: path
                orientation:
                  type: string
                  description: Orientation of image e.g. landscape
        required: true
      responses:
        '201':
          description: Successful Operation
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_Wallpaper'
        '400':
          description: Bad request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '401':
          description: Authorization information is missing or invalid.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '403':
          description: Forbidden, no permission to perform this action.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '415':
          description: Unsupported media type.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
      security:
        - esper_cloud_api_apiKey: []
  /v1/enterprise/{enterprise_id}/wallpaper/{wallpaper_id}/:
    get:
      x-badges:
        - name: Stable
          color: green
      tags:
        - esper_cloud_api_Wallpapers
      summary: Get instance of wallpaper
      description: >-
        Returns the details of a single wallpaper image identified by its UUID
        wallpaper_id, including the full-resolution image URL, thumbnail URL,
        orientation, and active status. There is no dedicated wallpaper library
        in the Console — wallpapers are only visible by previewing the blueprint
        they are associated with, making this endpoint the primary way to
        retrieve details for a specific wallpaper programmatically.


        **Response fields of note**


        id — UUID identifying the wallpaper


        image_file — URL of the full-resolution wallpaper image


        thumbnail — URL of the thumbnail preview


        orientation — Orientation of the image (e.g., landscape)


        is_active — Whether the wallpaper is currently active


        created_on / updated_on — Timestamps for auditing purposes


        **Common Use Cases**


        Retrieving wallpaper details to confirm a successful upload before
        referencing the wallpaper_id in a blueprint


        Auditing the metadata of a specific wallpaper when the wallpaper_id is
        already known


        Verifying the orientation or active status of a wallpaper before
        assigning it to a Windows blueprint


        **Best Practices**


        If the wallpaper_id is not already known, use GET
        /v1/enterprise/{enterprise_id}/wallpaper/ with timestamp filters to
        locate it — wallpapers are not browsable in the Console


        This endpoint returns metadata and image URLs only; the image itself
        must be accessed directly via the image_file URL in the response
      operationId: getWallpaper
      parameters:
        - name: enterprise_id
          in: path
          description: A UUID string identifying this enterprise.
          required: true
          schema:
            type: string
        - name: wallpaper_id
          in: path
          description: A UUID string identifying the wallpaper.
          required: true
          schema:
            type: string
      responses:
        '200':
          description: successful operation
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_Wallpaper'
        '401':
          description: Authorization information is missing or invalid.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '404':
          description: Not Found.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
      security:
        - esper_cloud_api_apiKey: []
    delete:
      x-badges:
        - name: Stable
          color: green
      tags:
        - esper_cloud_api_Wallpapers
      summary: Deletes instance of wallpaper
      description: >-
        Permanently deletes a wallpaper image from the enterprise identified by
        its UUID wallpaper_id. This action is irreversible. Since there is no
        dedicated wallpaper library in the Console, use GET
        /v1/enterprise/{enterprise_id}/wallpaper/ to confirm the correct
        wallpaper_id before deleting.


        **Common Use Cases**


        Removing outdated or superseded wallpaper images from the enterprise


        Cleaning up duplicate or test wallpapers uploaded during setup


        Decommissioning branding assets that are no longer in use


        **Best Practices**


        Verify the wallpaper is not currently referenced in any active blueprint
        before deleting — there is no Console warning to flag active references,
        and removing a wallpaper that is still assigned to a blueprint may
        result in those devices receiving no wallpaper on next convergence


        Confirm the correct wallpaper_id using GET
        /v1/enterprise/{enterprise_id}/wallpaper/{wallpaper_id}/ before deleting
        — this action cannot be undone


        If replacing a wallpaper rather than simply removing it, upload the new
        image first via POST /v1/enterprise/{enterprise_id}/wallpaper/, update
        all blueprint references to the new wallpaper_id, and then delete the
        old wallpaper
      operationId: deleteWallpaper
      parameters:
        - name: enterprise_id
          in: path
          description: A UUID string identifying this enterprise.
          required: true
          schema:
            type: string
        - name: wallpaper_id
          in: path
          description: A UUID string identifying the wallpaper.
          required: true
          schema:
            type: string
      responses:
        '204':
          description: The resource was deleted successfully.
        '400':
          description: Invalid request.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '401':
          description: Authorization information is missing or invalid.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '403':
          description: Forbidden, no permission to perform this action.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '404':
          description: Not Found.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
      security:
        - esper_cloud_api_apiKey: []
  /v1/enterprise/{enterprise_id}/tile-icons/:
    get:
      x-badges:
        - name: Stable
          color: green
      tags:
        - esper_cloud_api_Tile Icon
      summary: Get List of Device Tile Icons
      description: Returns list of tile icons
      operationId: getTileIcons
      parameters:
        - name: enterprise_id
          in: path
          description: A UUID string identifying this enterprise.
          required: true
          schema:
            type: string
        - name: created_on_gt
          in: query
          description: Filter tile icons created after a given timestamp.
          schema:
            type: string
            format: datetime
        - name: created_on_lt
          in: query
          description: Filter tile icons created before a given timestamp.
          schema:
            type: string
            format: datetime
        - name: updated_on_gt
          in: query
          description: Filter tile icons updated after a given timestamp.
          schema:
            type: string
            format: datetime
        - name: updated_on_lt
          in: query
          description: Filter tile icons updated before a given timestamp.
          schema:
            type: string
            format: datetime
        - name: category
          in: query
          description: Filter tile icons by category.
          schema:
            type: string
        - name: device_model
          in: query
          description: Filter tile icons by device model.
          schema:
            type: string
        - name: custom
          in: query
          description: Filter custom tile icons.
          schema:
            type: boolean
      responses:
        '200':
          description: successful operation
          content:
            application/json:
              schema:
                required:
                  - count
                  - results
                type: object
                properties:
                  count:
                    type: integer
                  next:
                    type: string
                    format: url
                    nullable: true
                  previous:
                    type: string
                    format: url
                    nullable: true
                  results:
                    type: array
                    items:
                      $ref: '#/components/schemas/esper_cloud_api_TileIcon'
        '401':
          description: Authorization information is missing or invalid.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '404':
          description: Not Found.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
      security:
        - esper_cloud_api_apiKey: []
    post:
      x-badges:
        - name: Stable
          color: green
      tags:
        - esper_cloud_api_Tile Icon
      summary: Create a  tile icon
      description: Create a tile icon.
      operationId: addTileIcon
      parameters:
        - name: enterprise_id
          in: path
          description: A UUID string identifying this enterprise.
          required: true
          schema:
            type: string
      requestBody:
        content:
          multipart/form-data:
            schema:
              required:
                - icon_file
                - device_model
                - enterprise
              properties:
                icon_file:
                  type: string
                  description: Valid file to upload
                  format: path
                device_model:
                  type: string
                  description: Device model
                enterprise:
                  type: string
                  format: uuid
                  description: UUID string representing enterprise of tile icon
        required: true
      responses:
        '201':
          description: Successful Operation
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_TileIcon'
        '400':
          description: Bad request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '401':
          description: Authorization information is missing or invalid.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '403':
          description: Forbidden, no permission to perform this action.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '415':
          description: Unsupported media type.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
      security:
        - esper_cloud_api_apiKey: []
  /v1/enterprise/{enterprise_id}/tile-icons/{tileicons_id}/:
    get:
      x-badges:
        - name: Stable
          color: green
      tags:
        - esper_cloud_api_Tile Icon
      summary: Get instance of a tile icon
      description: Get a tile icon.
      operationId: getTileIcon
      parameters:
        - name: enterprise_id
          in: path
          description: A UUID string identifying this enterprise.
          required: true
          schema:
            type: string
        - name: tileicons_id
          in: path
          description: A UUID string identifying the tile icon.
          required: true
          schema:
            type: string
      responses:
        '200':
          description: successful operation
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_TileIcon'
        '401':
          description: Authorization information is missing or invalid.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '404':
          description: Not Found.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
      security:
        - esper_cloud_api_apiKey: []
    delete:
      x-badges:
        - name: Stable
          color: green
      tags:
        - esper_cloud_api_Tile Icon
      summary: Delete a tile icon
      description: Deletes a title icon
      operationId: deleteTileIcon
      parameters:
        - name: enterprise_id
          in: path
          description: A UUID string identifying this enterprise.
          required: true
          schema:
            type: string
        - name: tileicons_id
          in: path
          description: A UUID string identifying the tile icon.
          required: true
          schema:
            type: string
      responses:
        '204':
          description: The resource was deleted successfully.
        '400':
          description: Invalid request.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '401':
          description: Authorization information is missing or invalid.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '403':
          description: Forbidden, no permission to perform this action.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '404':
          description: Not Found.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
      security:
        - esper_cloud_api_apiKey: []
  /v1/enterprise/{enterprise_id}/tile-icon-apply/:
    post:
      x-badges:
        - name: Stable
          color: green
      tags:
        - esper_cloud_api_Tile Icon
      summary: Set a tile icon for a device
      description: Apply a tile icon to a device.
      operationId: applyTileIcon
      parameters:
        - name: enterprise_id
          in: path
          description: A UUID string identifying this enterprise.
          required: true
          schema:
            type: string
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/esper_cloud_api_ApplyTileIcon'
        required: true
      responses:
        '201':
          description: Successful Operation
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ApplyTileIcon'
        '400':
          description: Bad request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '401':
          description: Authorization information is missing or invalid.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '403':
          description: Forbidden, no permission to perform this action.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
      security:
        - esper_cloud_api_apiKey: []
  /v1/enterprise/{enterprise_id}/tile-icon-unapply/:
    post:
      x-badges:
        - name: Stable
          color: green
      tags:
        - esper_cloud_api_Tile Icon
      summary: Removes tile icon for device
      description: Returns the model of the device(s)
      operationId: removeTileIcon
      parameters:
        - name: enterprise_id
          in: path
          description: A UUID string identifying this enterprise.
          required: true
          schema:
            type: string
      requestBody:
        content:
          application/json:
            schema:
              required:
                - model
              properties:
                model:
                  type: string
                  description: Model of device
        required: true
      responses:
        '201':
          description: Successful Operation
          content:
            application/json:
              schema:
                properties:
                  model:
                    type: string
                    description: Model of device
        '400':
          description: Bad request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '401':
          description: Authorization information is missing or invalid.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '403':
          description: Forbidden, no permission to perform this action.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
      security:
        - esper_cloud_api_apiKey: []
  /v1/enterprise/{enterprise_id}/report/location/:
    get:
      x-badges:
        - name: Stable
          color: green
      tags:
        - esper_cloud_api_Device Telemetry
      summary: Get list of device locations
      description: Returns list of device locations
      operationId: getDeviceLocations
      parameters:
        - name: enterprise_id
          in: path
          description: A UUID string identifying this enterprise.
          required: true
          schema:
            type: string
        - name: limit
          in: query
          description: Number of results to return per page.
          schema:
            type: integer
        - name: offset
          in: query
          description: The initial index from which to return the results.
          schema:
            type: integer
      responses:
        '200':
          description: successful operation
          content:
            application/json:
              schema:
                required:
                  - count
                  - results
                type: object
                properties:
                  count:
                    type: integer
                  next:
                    type: string
                    format: url
                    nullable: true
                  previous:
                    type: string
                    format: url
                    nullable: true
                  results:
                    type: array
                    items:
                      $ref: '#/components/schemas/esper_cloud_api_DeviceLocations'
        '401':
          description: Authorization information is missing or invalid.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '404':
          description: Not Found.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
      security:
        - esper_cloud_api_apiKey: []
  /v1/enterprise/{enterprise_id}/report/location/{location_id}/:
    get:
      x-badges:
        - name: Stable
          color: green
      tags:
        - esper_cloud_api_Device Telemetry
      summary: Get location of specific device
      description: Returns location information of device
      operationId: getSpecificLocations
      parameters:
        - name: enterprise_id
          in: path
          description: A UUID string identifying this enterprise.
          required: true
          schema:
            type: string
        - name: location_id
          in: path
          description: An integer identifying the location.
          required: true
          schema:
            type: integer
      responses:
        '200':
          description: successful operation
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_DeviceLocations'
        '401':
          description: Authorization information is missing or invalid.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '404':
          description: Not Found.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
      security:
        - esper_cloud_api_apiKey: []
  /v1/enterprise/{enterprise_id}/report/device-tiles/:
    get:
      x-badges:
        - name: Stable
          color: green
      tags:
        - esper_cloud_api_Device Telemetry
      summary: Get list of device tiles reports
      description: Returns list of device tiles reports
      operationId: getDeviceTileReports
      parameters:
        - name: enterprise_id
          in: path
          description: A UUID string identifying this enterprise.
          required: true
          schema:
            type: string
        - name: state
          in: query
          description: Filter device-tile reports by state.
          schema:
            type: integer
        - name: created_on_gt
          in: query
          description: Filter device-tile reports created after a given timestamp.
          schema:
            type: string
            format: datetime
        - name: created_on_lt
          in: query
          description: Flter device-tile reports created before a given timestamp.
          schema:
            type: string
            format: datetime
        - name: provisioned_on_gt
          in: query
          description: Filter device-tile reports provisioned after a given timestamp.
          schema:
            type: string
            format: datetime
        - name: provisioned_on_lt
          in: query
          description: Filter device-tile reports provisioned before a given timestamp.
          schema:
            type: string
            format: datetime
        - name: updated_on_gt
          in: query
          description: Filter device-tile reports updated after a given timestamp.
          schema:
            type: string
            format: datetime
        - name: updated_on_lt
          in: query
          description: Filter device-tile reports updated before a given timestamp.
          schema:
            type: string
            format: datetime
        - name: last_seen_gt
          in: query
          description: Filter device-tile reports last seen after a given timestamp.
          schema:
            type: string
            format: datetime
        - name: last_seen_lt
          in: query
          description: Filter device-tile reports last seen before a given timestamp.
          schema:
            type: string
            format: datetime
        - name: battery_level_gte
          in: query
          description: >-
            Filter device-tile reports by battery level greater than given
            battery level.
          schema:
            type: number
            format: double
        - name: battery_level_lte
          in: query
          description: >-
            Filter device-tile reports by battery level lower than given battery
            level.
          schema:
            type: number
            format: double
        - name: at_risk
          in: query
          description: Filter device-tile reports by whether they are at risk.
          schema:
            type: boolean
        - name: security_status
          in: query
          schema:
            $ref: '#/components/schemas/esper_cloud_api_SecurityStatesEnum'
        - name: status
          in: query
          description: Filter device-tile reports by status.
          schema:
            type: string
        - name: group
          in: query
          description: Filter device-tile reports by group.
          schema:
            type: string
            format: uuid
        - name: group_name
          in: query
          description: Filter device-tile reports by group name.
          schema:
            type: string
        - name: group_name_multi
          in: query
          description: Filter device-tile reports using multiple group names.
          schema:
            type: string
            description: Add group names to filter by comma separating
        - name: group_multi
          in: query
          description: Filter device-tile reports by using multiple group ID's
          schema:
            type: string
            format: uuid
            description: Add group UUID to filter by comma separating
        - name: group_multi_immediate
          in: query
          description: Filter device-tile reports by immediate groups
          schema:
            type: string
        - name: group_null
          in: query
          description: >-
            Filter device-tile reports by availability of group. True returns
            device-tiles with no group. False returns device-tiles with group.
          schema:
            type: string
            format: boolean
            description: Allowed values are True, False, true, false, 1, 0.
        - name: imei
          in: query
          description: Filter device-tile reports by imei.
          schema:
            type: string
        - name: name
          in: query
          description: Filter device-tile reports by device name.
          schema:
            type: string
        - name: recently_added
          in: query
          description: Filter device-tile reports by recently added.
          schema:
            type: boolean
        - name: is_gms
          in: query
          description: Filter device-tile reports for gms devices.
          schema:
            type: boolean
        - name: tags
          in: query
          description: Filter device-tile reports by tag.
          schema:
            type: string
        - name: is_geofence_applied
          in: query
          description: Filter device-tile reports by geofence application.
          schema:
            type: boolean
        - name: serial
          in: query
          description: Filter device-tile reports by device serial id.
          schema:
            type: string
        - name: android_version
          in: query
          description: Filter device-tile reports by android version.
          schema:
            type: integer
        - name: android_version_multi
          in: query
          description: Filter device-tile reports by multiple android versions.
          schema:
            type: integer
            description: List of android versions- comma separated.
        - name: wifi_ssid
          in: query
          description: Filter device-tile reports by wifi-ssid.
          schema:
            type: string
        - name: network_type
          in: query
          description: Filter device-tile reports by network type.
          schema:
            type: string
        - name: network_type_multi
          in: query
          description: Filter device-tile reports by multiple network types.
          schema:
            type: string
            description: List of network types, comma separated.
        - name: model
          in: query
          description: Filter device-tile reports by device model.
          schema:
            type: string
        - name: template
          in: query
          description: Filter device-tile reports by template.
          schema:
            type: string
        - name: template_multi
          in: query
          description: Filter device-tile reports by multiple templates.
          schema:
            type: string
            description: List of templates, comma separated.
        - name: policy
          in: query
          description: Filter device-tile reports by policy name.
          schema:
            type: string
        - name: policy_multi
          in: query
          description: Filter device-tile reports by multiple policies.
          schema:
            type: string
            description: List of policy names, comma separated.
        - name: policy_null
          in: query
          description: Filter device-tile reports by null-value policy.
          schema:
            type: boolean
        - name: dpc_version
          in: query
          description: Filter device-tile reports by DPC version.
          schema:
            type: string
        - name: location
          in: query
          description: Filter device-tile reports by location.
          schema:
            type: string
            description: City or state can be used to filter location.
        - name: active_connection
          in: query
          description: Filter device-tile reports by active connection status.
          schema:
            type: boolean
        - name: device_type
          in: query
          description: Filter device-tile reports by device type.
          schema:
            type: string
        - name: has_seamlessInfo
          in: query
          description: Filter device-tile reports by seamless information.
          schema:
            type: boolean
      responses:
        '200':
          description: successful operation
          content:
            application/json:
              schema:
                required:
                  - count
                  - results
                type: object
                properties:
                  count:
                    type: integer
                  next:
                    type: string
                    format: url
                    nullable: true
                  previous:
                    type: string
                    format: url
                    nullable: true
                  results:
                    type: array
                    items:
                      $ref: '#/components/schemas/esper_cloud_api_DeviceTiles'
        '401':
          description: Authorization information is missing or invalid.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '404':
          description: Not Found.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
      security:
        - esper_cloud_api_apiKey: []
  /v1/enterprise/{enterprise_id}/report/device-tiles/{device_tiles_id}/:
    get:
      x-badges:
        - name: Stable
          color: green
      tags:
        - esper_cloud_api_Device Telemetry
      summary: Get instance of device tiles report
      description: Returns instance of device tiles report
      operationId: getDeviceTileReport
      parameters:
        - name: enterprise_id
          in: path
          description: A UUID string identifying this enterprise.
          required: true
          schema:
            type: string
        - name: device_tiles_id
          in: path
          description: An integer representing the device tile report.
          required: true
          schema:
            type: integer
      responses:
        '200':
          description: successful operation
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_DeviceTiles'
        '401':
          description: Authorization information is missing or invalid.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '404':
          description: Not Found.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
      security:
        - esper_cloud_api_apiKey: []
  /v1/enterprise/{enterprise_id}/report/status-metrics/:
    get:
      x-badges:
        - name: Stable
          color: green
      tags:
        - esper_cloud_api_Device Telemetry
      summary: Get status metrics report for enterprise
      description: Returns status metrics report for enterprise
      operationId: getStatusMetrics
      parameters:
        - name: enterprise_id
          in: path
          description: A UUID string identifying this enterprise.
          required: true
          schema:
            type: string
      responses:
        '200':
          description: successful operation
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_StatusMetrics'
        '401':
          description: Authorization information is missing or invalid.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '404':
          description: Not Found.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
      security:
        - esper_cloud_api_apiKey: []
  /enterprise/report/info/:
    get:
      x-badges:
        - name: Stable
          color: green
      tags:
        - esper_cloud_api_Daily and Custom Reports
      summary: Get report information
      description: >
        ⚠️ Legacy feature. Android only. Daily and Custom Reports are a legacy
        feature. For current reporting needs, use the Reports API: GET
        /report/v0/report-types, POST /report/v0/reports, and GET
        /report/v0/reports/{report_id}.


        Retrieves metadata about your enterprise's reporting configuration,
        including how far back historical report data is available.


        Use this endpoint to check whether the reports workflow is enabled for
        your enterprise and the earliest date from which report data can be
        queried before making date-scoped report requests.


        **About Get Report Info**


        This endpoint returns two key configuration values for the enterprise's
        legacy reporting system: reportAvailabilityFrom, which indicates the
        earliest datetime from which historical report data exists, and
        enableReports**Workflow**, a boolean indicating whether the reporting
        feature is active. Query this endpoint first when working with the
        legacy report endpoints to avoid date-range errors and confirm feature
        availability.
      responses:
        '200':
          description: successful operation
          content:
            application/json:
              schema:
                type: object
                properties:
                  reportAvailabilityFrom:
                    type: string
                    format: date-time
                  enableReports**Workflow**:
                    type: boolean
        '401':
          description: Authorization information is missing or invalid.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '404':
          description: Not Found.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
      security:
        - esper_cloud_api_apiKey: []
  /enterprise/report/device-report/:
    get:
      x-badges:
        - name: Stable
          color: green
      tags:
        - esper_cloud_api_Daily and Custom Reports
      summary: Get device status reports within specified date-time range
      description: >
        ⚠️ Legacy feature. Android only. Daily and Custom Reports are a legacy
        feature. For current reporting needs, use the Reports API: GET
        /report/v0/report-types, POST /report/v0/reports, and GET
        /report/v0/reports/{report_id}.


        Returns per-device status reports organized by device group for a
        specified date-time range.

        This endpoint provides a hierarchical view of device health data grouped
        by Esper device groups, including active, inactive, registered, new, and
        disabled device counts, with per-device detail records nested inside
        each group.


        **About Get Device Report**


        The device report is a time-scoped snapshot of device status across your
        fleet, structured by group. Each group entry includes aggregate device
        counts and an array of DeviceStatusReport objects representing
        individual devices. Both start_date and end_date are required; only data
        within that window is returned.
      operationId: getDeviceReport
      parameters:
        - name: start_date
          in: query
          required: true
          description: Start date of range in which to retrieve device status reports
          schema:
            type: string
            format: date-time
        - name: end_date
          in: query
          required: true
          description: End date of range in which to retrieve device status reports
          schema:
            type: string
            format: date-time
        - name: sync
          in: query
          required: false
          description: Sync device status report to specified field
          schema:
            type: boolean
            default: true
        - name: fields
          in: query
          required: false
          description: List of fields to add to device status report, comma separated
          schema:
            type: string
      responses:
        '200':
          description: successful operation
          content:
            application/json:
              schema:
                type: array
                items:
                  properties:
                    group_id:
                      type: string
                      format: uuid
                    group_name:
                      type: string
                    group_path:
                      type: string
                    active_devices:
                      type: integer
                    inactive_devices:
                      type: integer
                    registered_devices:
                      type: integer
                    new_devices:
                      type: integer
                    disabled_devices:
                      type: integer
                    device_status_reports:
                      type: array
                      items:
                        $ref: >-
                          #/components/schemas/esper_cloud_api_DeviceStatusReport
        '401':
          description: Authorization information is missing or invalid.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '404':
          description: Not Found.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
      security:
        - esper_cloud_api_apiKey: []
  /enterprise/report/enterprise-report/:
    get:
      x-badges:
        - name: Stable
          color: green
      tags:
        - esper_cloud_api_Daily and Custom Reports
      summary: Get enterprise report
      description: >
        ⚠️ Legacy feature. Android only.Daily and Custom Reports are a legacy
        feature. For current reporting needs, use the Reports API: GET
        /report/v0/report-types, POST /report/v0/reports, and GET
        /report/v0/reports/{report_id}.


        Returns a high-level summary of device provisioning and activity across
        the entire enterprise for a specified date-time range.

        Use this endpoint to retrieve top-level fleet metrics — peak active
        devices, total provisioned devices, and total registered devices — for a
        given reporting window, without group or per-device breakdowns.


        **About Get Enterprise Report**


        The enterprise report provides a single aggregated view of fleet scale
        and activity for a time window bounded by start_date and end_date.
        Unlike the device report (per-device data by group) or the group report
        (segmented by group), this endpoint collapses the entire fleet into
        three summary metrics. It is most useful for executive dashboards,
        capacity planning, and trend tracking in legacy reporting contexts.
      operationId: getEnterpriseReport
      parameters:
        - name: start_date
          in: query
          required: true
          description: Start date of range in which to retrieve enterprise report.
          schema:
            type: string
            format: date-time
        - name: end_date
          in: query
          required: true
          description: End date of range in which to retrieve enterprise report.
          schema:
            type: string
            format: date-time
      responses:
        '200':
          description: successful operation
          content:
            application/json:
              schema:
                type: object
                properties:
                  peak_active_devices:
                    type: integer
                  provisioned_devices:
                    type: integer
                  registered_devices:
                    type: integer
        '401':
          description: Authorization information is missing or invalid.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '404':
          description: Not Found.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
      security:
        - esper_cloud_api_apiKey: []
  /enterprise/report/group-report/:
    get:
      x-badges:
        - name: Stable
          color: green
      tags:
        - esper_cloud_api_Daily and Custom Reports
      summary: Get group report
      description: >
        ⚠️ Legacy feature. Android only. Daily and Custom Reports are a legacy
        feature. For current reporting needs, use the Reports API: GET
        /report/v0/report-types, POST /report/v0/reports, and GET
        /report/v0/reports/{report_id}.


        Returns device count summaries broken down by device group for a
        specified date-time range.

        Use this endpoint to get group-level device status aggregates — active,
        inactive, registered, new, and disabled counts — without per-device
        detail records.


        **About Get Group Report**


        The group report provides a fleet view organized by Esper device groups,
        returning one GroupReport object per group within the specified date
        window. It is a leaner alternative to the device report when group-level
        aggregates are all that's needed. Both start_date and end_date are
        required.
      operationId: getGroupReport
      parameters:
        - name: start_date
          in: query
          required: true
          description: Start date of range in which to retrieve group report.
          schema:
            type: string
            format: date-time
        - name: end_date
          in: query
          required: true
          description: End date of range in which to retrieve group report.
          schema:
            type: string
            format: date-time
        - name: sync
          in: query
          required: false
          description: Sync device status report to specified field
          schema:
            type: boolean
            default: true
      responses:
        '200':
          description: successful operation
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/esper_cloud_api_GroupReport'
        '401':
          description: Authorization information is missing or invalid.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '404':
          description: Not Found.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
      security:
        - esper_cloud_api_apiKey: []
  /enterprise/report/subscription/:
    get:
      x-badges:
        - name: Stable
          color: green
      tags:
        - esper_cloud_api_Daily and Custom Reports
      summary: Get list of subscription reports
      description: >
        ⚠️ Legacy feature. Android only. Daily and Custom Reports are a legacy
        feature. For current reporting needs, use the Reports API: GET
        /report/v0/report-types, POST /report/v0/reports, and GET
        /report/v0/reports/{report_id}.


        Creates a new report subscription that sends scheduled daily reports to
        one or more email addresses.

        Supply a list of recipient email addresses in the request body; Esper
        creates a subscription record and begins delivering daily fleet reports
        to those recipients.


        **About Create Report Subscription**


        Report subscriptions were Esper's mechanism for automated, scheduled
        delivery of daily device and fleet status reports via email.
        Subscriptions are part of the legacy Daily and Custom Reports system and
        do not exist in the current Reports API. Each subscription holds a list
        of recipient email addresses and an is_subscribed toggle. The integer id
        returned on creation is required for all subsequent GET, PUT, PATCH, and
        DELETE operations on the subscription.
      operationId: getSubscriptionReports
      responses:
        '200':
          description: successful operation
          content:
            application/json:
              schema:
                required:
                  - count
                  - results
                type: object
                properties:
                  count:
                    type: integer
                  next:
                    type: string
                    format: url
                    nullable: true
                  previous:
                    type: string
                    format: url
                    nullable: true
                  results:
                    type: array
                    items:
                      $ref: '#/components/schemas/esper_cloud_api_Subscription'
        '401':
          description: Authorization information is missing or invalid.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '404':
          description: Not Found.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
      security:
        - esper_cloud_api_apiKey: []
    post:
      x-badges:
        - name: Stable
          color: green
      tags:
        - esper_cloud_api_Daily and Custom Reports
      summary: Post subscription to enterprise
      description: >
        ⚠️ Legacy feature. Android only.Daily and Custom Reports are a legacy
        feature, and report subscriptions are not part of the current reporting
        system. For current reporting needs, use the Reports API: GET
        /report/v0/report-types, POST /report/v0/reports, and GET
        /report/v0/reports/{report_id}.


        Returns a paginated list of all report subscriptions configured for the
        enterprise.

        Use this endpoint to inspect which email addresses are enrolled for
        legacy daily report delivery and the active/inactive state of each
        subscription record.


        **About List Report Subscriptions**


        This endpoint returns all legacy subscription records associated with
        the enterprise, each containing the recipient email list, subscription
        status, and timestamps. Subscriptions are not part of the current
        Reports API — this endpoint is relevant only for enterprises still
        operating on the legacy Daily and Custom Reports system. Results are
        paginated with count, next, previous, and results fields.
      operationId: addSubscription
      requestBody:
        content:
          application/json:
            schema:
              required:
                - email_ids
              properties:
                email_ids:
                  type: array
                  items:
                    type: string
                    format: email
        required: true
      responses:
        '201':
          description: Successful Operation
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_Subscription'
        '400':
          description: Bad request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '401':
          description: Authorization information is missing or invalid.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '403':
          description: Forbidden, no permission to perform this action.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
      security:
        - esper_cloud_api_apiKey: []
  /enterprise/report/subscription/{subscription_id}/:
    get:
      x-badges:
        - name: Stable
          color: green
      tags:
        - esper_cloud_api_Daily and Custom Reports
      summary: Get instance of subscription
      description: >
        ⚠️ Legacy feature. Android only.Daily and Custom Reports are a legacy
        feature, and report subscriptions are not part of the current reporting
        system. For current reporting needs, use the Reports API: GET
        /report/v0/report-types, POST /report/v0/reports, and GET
        /report/v0/reports/{report_id}.


        Retrieves a single legacy report subscription record by its integer
        subscription ID.

        Use this endpoint to inspect the full detail of a specific subscription
        — its recipient email addresses, active/inactive status, and creation
        and modification timestamps.


        **About Get Report Subscription**


        Each subscription record represents a configured channel for legacy
        daily report delivery. This endpoint returns the full Subscription
        object for the given subscription_id, including email_ids,
        is_subscribed, created_on, and updated_on. Note that subscription_id is
        an integer, not a UUID. Subscriptions are part of the legacy Daily and
        Custom Reports system and do not exist in the current Reports API.
      operationId: getSubscriptionReport
      parameters:
        - name: subscription_id
          in: path
          description: A integer value identifying the subscription
          required: true
          schema:
            type: integer
      responses:
        '200':
          description: successful operation
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_Subscription'
        '401':
          description: Authorization information is missing or invalid.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '404':
          description: Not Found.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
      security:
        - esper_cloud_api_apiKey: []
    put:
      x-badges:
        - name: Stable
          color: green
      tags:
        - esper_cloud_api_Daily and Custom Reports
      summary: Update subscription
      description: >
        ⚠️ Legacy feature. Android only. Daily and Custom Reports are a legacy
        feature. For current reporting needs, use the Reports API: GET
        /report/v0/report-types, POST /report/v0/reports, and GET
        /report/v0/reports/{report_id}.


        Fully replaces an existing legacy report subscription with a new
        configuration, including an updated recipient list and subscription
        state.

        Use PUT when you need to overwrite the complete subscription record —
        supply email_ids (required) and optionally is_subscribed; omitted fields
        will be cleared.


        **About Update Report Subscription (Full)**


        PUT performs a full replacement of the subscription resource identified
        by subscription_id. Unlike PATCH (which supports partial updates), PUT
        requires email_ids and overwrites all editable fields. Subscriptions are
        part of the legacy Daily and Custom Reports system and do not exist in
        the current Reports API. Use PATCH if you only need to change a single
        field.
      operationId: updateSubscriptionReport
      parameters:
        - name: subscription_id
          in: path
          description: A integer value identifying the subscription.
          required: true
          schema:
            type: integer
      requestBody:
        content:
          application/json:
            schema:
              required:
                - email_ids
              properties:
                email_ids:
                  type: array
                  items:
                    type: string
                    format: email
                is_subscribed:
                  type: boolean
        required: true
      responses:
        '200':
          description: successful operation
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_Subscription'
        '400':
          description: Invalid request.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '401':
          description: Authorization information is missing or invalid.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '404':
          description: Not Found.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
      security:
        - esper_cloud_api_apiKey: []
    patch:
      x-badges:
        - name: Stable
          color: green
      tags:
        - esper_cloud_api_Daily and Custom Reports
      summary: Partially update subscription
      description: >
        ⚠️ Legacy feature. Android only. Daily and Custom Reports are a legacy
        feature, and report subscriptions are not part of the current reporting
        system. For current reporting needs, use the Reports API: GET
        /report/v0/report-types, POST /report/v0/reports, and GET
        /report/v0/reports/{report_id}.


        Partially updates a legacy report subscription, allowing changes to
        recipient email addresses or subscription state without replacing the
        full record.

        Use PATCH when you need to modify only email_ids or is_subscribed —
        fields omitted from the request body are left unchanged.


        **About Partial Update Report Subscription**


        PATCH supports sparse updates to a subscription record. Unlike PUT (full
        replacement), PATCH lets you supply only the fields to change, making it
        preferred for toggling is_subscribed or making targeted recipient list
        changes. Subscriptions are part of the legacy Daily and Custom Reports
        system and do not exist in the current Reports API.
      operationId: patchSubscriptionReport
      parameters:
        - name: subscription_id
          in: path
          description: A integer value identifying the subscription.
          required: true
          schema:
            type: integer
      requestBody:
        content:
          application/json:
            schema:
              properties:
                email_ids:
                  type: array
                  items:
                    type: string
                    format: email
                is_subscribed:
                  type: boolean
      responses:
        '200':
          description: successful operation
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_Subscription'
        '400':
          description: Invalid request.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '401':
          description: Authorization information is missing or invalid.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '404':
          description: Not Found.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
      security:
        - esper_cloud_api_apiKey: []
    delete:
      x-badges:
        - name: Stable
          color: green
      tags:
        - esper_cloud_api_Daily and Custom Reports
      summary: Deletes instance of subscription
      description: >
        ⚠️ Legacy feature. Android only. Daily and Custom Reports are a legacy
        feature, and report subscriptions are not part of the current reporting
        system. For current reporting needs, use the Reports API: GET
        /report/v0/report-types, POST /report/v0/reports, and GET
        /report/v0/reports/{report_id}.


        Permanently deletes a legacy report subscription, stopping all future
        scheduled report deliveries to its recipients.

        This operation is irreversible; the subscription record and its
        recipient list are removed entirely. Returns HTTP 204 with no response
        body on success.


        **About Delete Report Subscription**


        Deleting a subscription removes the record and ends automated daily
        report delivery to all associated email addresses immediately. There is
        no soft-delete or recovery path. Subscriptions are part of the legacy
        Daily and Custom Reports system and do not exist in the current Reports
        API. If you only need to pause delivery temporarily, use PATCH with
        is_subscribed: false instead of deleting the record.
      operationId: deleteSubscriptionReport
      parameters:
        - name: subscription_id
          in: path
          description: A integer value identifying the subscription.
          required: true
          schema:
            type: integer
      responses:
        '204':
          description: The resource was deleted successfully.
        '400':
          description: Invalid request.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '401':
          description: Authorization information is missing or invalid.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '403':
          description: Forbidden, no permission to perform this action.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '404':
          description: Not Found.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
      security:
        - esper_cloud_api_apiKey: []
  /v2/enterprise/{enterprise_id}/report/status-metrics:
    get:
      x-badges:
        - name: Stable
          color: green
      tags:
        - esper_cloud_api_Device Telemetry
      summary: Get status metrics report for enterprise v2
      description: Returns status metrics report for enterprise
      operationId: getStatusMetricsV2
      parameters:
        - name: enterprise_id
          in: path
          description: A UUID string identifying this enterprise.
          required: true
          schema:
            type: string
      responses:
        '200':
          description: successful operation
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_StatusMetricsV2'
        '401':
          description: Authorization information is missing or invalid.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
      security:
        - esper_cloud_api_apiKey: []
  /v0/enterprise/{enterprise_id}/developerapp/{developerapp_id}/renew-token/:
    post:
      x-badges:
        - name: Deprecated
          color: red
      tags:
        - esper_cloud_api_Token (Deprecated)
      summary: Renew Token
      description: API to renew your token
      operationId: renewToken
      parameters:
        - name: enterprise_id
          in: path
          description: A UUID string identifying this enterprise.
          required: true
          schema:
            type: string
            format: uuid
        - name: developerapp_id
          in: path
          description: A UUID string identifying the developerapp
          required: true
          schema:
            type: string
            format: uuid
        - name: access_token
          in: query
          description: Token to be renewed
          required: true
          schema:
            type: string
      responses:
        '201':
          description: successful operation
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_TokenRenewV0'
        '400':
          description: Bad request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '401':
          description: Authorization information is missing or invalid.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '403':
          description: Forbidden, no permission to perform this action.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
      security:
        - esper_cloud_api_apiKey: []
  /v0/enterprise/{enterprise_id}/device/{device_id}/command-history/:
    get:
      x-badges:
        - name: Stable
          color: green
      tags:
        - esper_cloud_api_Commands V2
      summary: get command history for device
      description: >-
        ⚠️ Android only. This endpoint applies exclusively to Android-managed
        devices enrolled in Esper.


        **Alternative Available**


        Use https://api.esper.io/openapi/command-status/getcommandinbox for a
        device's queued commands.


        Returns the full command history for a specific device, filterable by
        execution state.


        Returns a paginated list of V0CommandStatus records scoped to the
        specified device, each including the command name, arguments, issuing
        user, current state, reason, requeue count, and timestamps. 


        This provides richer detail than the per-request status endpoint, making
        it the preferred choice for device-level command audit and
        troubleshooting.


        **About Device Command History**


        While GET .../command/{request_id}/status/ surfaces status for a
        specific command request across its target devices, the command-history
        endpoint inverts the view — returning all commands ever 

        issued to a single device, regardless of which request they originated
        from. Each record includes the full command name, the command_args used,
        the issued_by user object, a requeue_value tracking how many times the
        command was retried, and the reason for the current state. This makes it
        the authoritative source for per-device command forensics.


        **Key Query Parameters / Fields**


        state — optional filter; narrows results to a specific execution state
        (e.g. Command Failure, Command Success)


        command — the name of the operation that was issued (e.g. INSTALL,
        REBOOT)


        command_args — the arguments passed with the command


        issued_by — object containing id and username of the user who issued the
        command


        requeue_value — number of times the command was requeued for this
        device 


        reason — plain-language detail on why the command is in its current
        state


        **Common Use Cases**


        Review the full command history for a device during a support or
        compliance investigation.


        Identify repeatedly failing commands and the arguments that were used.

        Audit which users issued which commands to a device over its lifecycle.


        **Best Practices**


        Filter by state=Command Failure or state=Command TimeOut to surface
        problem commands without reviewing the entire history.


        Use requeue_value to identify commands that were retried the maximum
        number of times — these are likely permanent failures requiring manual
        intervention.


        Pair this endpoint with the event feed (GET .../report/eventfeed/) for a
        complete device activity picture: command history shows operational
        commands; the event feed shows broader device state transitions.


        **Workflow**


        Obtain the device_id from a device list call or stored reference.


        Call this endpoint, optionally filtering by state, to retrieve the
        command history.


        Investigate failures using the command, command_args, reason, and
        requeue_value fields.
      operationId: getDeviceCommandHistory
      parameters:
        - name: enterprise_id
          in: path
          description: Id of the enterprise
          required: true
          schema:
            type: string
            format: uuid
        - name: device_id
          in: path
          description: Id for the command request
          required: true
          schema:
            type: string
            format: uuid
        - name: state
          in: query
          description: Filter by command state
          schema:
            type: string
      responses:
        '200':
          description: on successful request
          content:
            application/json:
              schema:
                type: object
                properties:
                  count:
                    type: integer
                    format: int64
                  next:
                    type: string
                    format: url
                  previous:
                    type: string
                    format: url
                  results:
                    type: array
                    items:
                      $ref: '#/components/schemas/esper_cloud_api_V0CommandStatus'
        '401':
          description: Authorization information is missing or invalid.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '404':
          description: Not Found.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
      security:
        - esper_cloud_api_apiKey: []
  /v0/enterprise/{enterprise_id}/geofence/:
    get:
      x-badges:
        - name: Legacy
          color: orange
      tags:
        - esper_cloud_api_Geofence
      summary: List Geofences in Enterprise
      description: >
        Legacy endpoint. Android only. Geofence configuration is now managed
        through blueprints. Use the blueprints endpoints (/api/v2/blueprints/)
        to create and manage geofences going forward.



        Returns a paginated list of all geofences defined within the
        enterprise.Use this endpoint to audit existing legacy geofence
        definitions — their coordinates, radii, and configured device actions —
        before migrating configurations to blueprints.


        **About List Geofences (Legacy)**


        A geofence in Esper defines a geographic boundary — specified by
        latitude, longitude, and a radius — that triggers device actions (such
        as lockdown or beep) when a device crosses it. This endpoint belongs to
        the original standalone geofence API, which has been superseded by
        geofence configuration within blueprints. New integrations should use
        /api/v2/blueprints/ rather than this legacy path.
      operationId: getAllGeofences
      parameters:
        - name: enterprise_id
          in: path
          description: A UUID string identifying the enterprise.
          required: true
          schema:
            type: string
            format: uuid
        - name: search
          in: query
          description: A search term.
          schema:
            type: string
        - name: limit
          in: query
          description: Number of results to return per page.
          schema:
            type: integer
        - name: offset
          in: query
          description: The initial index from which to return the results.
          schema:
            type: integer
      responses:
        '200':
          description: successful operation
          content:
            application/json:
              schema:
                required:
                  - count
                  - results
                type: object
                properties:
                  count:
                    type: integer
                  next:
                    type: string
                    format: url
                    nullable: true
                  previous:
                    type: string
                    format: url
                    nullable: true
                  results:
                    type: array
                    items:
                      $ref: '#/components/schemas/esper_cloud_api_Geofence'
        '401':
          description: Authorization information is missing or invalid.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '404':
          description: Not Found.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
      security:
        - esper_cloud_api_apiKey: []
  /v0/enterprise/{enterprise_id}/geofence/{geofence_id}/:
    get:
      x-badges:
        - name: Legacy
          color: orange
      tags:
        - esper_cloud_api_Geofence
      summary: Get geofence information
      description: >
        ⚠️ Legacy endpoint. Geofence configuration is now managed through
        blueprints. Use the blueprints endpoints (/api/v2/blueprints/) to create
        and manage geofences going forward.

         Retrieves the full details of a single geofence by its UUID.Returns the complete Geofence object including coordinates, radius, configured device actions, device count, and audit timestamps; useful during migration to read the exact parameters of a legacy geofence before recreating it in a blueprint.
         
         **About Get Geofence (Legacy)**

         This endpoint fetches a single legacy geofence record by geofence_id. Geofences in this legacy system were standalone entities associated with an enterprise and optionally applied to individual devices. The current approach embeds geofence definitions within blueprints via /api/v2/blueprints/, enabling consistent application across device groups rather than per-device assignment.
      operationId: getGeofence
      parameters:
        - name: geofence_id
          in: path
          description: A UUID string identifying the geofence.
          required: true
          schema:
            type: string
            format: uuid
        - name: enterprise_id
          in: path
          description: A UUID string identifying the enterprise.
          required: true
          schema:
            type: string
            format: uuid
      responses:
        '200':
          description: successful operation
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_Geofence'
        '401':
          description: Authorization information is missing or invalid.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '404':
          description: Not Found.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
      security:
        - esper_cloud_api_apiKey: []
    put:
      x-badges:
        - name: Legacy
          color: orange
      tags:
        - esper_cloud_api_Geofence
      summary: Update geofence information
      description: >
        ⚠️ Legacy endpoint. Android only. Geofence configuration is now managed
        through blueprints. Use the blueprints endpoints (/api/v2/blueprints/)
        to create and manage geofences going forward.


        Performs a full replacement update on an existing legacy geofence
        record.All writable fields must be included in the request body;
        omitting a field will overwrite it with a null or default value. Returns
        the updated Geofence object on success.


        **About Update Geofence — Full (Legacy)**


        This PUT endpoint replaces the entire geofence definition for the
        specified geofence_id. It operates on the same legacy standalone
        geofence system as the other /geofence/ path endpoints. Because
        geofences are now configured within blueprints via /api/v2/blueprints/,
        edits here will not affect blueprint-managed geofence behavior. Use
        blueprints for all active geofence configuration changes.
      operationId: updateGeofence
      parameters:
        - name: geofence_id
          in: path
          description: A UUID string identifying the geofence.
          required: true
          schema:
            type: string
            format: uuid
        - name: enterprise_id
          in: path
          description: A UUID string identifying the enterprise.
          required: true
          schema:
            type: string
            format: uuid
      requestBody:
        content:
          '*/*':
            schema:
              $ref: '#/components/schemas/esper_cloud_api_Geofence'
        required: true
      responses:
        '200':
          description: successful operation
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_Geofence'
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '401':
          description: Authorization information is missing or invalid
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '404':
          description: Not Found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
      security:
        - esper_cloud_api_apiKey: []
      x-codegen-request-body-name: data
    delete:
      x-badges:
        - name: Legacy
          color: orange
      tags:
        - esper_cloud_api_Geofence
      summary: Delete a geofence
      description: >
        ⚠️ Legacy endpoint. Android only. Geofence configuration is now managed
        through blueprints. Use the blueprints endpoints (/api/v2/blueprints/)
        to create and manage geofences going forward.


        Permanently deletes a legacy geofence record by its UUID.Returns HTTP
        204 with an empty body on success; the deletion is immediate and
        irreversible. Use this to remove legacy geofence records after their
        configurations have been migrated to blueprints.


        **About Delete Geofence (Legacy)**


        This endpoint removes a single legacy geofence from the enterprise.
        Unlike the blueprints system, which ties geofence lifecycle to blueprint
        deployment, this standalone record can be deleted independently. Before
        deleting, check device_count via GET to confirm whether any devices are
        still referencing the legacy geofence.
      operationId: deleteGeofence
      parameters:
        - name: geofence_id
          in: path
          description: A UUID string identifying the geofence.
          required: true
          schema:
            type: string
            format: uuid
        - name: enterprise_id
          in: path
          description: A UUID string identifying the enterprise.
          required: true
          schema:
            type: string
            format: uuid
      responses:
        '204':
          description: The resource was deleted successfully.
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '401':
          description: Authorization information is missing or invalid.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '404':
          description: Not Found.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
      security:
        - esper_cloud_api_apiKey: []
    patch:
      x-badges:
        - name: Legacy
          color: orange
      tags:
        - esper_cloud_api_Geofence
      summary: Partially updates geofence information
      description: >
        ⚠️ Legacy endpoint. Android only. Geofence configuration is now managed
        through blueprints. Use the blueprints endpoints (/api/v2/blueprints/)
        to create and manage geofences going forward.


        Partially updates one or more fields on an existing legacy geofence
        record. Only the fields included in the request body are modified; all
        other fields retain their current values. Returns the full updated
        Geofence object on success.


        **About Update Geofence — Partial (Legacy)**


        This PATCH endpoint applies partial updates to a legacy geofence
        definition using the GeofenceUpdate schema, which accepts name,
        description, latitude, longitude, radius, radius_unit, and
        device_actions. Unlike PUT, omitted fields are preserved. Changes made
        here do not affect blueprint-managed geofence behavior; use
        /api/v2/blueprints/ for all active configuration management.
      operationId: partialUpdateGeofence
      parameters:
        - name: geofence_id
          in: path
          description: A UUID string identifying the geofence.
          required: true
          schema:
            type: string
            format: uuid
        - name: enterprise_id
          in: path
          description: A UUID string identifying the enterprise.
          required: true
          schema:
            type: string
            format: uuid
      requestBody:
        content:
          '*/*':
            schema:
              $ref: '#/components/schemas/esper_cloud_api_GeofenceUpdate'
        required: true
      responses:
        '200':
          description: successful operation
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_Geofence'
        '400':
          description: Bad Request.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '401':
          description: Authorization information is missing or invalid.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '404':
          description: Not Found.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
      security:
        - esper_cloud_api_apiKey: []
      x-codegen-request-body-name: data
  /v0/enterprise/{enterprise_id}/create-apply-geo-fence/:
    post:
      x-badges:
        - name: Legacy
          color: orange
      tags:
        - esper_cloud_api_Geofence
      summary: Create a geofence
      description: >
        ⚠️ Legacy endpoint. Android only. Geofence configuration is now managed
        through blueprints. Use the blueprints endpoints (/api/v2/blueprints/)
        to create and manage geofences going forward.


        Creates a new geofence and optionally applies it to a list of devices in
        a single request. Returns the newly created Geofence object (HTTP 201)
        with the assigned UUID; the devices field allows immediate application
        to specific devices at creation time, a capability not available through
        the separate /geofence/ path endpoints.
      operationId: createGeofence
      parameters:
        - name: enterprise_id
          in: path
          description: A UUID string identifying the enterprise.
          required: true
          schema:
            type: string
            format: uuid
      requestBody:
        content:
          '*/*':
            schema:
              $ref: '#/components/schemas/esper_cloud_api_GeofenceCreate'
        required: true
      responses:
        '201':
          description: successful operation
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_Geofence'
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '401':
          description: Authorization information is missing or invalid.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
      security:
        - esper_cloud_api_apiKey: []
      x-codegen-request-body-name: data
    get:
      x-badges:
        - name: Legacy
          color: orange
      tags:
        - esper_cloud_api_Geofence
      summary: List Geofences in Enterprise
      description: >
        ⚠️ Legacy endpoint. Android only. Geofence configuration is now managed
        through blueprints. Use the blueprints endpoints (/api/v2/blueprints/)
        to create and manage geofences going forward.


        Returns a paginated list of all geofences in the enterprise via the
        legacy create-apply-geo-fence path.
      operationId: getGeofenceList
      parameters:
        - name: enterprise_id
          in: path
          description: A UUID string identifying the enterprise.
          required: true
          schema:
            type: string
            format: uuid
        - name: search
          in: query
          description: A search term.
          schema:
            type: string
        - name: limit
          in: query
          description: Number of results to return per page.
          schema:
            type: integer
        - name: offset
          in: query
          description: The initial index from which to return the results.
          schema:
            type: integer
      responses:
        '200':
          description: successful operation
          content:
            application/json:
              schema:
                required:
                  - count
                  - results
                type: object
                properties:
                  count:
                    type: integer
                  next:
                    type: string
                    format: url
                    nullable: true
                  previous:
                    type: string
                    format: url
                    nullable: true
                  results:
                    type: array
                    items:
                      $ref: '#/components/schemas/esper_cloud_api_Geofence'
        '401':
          description: Authorization information is missing or invalid.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '404':
          description: Not Found.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
      security:
        - esper_cloud_api_apiKey: []
  /v0/enterprise/{enterprise_id}/create-apply-geofence/{geofence_id}/:
    get:
      x-badges:
        - name: Legacy
          color: orange
      tags:
        - esper_cloud_api_Geofence
      summary: Get geofence information
      description: >
        ⚠️ Legacy endpoint. Android only. Geofence configuration is now managed
        through blueprints. Use the blueprints endpoints (/api/v2/blueprints/)
        to create and manage geofences going forward.


        Retrieves the full details of a single geofence by UUID via the legacy
        create-apply-geofence detail path.

        Returns the same Geofence object as GET
        /v0/enterprise/{enterprise_id}/geofence/{geofence_id}/; this path is the
        detail counterpart to the create-apply-geo-fence creation endpoint, with
        the hyphenation normalized to create-apply-geofence.
      operationId: getTheGeofence
      parameters:
        - name: geofence_id
          in: path
          description: A UUID string identifying the geofence.
          required: true
          schema:
            type: string
            format: uuid
        - name: enterprise_id
          in: path
          description: A UUID string identifying the enterprise.
          required: true
          schema:
            type: string
            format: uuid
      responses:
        '200':
          description: successful operation
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_Geofence'
        '401':
          description: Authorization information is missing or invalid.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '404':
          description: Not Found.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
      security:
        - esper_cloud_api_apiKey: []
    delete:
      x-badges:
        - name: Legacy
          color: orange
      tags:
        - esper_cloud_api_Geofence
      summary: Delete a geofence
      description: >
        ⚠️ Legacy endpoint. Android only. Geofence configuration is now managed
        through blueprints. Use the blueprints endpoints (/api/v2/blueprints/)
        to create and manage geofences going forward.


        Permanently deletes a legacy geofence record by UUID via the
        create-apply-geofence detail path.


        Returns HTTP 204 with an empty body on success. Remove devices from the
        geofence before deleting the geofence.
      operationId: deleteTheGeofence
      parameters:
        - name: geofence_id
          in: path
          description: A UUID string identifying the geofence.
          required: true
          schema:
            type: string
            format: uuid
        - name: enterprise_id
          in: path
          description: A UUID string identifying the enterprise.
          required: true
          schema:
            type: string
            format: uuid
      responses:
        '204':
          description: The resource was deleted successfully.
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '401':
          description: Authorization information is missing or invalid.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '404':
          description: Not Found.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
      security:
        - esper_cloud_api_apiKey: []
  /v1/enterprise/{enterprise_id}/:
    get:
      x-badges:
        - name: Stable
          color: green
      tags:
        - esper_cloud_api_Company Settings
      summary: Get your company settings
      description: >
        Retrieves the current company settings for the specified enterprise.Use
        this endpoint to read enterprise-level configuration including contact
        information, location details, EMM enrollment status, and the
        enterprise's display name.About Get Company Settings

        This endpoint (formerly "Get Enterprise Information") returns the
        EnterpriseV1 object for your enterprise — the root configuration record
        that identifies your organization within Esper. It includes both
        read-only system fields (id, short_code, created_on, updated_on, emm)
        and user-editable fields such as name, contact details, and location.
        The emm field surfaces whether the enterprise is enrolled in Google EMM
        and, if so, its google_enterprise_id. All editable fields can be updated
        via PATCH /v1/enterprise/{enterprise_id}/.


        **Key Fields**


        enterprise_id (path, required) — UUID of the enterprise to retrieve


        id (read-only) — UUID of the enterprise record


        short_code (read-only) — Auto-generated 10-character identifier for the
        enterprise


        name — Display name of the enterprise


        registered_name — Formal legal name of the organization


        registered_address — Registered business address


        location — City, state, and country of the enterprise


        contact_person / contact_number / contact_email — Primary
        point-of-contact details


        wifi_lte_toggle_flag — Whether the data saver mode feature is enabled
        (only present if the feature is active)


        emm — Google EMM enrollment details, including google_enterprise_id;
        null if not EMM-enrolled


        **Common Use Cases**


        Reading enterprise metadata to populate an integration's configuration
        or audit log


        Confirming EMM enrollment status and retrieving the linked
        google_enterprise_id


        Retrieving the current values of all editable fields before issuing a
        PATCH update


        **Best Practices**


        Use this endpoint to read current state before calling PATCH — it
        ensures you don't unknowingly overwrite values you didn't intend to
        change


        Treat id, short_code, created_on, updated_on, and emm as read-only; they
        cannot be updated via PATCH


        Cache the enterprise_id at integration setup time rather than fetching
        it on every request


        **Workflow**


        Call GET /v1/enterprise/{enterprise_id}/ with the enterprise UUID


        Inspect the response for the fields relevant to your use case (e.g., emm
        for EMM enrollment status, contact_email for contact details)


        Use the returned field values as the baseline if you plan to follow up
        with a PATCH update
      operationId: getEnterprise
      parameters:
        - name: enterprise_id
          in: path
          description: A UUID string identifying this enterprise.
          required: true
          schema:
            type: string
            format: uuid
      responses:
        '200':
          description: successful operation
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_EnterpriseV1'
        '401':
          description: Authorization information is missing or invalid.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '404':
          description: Not Found.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
      security:
        - esper_cloud_api_apiKey: []
    patch:
      x-badges:
        - name: Stable
          color: green
      tags:
        - esper_cloud_api_Company Settings
      summary: Partially update company settings
      description: >
        Partially updates the company settings for the specified enterprise,
        returning the full updated record.

        Supply only the fields you want to change — all omitted fields retain
        their current values.


        **About Partial Update Company Settings**


        This endpoint (formerly "Partial Update Enterprise Information") applies
        sparse updates to the EnterpriseV1 record using the EnterpriseUpdateV1
        schema. All fields in the request body are optional; only those included
        will be changed. Read-only fields (id, short_code, created_on,
        updated_on, emm) cannot be modified and should be omitted from the
        request body. The response returns the complete updated EnterpriseV1
        object. Call GET /v1/enterprise/{enterprise_id}/ first to retrieve
        current values before making changes.


        **Key Fields**


        enterprise_id (path, required) — UUID of the enterprise to update


        name (optional) — Display name of the enterprise (max 255 chars)


        registered_name (optional) — Formal legal name of the organization


        registered_address (optional) — Registered business address


        location (optional) — City, state, and country


        zipcode (optional) — Postal code for the enterprise location (max 8
        chars)


        contact_person (optional, nullable) — Primary point-of-contact name


        contact_number (optional, nullable) — Contact phone number


        contact_email (optional) — Contact email address


        wifi_lte_toggle_flag (optional) — Toggles data saver mode; only
        effective if the feature is enabled for the enterprise


        **Common Use Cases**


        Updating enterprise contact details after an organizational change


        Correcting the registered name or address on file


        Toggling wifi_lte_toggle_flag when enabling or disabling data saver mode


        **Best Practices**


        Call GET /v1/enterprise/{enterprise_id}/ first to confirm current values
        before issuing a PATCH


        Include only the fields you intend to change; PATCH is safe to use for
        single-field updates


        Do not include id, short_code, created_on, updated_on, or emm in the
        request body — they are read-only and will be ignored or may cause
        errors


        Verify the update took effect by inspecting the returned EnterpriseV1
        object in the response


        **Workflow**


        Call GET /v1/enterprise/{enterprise_id}/ to retrieve the current
        enterprise record


        Construct a partial payload containing only the fields to update


        Call PATCH /v1/enterprise/{enterprise_id}/ with the payload


        Confirm the changes in the returned EnterpriseV1 response object
      operationId: partialUpdateEnterprise
      parameters:
        - name: enterprise_id
          in: path
          description: A UUID string identifying this enterprise.
          required: true
          schema:
            type: string
            format: uuid
      requestBody:
        content:
          '*/*':
            schema:
              $ref: '#/components/schemas/esper_cloud_api_EnterpriseUpdateV1'
        required: true
      responses:
        '200':
          description: successful operation
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_EnterpriseV1'
        '400':
          description: Invalid request.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '401':
          description: Authorization information is missing or invalid.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '404':
          description: Not Found.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
      security:
        - esper_cloud_api_apiKey: []
      x-codegen-request-body-name: data
  /v1/enterprise/{enterprise_id}/application/:
    get:
      x-badges:
        - name: Stable
          color: green
      tags:
        - esper_cloud_api_Application V1
      summary: List apps in enterprise
      description: >-
        Returns a paginated list of all Android applications uploaded to the
        enterprise, with optional filters for name, package name, category, SDK
        version, and more.


        Use this endpoint to search and inventory the Android apps available in
        your enterprise before installing, managing, or auditing app versions
        across your fleet.


        **About List Applications**


        This endpoint is part of the Application V1 family
        (/v1/enterprise/{enterprise_id}/application/...), which manages the
        enterprise's Android app library — uploaded APKs and Google Play-sourced
        apps. It is the V1 version of the unversioned GET
        /enterprise/{enterprise_id}/application/ endpoint; both share the same
        filter parameters and response shape but use different schema versions
        (ApplicationV1 vs Application).


        There are two other application API families with distinct scopes


        Tenant Apps (/v2/tenant-apps/...) — manages uploaded apps for iOS and
        Windows platforms (IPA files, Windows binaries). Use this family for
        non-Android app library management.


        Device Apps (/v2/devices/{deviceId}/device-apps/ and GET
        /v2/device-apps) — queries apps installed on a specific device or finds
        devices with a given app installed, covering iOS and Windows app types
        (VPP, TENANT_IOS, ESPER_IOS, WEBCLIP, ESPER_WINDOWS, TENANT_WINDOWS).
        Use this family when you need device-level app inventory rather than the
        enterprise library.


        This endpoint returns ApplicationV1 objects. Each result includes the
        app's UUID, display name, package name, and a nested latest_version
        object. Results are paginated with a default page size of 20. Use the
        application_id from results to target individual apps for deletion or
        version queries.


        **Key Fields / Query Parameters**


        application_name — Filter by partial or full display name


        package_name — Filter by Android package name (partial match)


        package_name_exact — Filter by Android package name (exact match)


        has_uploaded_version — When true, returns only apps with at least one
        uploaded version


        category — Filter by application category


        supported_sdk — Filter by minimum Android SDK version supported


        is_active — Filter by active applications only


        is_hidden (default: false) — When true, includes Esper default system
        apps in results


        created_on_gt / created_on_lt — Filter by creation timestamp range


        updated_on_gt / updated_on_lt — Filter by last-updated timestamp range


        limit (default: 20) — Number of results per page


        offset (default: 0) — Starting index for pagination


        **Common Use Cases**


        Searching for an Android app by package name before retrieving its
        version list


        Auditing all apps registered to the enterprise


        Building a pre-install checklist by filtering for apps with
        has_uploaded_version: true


        **Best Practices**


        Use package_name_exact rather than package_name when you know the full
        package name — it avoids ambiguous partial matches


        For iOS or Windows apps, use GET /v2/tenant-apps instead — this endpoint
        returns Android apps only


        For per-device app inventory or to find which devices have a given app
        installed, use the Device Apps family
        (/v2/devices/{deviceId}/device-apps/ or GET /v2/device-apps) instead


        Paginate with limit and offset on large enterprises; use count from the
        response to determine total pages


        Store application_id values from results for use in version and install
        queries downstream


        **Workflow**


        Call GET /v1/enterprise/{enterprise_id}/application/ with relevant
        filters


        Paginate through results using next links or offset increments until
        next is null


        Note the id (application UUID) for any apps to inspect further


        Use the id to call GET
        /v1/enterprise/{enterprise_id}/application/{application_id}/ for full
        detail or proceed to version management
      operationId: getAllApplicationsV1
      parameters:
        - name: enterprise_id
          in: path
          description: A UUID string identifying this enterprise.
          required: true
          schema:
            type: string
        - name: application_name
          in: query
          description: filter by application name
          schema:
            type: string
        - name: package_name
          in: query
          description: filter by package name
          schema:
            type: string
        - name: package_name_exact
          in: query
          description: filter by package name (exact match)
          schema:
            type: string
        - name: has_uploaded_version
          in: query
          description: Returns applications having atleast one version uploaded
          schema:
            type: boolean
        - name: category
          in: query
          description: filter by category
          schema:
            type: string
        - name: supported_sdk
          in: query
          description: filter by supported sdk versions
          schema:
            type: integer
        - name: is_active
          in: query
          description: filter by active applications
          schema:
            type: boolean
        - name: is_hidden
          in: query
          description: filter default esper apps
          schema:
            type: boolean
            default: false
        - name: created_on_gt
          in: query
          description: filter applications created after a given timestamp
          schema:
            type: string
            format: datetime
        - name: created_on_lt
          in: query
          description: filter applications created before a given timestamp
          schema:
            type: string
            format: datetime
        - name: updated_on_gt
          in: query
          description: filter applications updated after a given timestamp
          schema:
            type: string
            format: datetime
        - name: updated_on_lt
          in: query
          description: filter applications updated before a given timestamp
          schema:
            type: string
            format: datetime
        - name: limit
          in: query
          description: Number of results to return per page.
          schema:
            type: integer
            default: 20
        - name: offset
          in: query
          description: Return results from this index.
          schema:
            type: integer
            default: 0
      responses:
        '200':
          description: successful operation
          content:
            application/json:
              schema:
                required:
                  - count
                  - results
                type: object
                properties:
                  count:
                    type: integer
                  next:
                    type: string
                    format: url
                    nullable: true
                  previous:
                    type: string
                    format: url
                    nullable: true
                  results:
                    type: array
                    items:
                      $ref: '#/components/schemas/esper_cloud_api_ApplicationV1'
        '401':
          description: Authorization information is missing or invalid.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
      security:
        - esper_cloud_api_apiKey: []
  /v1/enterprise/{enterprise_id}/application/{application_id}/:
    get:
      x-badges:
        - name: Stable
          color: green
      tags:
        - esper_cloud_api_Application V1
      summary: Get application information
      description: >-
        **Alternative Available** 

        GET /enterprise/{enterprise_id}/application/{application_id}/


        To retrieve an iOS or Windows application use GET
        /v2/tenant-apps/{appId}


        Get Android enterprise application details (V1). Retrieves application
        details including metadata and the latest version, such as version code,
        build number, minimum SDK version, package name, and visibility
        settings. Use this endpoint when working with blueprint configurations,
        as V1 application endpoints are used in blueprint **Workflow**s.


        **Common Use Cases** Retrieving application details before referencing
        an app in a blueprint, validating package name and version metadata
        prior to deployment, confirming app visibility (is_hidden) before
        assigning to devices or policies, and auditing SDK compatibility.


        **Best Practices** Use this endpoint when your **Workflow** involves
        blueprints — V1 application data is what blueprint configurations
        reference. For non-blueprint **Workflow**s, the non-versioned GET
        /enterprise/{enterprise_id}/application/{application_id}/ endpoint
        returns richer version detail. Confirm is_hidden status before assigning
        an app to a policy or device group to avoid silent failures.


        **Workflow**


        1. Use the List apps in enterprise (V1) endpoint to retrieve the
        application_id.

        2. Pass the application_id to this endpoint to retrieve full application
        details and latest version metadata.
      operationId: getApplicationv1
      parameters:
        - name: application_id
          in: path
          description: A UUID string identifying this application.
          required: true
          schema:
            type: string
            format: uuid
        - name: enterprise_id
          in: path
          description: A UUID string identifying enterprise.
          required: true
          schema:
            type: string
      responses:
        '200':
          description: successful operation
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ApplicationV1'
        '401':
          description: Authorization information is missing or invalid.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '404':
          description: Not Found.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
      security:
        - esper_cloud_api_apiKey: []
    delete:
      x-badges:
        - name: Stable
          color: green
      tags:
        - esper_cloud_api_Application V1
      summary: Delete an application
      description: >-
        Permanently deletes an Android application record and all of its
        associated versions from the enterprise.


        This operation is irreversible; the application and every version
        uploaded under it are removed entirely. Returns HTTP 204 with no
        response body on success.


        **About Delete Application**


        This endpoint is part of the Application V1 family, which manages the
        enterprise's Android app library. Deleting an application removes the
        top-level app record and cascades to all associated ApplicationVersionV1
        records — every version uploaded under this application_id is deleted
        along with it. The app will no longer appear in the Android app
        inventory and cannot be targeted for installation or policy assignment.
        You must remove the application from all assoicated blueprints (and
        bluperint versions) before calling this endpoint.


        There are two other application API families with distinct scopes:


        Tenant Apps (/v2/tenant-apps/...) — manages uploaded apps for iOS and
        Windows platforms. Deletions of iOS or Windows apps are handled there.

        Device Apps (/v2/devices/{deviceId}/device-apps/ and GET
        /v2/device-apps) — queries app install state on devices for iOS and
        Windows app types. This family does not perform deletions from the app
        library.


        If you only need to remove a specific version rather than the entire
        app, use the version-level delete endpoint instead. There is no
        soft-delete or recovery path for this operation.


        **Key Fields**


        enterprise_id (path, required) — UUID of the enterprise

        application_id (path, required) — UUID of the Android application to
        delete


        **Common Use Cases**


        Removing an Android app that was uploaded in error or is no longer
        relevant to the fleet


        Cleaning up the Android app library during a fleet restructure or
        platform migration


        Purging outdated or retired apps that should not be available for future
        installation


        **Best Practice**


        Verify the correct application_id using GET
        /v1/enterprise/{enterprise_id}/application/{application_id}/ before
        issuing DELETE — there is no undo


        Check whether any devices still have the app installed before deleting;
        use GET
        /v1/enterprise/{enterprise_id}/application/{application_id}/version/{version_id}/installdevices
        per version to audit coverage


        To delete iOS or Windows apps, use the Tenant Apps family (DELETE
        /v2/tenant-apps/{appId}) instead — this endpoint only covers the Android
        app library


        If you only want to remove a specific version, use the version-level
        delete endpoint rather than deleting the entire application record


        **Workflow**


        Confirm the target app with GET
        /v1/enterprise/{enterprise_id}/application/{application_id}/


        Optionally audit installed devices per version using the installdevices
        endpoint


        Call DELETE /v1/enterprise/{enterprise_id}/application/{application_id}/


        Expect a 204 response with an empty body confirming deletion
      operationId: deleteApplicationV1
      parameters:
        - name: application_id
          in: path
          description: A UUID string identifying this application.
          required: true
          schema:
            type: string
            format: uuid
        - name: enterprise_id
          in: path
          description: A UUID string identifying enterprise.
          required: true
          schema:
            type: string
      responses:
        '204':
          description: The resource was deleted successfully.
        '401':
          description: Authorization information is missing or invalid.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '403':
          description: Forbidden, no permission to perform this action.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '404':
          description: Not Found.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
      security:
        - esper_cloud_api_apiKey: []
  /v1/enterprise/{enterprise_id}/application/{application_id}/version/:
    get:
      x-badges:
        - name: Stable
          color: green
      tags:
        - esper_cloud_api_Application V1
      summary: List App versions
      description: >-
        Lists all versions of a specific application using the V1 schema, which
        includes direct file and icon URLs, release date, and file size.


        Returns a paginated AppVersionV1 collection for the specified
        application, with the same filter set as the base version list plus
        timestamp filters. Unlike the base version endpoint, results include
        app_file (direct APK download URL), app_icon (icon URL), size_in_mb, and
        release_date. 


        **About List App Versions (V1)**


        The V1 version list returns the same logical set of version records as
        GET .../application/{application_id}/version/ but uses the AppVersionV1
        schema, which surfaces additional fields that are absent from the base
        AppVersion schema: a direct download URL for the APK (app_file), an icon
        URL (app_icon), the file size in megabytes (size_in_mb), and a
        release_date timestamp. Use the V1 endpoint when your integration needs
        to display or verify file-level metadata without making additional
        requests. Note that release_track and target_sdk_version, present in the
        base schema, are not returned by AppVersionV1.


        **Key Query Parameters**


        version_code — filter by version code string


        build_number — filter by build number


        is_g_play — true returns versions sourced from the Console Google Play
        Store


        approval_status — filter by AVAILABLE, ACCEPTED, APPROVED, or REJECTED


        is_enabled — filter for enabled versions


        is_default — filter for the default version


        created_on_gt / created_on_lt / updated_on_gt / updated_on_lt —
        timestamp range filters


        ordering — sort by installed_count (ascending) or -installed_count
        (descending)


        **Common Use Cases**


        List versions when your integration needs direct APK download URLs or
        icon URLs without a separate lookup.


        Retrieve size_in_mb to estimate storage requirements before deploying a
        version to a fleet.


        Use timestamp filters for incremental sync **Workflow**s that track
        newly uploaded or updated versions.


        **Best Practices**


        Prefer the V1 endpoint over the base version list when you need
        app_file, app_icon, or size_in_mb — it avoids redundant per-version
        detail calls.


        Note that release_track and target_sdk_version are not available in the
        V1 schema; use the base version endpoint if those fields are required.


        Filter by approval_status=APPROVED and is_enabled=true to limit results
        to deployment-ready versions.


        **Workflow**


        Call this endpoint with the target application_id and relevant filters.


        Use app_file and app_icon URLs directly in your integration for display
        or download.


        Record version_id values for use in install commands or V1 version
        detail lookups.
      operationId: getAppVersionsV1
      parameters:
        - name: application_id
          in: path
          description: A UUID string identifying this application.
          required: true
          schema:
            type: string
            format: uuid
        - name: enterprise_id
          in: path
          description: A UUID string identifying enterprise.
          required: true
          schema:
            type: string
        - name: version_code
          in: query
          description: filter by version code
          schema:
            type: string
        - name: build_number
          in: query
          description: filter by build number
          schema:
            type: string
        - name: is_g_play
          in: query
          description: filter google play applications
          schema:
            type: boolean
        - name: approval_status
          in: query
          description: filter by approval status
          schema:
            type: string
            enum:
              - AVAILABLE
              - ACCEPTED
              - APPROVED
              - REJECTED
        - name: is_enabled
          in: query
          description: filter by enabled versions
          schema:
            type: boolean
        - name: is_default
          in: query
          description: filter by default versions
          schema:
            type: boolean
        - name: created_on_gt
          in: query
          description: filter applications created after a given timestamp
          schema:
            type: string
            format: datetime
        - name: created_on_lt
          in: query
          description: filter applications created before a given timestamp
          schema:
            type: string
            format: datetime
        - name: updated_on_gt
          in: query
          description: filter applications updated after a given timestamp
          schema:
            type: string
            format: datetime
        - name: updated_on_lt
          in: query
          description: filter applications updated before a given timestamp
          schema:
            type: string
            format: datetime
        - name: limit
          in: query
          description: Number of results to return per page.
          schema:
            type: integer
        - name: offset
          in: query
          description: Return results from this index.
          schema:
            type: integer
            default: 0
        - name: ordering
          in: query
          schema:
            type: string
          description: |
            Order result set by field name.
            * installed_count: order by asc
            * -installed_count: order by desc
      responses:
        '200':
          description: successful operation
          content:
            application/json:
              schema:
                required:
                  - count
                  - results
                type: object
                properties:
                  count:
                    type: integer
                  next:
                    type: string
                    format: url
                    nullable: true
                  previous:
                    type: string
                    format: url
                    nullable: true
                  results:
                    type: array
                    items:
                      $ref: '#/components/schemas/esper_cloud_api_AppVersionV1'
        '401':
          description: Authorization information is missing or invalid.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
      security:
        - esper_cloud_api_apiKey: []
  /v1/enterprise/{enterprise_id}/application/{application_id}/version/{version_id}/:
    get:
      x-badges:
        - name: Stable
          color: green
      tags:
        - esper_cloud_api_Application V1
      summary: Get app version information
      description: >-
        Retrieves full V1 details for a single application version by its UUID,
        including direct APK and icon URLs, file size, and release date.


        Returns the AppVersionV1 object for the specified version. Use this
        endpoint over the base version detail when your integration needs
        app_file, app_icon, size_in_mb, or release_date without the overhead of
        iterating through a list.


        **About Get App Version (V1)**


        The V1 version detail endpoint returns the same core version metadata as
        GET .../application/{application_id}/version/{version_id}/ but uses the
        AppVersionV1 schema. Key additions over the base schema include:
        app_file (a direct URL to the APK binary), app_icon (a direct URL to the
        version's icon), size_in_mb (file size), and release_date. These
        additions are particularly useful for integrations that surface version
        detail in a UI or need to trigger downloads. Note that release_track and
        target_sdk_version from the base schema are absent in V1 — use the base
        endpoint if those fields are needed.


        **Key Fields**


        app_file — direct URL to download the APK binary for this version


        app_icon — direct URL to the version's app icon image


        size_in_mb — file size of the APK in megabytes


        release_date — timestamp of when this version was released


        release_comments — freeform notes about this release


        approval_status — current lifecycle status: AVAILABLE, ACCEPTED,
        APPROVED, or REJECTED (defaults to APPROVED)


        is_default — whether this version is the designated default for the
        application (defaults to false)


        installed_count — number of devices with this version currently
        installed


        **Common Use Cases**


        Retrieve a direct APK download URL for a specific version without
        listing all versions.


        Display version detail (icon, size, release date, release comments) in a
        custom management UI.


        Confirm installed_count before deprecating or removing a version.


        **Best Practices**


        Use this endpoint instead of the base version detail when app_file,
        app_icon, or size_in_mb are needed — it avoids a redundant follow-up
        call.


        If release_track or target_sdk_version are required, fall back to the
        base GET .../application/{application_id}/version/{version_id}/
        endpoint.


        Verify approval_status=APPROVED and is_default=true or is_enabled (check
        base schema) before using this version in an install command.


        **Workflow**


        Obtain the version_id from a V1 version list call or stored reference


        Call this endpoint to retrieve full V1 version detail including file and
        icon URLs


        Use app_file for download or display; confirm approval_status before
        referencing in an install command
      operationId: getAppVersionV1
      parameters:
        - name: version_id
          in: path
          description: A UUID string identifying this app version.
          required: true
          schema:
            type: string
            format: uuid
        - name: application_id
          in: path
          description: A UUID string identifying this application.
          required: true
          schema:
            type: string
            format: uuid
        - name: enterprise_id
          in: path
          description: A UUID string identifying enterprise.
          required: true
          schema:
            type: string
      responses:
        '200':
          description: successful operation
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_AppVersionV1'
        '401':
          description: Authorization information is missing or invalid.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '404':
          description: Not Found.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
      security:
        - esper_cloud_api_apiKey: []
    delete:
      x-badges:
        - name: Stable
          color: green
      tags:
        - esper_cloud_api_Application V1
      summary: Delete app version
      description: >-
        Permanently removes a specific version of an enterprise application from
        Esper. If the target version is currently referenced by one or more
        blueprints, the version must be removed tfrom the blueprint before the
        version can be deleted. If no blueprint references exist, the version is
        deleted outright and the endpoint returns HTTP 204.


        About Delete App Version


        Each application in Esper can have multiple uploaded versions, and
        individual versions can be removed without deleting the parent
        application. The blueprint authors must explicitly confirm intent to
        orphan those references.


        Key Fields / Query Parameters


        version_id — UUID of the specific app version to delete; required path
        parameter


        application_id — UUID of the parent application; required path parameter


        enterprise_id — UUID of the enterprise; required path parameter


        request_id — Query parameter; if a prior call returned a request_id
        (because the version is in use by blueprints), pass it here to confirm
        deletion and clear the cache entry


        **Common Use Cases**


        Removing a recalled or defective APK version that should no longer be
        deployable.

        Cleaning up old test builds or pre-release versions after a stable
        version is promoted.

        Freeing storage and reducing version clutter in the application library.


        **Best Practices**


        Always check the response code on the first call — a 200 with a
        request_id body means the version is blueprint-referenced and requires a
        second confirmation call; a 204 means it was deleted immediately.

        Audit which blueprints reference the version before deleting to avoid
        breaking active device configurations.

        Coordinate with teams managing blueprints before removing versions that
        may be in production use.


        **Workflow**


        Call DELETE
        /api/v1/enterprise/{enterprise_id}/application/{application_id}/version/{version_id}/
        with path parameters only.

        If response is 204, deletion is complete — no further action needed.

        If response is 200 with a request_id, resubmit the same request
        appending ?request_id={returned_id} to confirm the deletion.
      operationId: deleteAppVersionV1
      parameters:
        - name: version_id
          in: path
          description: A UUID string identifying this app version.
          required: true
          schema:
            type: string
            format: uuid
        - name: application_id
          in: path
          description: A UUID string identifying this application.
          required: true
          schema:
            type: string
            format: uuid
        - name: enterprise_id
          in: path
          description: A UUID string identifying enterprise.
          required: true
          schema:
            type: string
        - name: request_id
          in: query
          description: >-
            If this value exists in cache, delete the application and cache
            entry.
          schema:
            type: string
      responses:
        '200':
          description: >-
            No request id is provided and the application is linked to one or
            more templates. Returns a request_id. Call with this request id to
            delete the resource.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_AppVersionDelete'
        '204':
          description: The resource was deleted successfully.
        '400':
          description: Invalid request.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '401':
          description: Authorization information is missing or invalid.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '403':
          description: Forbidden, no permission to perform this action.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '404':
          description: Not Found.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
      security:
        - esper_cloud_api_apiKey: []
    patch:
      x-badges:
        - name: Stable
          color: green
      tags:
        - esper_cloud_api_Application V1
      summary: Patch an App version instance
      description: >-
        Partially updates the metadata of a specific application version without
        modifying its APK or binary content.Use this endpoint to update
        human-readable labels. Only the fields included in the request body are
        modified; omitted fields remain unchanged.


        About Patch App Version


        Application versions in Esper carry both technical metadata (version
        code, minimum SDK, build number) and management metadata (release name,
        default flag, approval status). The PATCH operation enables targeted
        updates to either set without re-uploading the binary.


        Key Fields / Query Parameters


        release_name — Human-readable label for this version (e.g., "Q2 Release
        - Stable")



        **Common Use Cases**


        Updating a version description


        **Best Practices**


        Use version description such as PROD or DEV to differentiate between
        production and development builds


        **Workflow**


        Retrieve the current version details using GET
        /api/v1/enterprise/{enterprise_id}/application/{application_id}/version/{version_id}/
        to confirm current field values.

        Construct a PATCH request body with only the fields to update.

        Submit the request and confirm the returned AppVersionV1 object reflects
        the expected changes.
      operationId: patchAppVersionV1
      parameters:
        - name: version_id
          in: path
          description: A UUID string identifying this app version.
          required: true
          schema:
            type: string
            format: uuid
        - name: application_id
          in: path
          description: A UUID string identifying this application.
          required: true
          schema:
            type: string
            format: uuid
        - name: enterprise_id
          in: path
          description: A UUID string identifying enterprise.
          required: true
          schema:
            type: string
      requestBody:
        content:
          '*/*':
            schema:
              type: object
              properties:
                release_name:
                  title: Release name
                  type: string
                  description: Name of the Release
                is_default:
                  title: Is Default
                  type: boolean
                  description: Is the app version the deafult
                min_sdk_version:
                  title: Minimum SDK version
                  type: string
                  description: >-
                    Version number of minimum SDK version that supports this app
                    version
                build_number:
                  title: Build Number
                  type: string
                  description: Build number of this app version
                version_code:
                  title: Version Code
                  type: string
                  description: Verion code of this app version
                approval_status:
                  title: Approval Status
                  type: string
                  description: Approval status of this app version
                  enum:
                    - AVAILABLE
                    - ACCEPTED
                    - APPROVED
                    - REJECTED
        required: false
      responses:
        '200':
          description: successful operation
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_AppVersionV1'
        '400':
          description: Bad request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '401':
          description: Authorization information is missing or invalid.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '403':
          description: Forbidden, no permission to perform this action.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '404':
          description: Not Found.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
      security:
        - esper_cloud_api_apiKey: []
      x-codegen-request-body-name: data
  /v1/enterprise/{enterprise_id}/application/{application_id}/version/{version_id}/installdevices:
    get:
      x-badges:
        - name: Stable
          color: green
      tags:
        - esper_cloud_api_Application V1
      summary: List install devices
      description: >-
        Returns a paginated list of devices that have a specific Android
        application version installed.


        Use this endpoint to audit the install coverage of a particular app
        version across your fleet, searchable by device name, alias, or group
        name.


        About List Install Devices


        This endpoint is part of the Application V1 family, which manages the
        enterprise's Android app library. It answers the question "which devices
        have version X of this Android app installed?" for a specific
        application_id and version_id pair. Each result is an InstallDevices
        object containing the device UUID, device name, alias name, and group
        name — enough context to identify and locate devices without a separate
        device lookup.

        There are two other application API families with distinct scopes:


        Tenant Apps (/v2/tenant-apps/...) — manages uploaded apps for iOS and
        Windows. This family does not have a device-level install query
        endpoint.

        Device Apps (/v2/devices/{deviceId}/device-apps/ and GET
        /v2/device-apps) — is the correct family for install queries involving
        iOS and Windows app types (VPP, TENANT_IOS, ESPER_IOS, WEBCLIP,
        ESPER_WINDOWS, TENANT_WINDOWS). Use GET
        /v2/device-apps?app_id=...&app_version_id=... for the equivalent
        cross-device install query on non-Android apps.


        For Android apps, this endpoint is the right tool. Results are
        paginated; use limit and offset to page through large fleets.


        Key Fields


        enterprise_id (path, required) — UUID of the enterprise


        application_id (path, required) — UUID of the Android application


        version_id (path, required) — UUID of the specific app version to query


        search (optional) — Free-text search across device name, alias name, and
        group name


        limit (optional) — Number of results per page


        offset (optional) — Starting index for pagination


        id (response) — UUID of the device


        device_name — System-assigned device name


        alias_name — Human-friendly alias for the device; may be null


        group_name — Name of the device group the device belongs to


        **Common Use Cases**


        Verifying that an Android app deployment reached all intended devices

        Identifying which devices still have an outdated version installed
        before pushing an update

        Auditing install coverage before deleting an app version to confirm no
        devices will be left in an unexpected state


        **Best Practices**


        For iOS or Windows app install queries, use GET
        /v2/device-apps?app_id=...&app_version_id=... from the Device Apps
        family instead — this endpoint covers Android only

        Run this query per version before calling the application or
        version-level delete endpoint to avoid removing a version still in
        active use

        Use search to narrow results to a specific group or device without
        paginating through the entire fleet

        Cross-reference group_name with your intended deployment targets to
        catch devices in unexpected groups


        **Workflow**


        Obtain application_id from GET
        /v1/enterprise/{enterprise_id}/application/ and version_id from GET
        /v1/enterprise/{enterprise_id}/application/{application_id}/version/

        Call GET .../version/{version_id}/installdevices, optionally with search
        and pagination params

        Paginate through results until next is null

        Use the device UUIDs (id) or group_name to identify devices for
        follow-up actions such as issuing an update command or flagging
        stragglers
      operationId: getInstallDevicesV1
      parameters:
        - name: version_id
          in: path
          description: A UUID string identifying this app version.
          required: true
          schema:
            type: string
            format: uuid
        - name: application_id
          in: path
          description: A UUID string identifying this application.
          required: true
          schema:
            type: string
            format: uuid
        - name: enterprise_id
          in: path
          description: A UUID string identifying enterprise.
          required: true
          schema:
            type: string
        - name: search
          in: query
          description: >-
            A search term, search based on device name, device alias_name, group
            name
          schema:
            type: string
        - name: limit
          in: query
          description: Number of results to return per page
          schema:
            type: integer
        - name: offset
          in: query
          description: The initial index from which to return the results
          schema:
            type: integer
      responses:
        '200':
          description: successful operation
          content:
            application/json:
              schema:
                required:
                  - count
                  - results
                type: object
                properties:
                  count:
                    type: integer
                  next:
                    type: string
                    format: url
                    nullable: true
                  previous:
                    type: string
                    format: url
                    nullable: true
                  results:
                    type: array
                    items:
                      $ref: '#/components/schemas/esper_cloud_api_InstallDevices'
        '401':
          description: Authorization information is missing or invalid.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '403':
          description: Forbidden, no permission to perform this action.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '404':
          description: Not Found.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
      security:
        - esper_cloud_api_apiKey: []
  /v1/token-info/:
    get:
      x-badges:
        - name: Deprecated
          color: red
      tags:
        - esper_cloud_api_Token (Deprecated)
      summary: Token Information
      description: >-
        API to get resource information associated with your token like your
        enterprise, user etc
      operationId: getTokenInfo
      responses:
        '200':
          description: successful operation
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_TokenInfoV1'
        '401':
          description: Authorization information is missing or invalid.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '404':
          description: Not Found.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
      security:
        - esper_cloud_api_apiKey: []
  /user_info/:
    get:
      x-badges:
        - name: Stable
          color: green
      tags:
        - esper_cloud_api_User
      summary: User information
      description: >
        Retrieves the profile and account details of the authenticated user
        associated with the current API key.


        Use this endpoint to confirm which user identity is bound to your API
        credentials — useful for debugging access issues, verifying role
        assignments, or bootstrapping workflows that need to know the acting
        user's context before proceeding.


        **About Get User Info** 


        Every Esper API key is tied to a specific user account within a tenant.
        This endpoint surfaces that user's full profile, including their role,
        group memberships, EMM linkage, and account status. It requires no path
        parameters — the response is scoped entirely to the authenticated
        caller. This is the canonical way to confirm "who am I?" in the Esper
        API context.


        **Key Fields**


        username — the login identifier for this user


        profile.role — the user's assigned role (e.g., Enterprise Admin, Viewer,
        Group Admin)


        profile.enterprise — the enterprise UUID this user belongs to


        emm — linked EMM account details, if applicable


        is_active — whether this user account is currently enabled


        last_login — timestamp of the most recent authenticated session


        **Common Use Cases**


        Confirming which user identity is in use before executing sensitive
        operations


        Retrieving the caller's enterprise ID for use in subsequent API calls


        Auditing role assignments for an API key owner


        **Best Practices**


        Call this endpoint at the start of integrations to validate API key
        identity and capture the enterprise ID, rather than hardcoding it


        Check is_active to ensure the account hasn't been deactivated before
        proceeding with bulk operations


        Use profile.role to conditionally adapt your integration's behavior
        based on permission level


        **Workflow**


        Authenticate with your API key


        Call GET /user_info/ to retrieve the caller's identity, enterprise ID,
        and role


        Store profile.enterprise for use as enterprise_id in downstream API
        calls
      operationId: userInfo
      security:
        - esper_cloud_api_apiKey: []
      responses:
        '200':
          description: User Info
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_User'
        '401':
          description: Authorization information is missing or invalid
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
  /authn2/v0/tenant/{enterprise_id}/invite:
    post:
      x-badges:
        - name: Stable
          color: green
      tags:
        - esper_cloud_api_User
      summary: Invite a user
      description: >
        Sends an invitation email to a new user, provisioning their role and
        group access within the specified tenant before they have an Esper
        account.


        Use this endpoint to onboard new team members to an Esper enterprise
        programmatically — the invite flow handles identity provider
        registration via the connection_id and assigns the user's role and group
        scope in a single step.


        **About Invite a User**


        Esper's invite system separates access provisioning from account
        creation. When you call this endpoint, Esper generates an invitation
        record in the tenant and can optionally trigger an invitation email via
        the identity provider. The invited user receives a link to complete
        registration; upon acceptance, their account is created with the role
        and group access defined in the meta.profile block. This is the
        recommended way to add users to a tenant in preference to direct user
        creation.


        **Key Fields / Request Body**


        email — (required) the email address of the person being invited


        meta.profile.role — (required) the role to assign: Enterprise Admin,
        Viewer, Group Admin, Group Viewer, or AuthZ Role User. Use AuthZ Role
        User when assigning a custom RBAC role defined in Esper's authorization
        service — this role type enables fine-grained scope control tied to a
        specific authz_role_id


        meta.profile.enterprise — (required) the tenant UUID; must match
        enterprise_id in the path


        meta.profile.groups — list of group UUIDs to scope access; required for
        Group Admin and Group Viewer roles


        meta.profile.authz_role_id — UUID of the custom RBAC role to assign;
        required when role is AuthZ Role User. This binds the user to a specific
        scope set managed by Esper's AuthZ service, allowing more granular
        access control than the built-in fixed roles


        connection_id — the identity provider connection to use for the invite
        flow


        invitation_url — returned in the response; the link the user follows to
        complete registration


        **Common Use Cases**


        Onboarding a new IT admin or support engineer to a tenant


        Granting a new Group Admin scoped access to a specific device group


        Automating user provisioning workflows where users are invited in bulk
        from an HR or directory system


        **Best Practices**


        Always set meta.profile.groups when the role is Group Admin or Group
        Viewer — the invite will be created but access will be undefined without
        it


        Validate that meta.profile.enterprise matches the enterprise_id path
        parameter before submitting


        Store the returned id (invite ID) immediately; you will need it to
        cancel the invite via DELETE
        /authn2/v0/tenant/{enterprise_id}/invite/{invite_id} if the user
        shouldn't have been invited


        Use GET /authn2/v0/tenant/{enterprise_id}/invite to check whether a
        pending invite for an email already exists before re-sending


        **Workflow**


        Determine the new user's email, intended role, and group scope


        POST to this endpoint with the meta.profile block fully populated


        Store the returned invite id for auditing or future cancellation


        The user receives an email and follows the invitation_url to complete
        account creation
      operationId: tenantUserInvite
      security:
        - esper_cloud_api_apiKey: []
      parameters:
        - $ref: '#/components/parameters/esper_cloud_api_EnterpriseID'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/esper_cloud_api_TenantUserInviteRequest'
      responses:
        '201':
          description: Invite sent to user
          content:
            application/json:
              schema:
                $ref: >-
                  #/components/schemas/esper_cloud_api_TenantUserInviteCreateResponse
        '400':
          description: tenant user invite create error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_GenericErrorResponse'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_GenericErrorResponse'
    get:
      x-badges:
        - name: Stable
          color: green
      tags:
        - esper_cloud_api_User
      summary: List user invites
      description: >
        Returns all pending user invitations for the specified tenant, including
        each invite's status, metadata, and assigned role.


        Use this endpoint to audit outstanding invitations, detect stale or
        duplicate invites, or build an admin UI that surfaces which users have
        been invited but have not yet completed registration.


        **About List User Invites**


        When a user is invited via POST
        /authn2/v0/tenant/{enterprise_id}/invite, an invite record is created
        and persists until the user accepts it or it is explicitly deleted. This
        endpoint returns the full list of those records for the tenant,
        including the role and group assignments encoded in the meta field, the
        associated identity provider invite ID (idp_invite_id), and timestamps.
        The response structure wraps results in a userinvites array alongside a
        count field.


        **Key Fields (Response)**


        id — the Esper invite UUID; use this with the DELETE endpoint to cancel
        an invite


        email — the email address the invite was sent to


        meta — the role and group assignment payload set at invite creation
        time, including any custom RBAC role binding


        idp_invite_id — the identity provider's reference ID for this invite


        send_invitation_email — whether an email was triggered for this invite


        created_at / updated_at — timestamps for tracking invite age


        **Common Use Cases**


        Auditing which users have pending (unaccepted) invitations


        Identifying and cleaning up stale invites before re-inviting a user


        Building an admin console view of the invite queue


        **Best Practices**


        Cross-reference email values against your user directory to identify
        invites sent to addresses that have since changed


        Use created_at to flag invites that have been pending longer than your
        organization's acceptable window, then cancel and re-invite as needed


        Check this endpoint before calling POST .../invite to avoid duplicate
        invitations to the same email


        **Workflow**


        Call GET /authn2/v0/tenant/{enterprise_id}/invite to retrieve all
        pending invites


        Review the userinvites array for emails, roles, and invite age


        For any stale or incorrect invites, note the id and call DELETE
        /authn2/v0/tenant/{enterprise_id}/invite/{invite_id} to cancel
      operationId: getTenantUserInvites
      security:
        - esper_cloud_api_apiKey: []
      parameters:
        - $ref: '#/components/parameters/esper_cloud_api_EnterpriseID'
      responses:
        '201':
          description: Tenant user invites
          content:
            application/json:
              schema:
                type: object
                properties:
                  count:
                    type: integer
                  userinvites:
                    type: array
                    items:
                      $ref: >-
                        #/components/schemas/esper_cloud_api_TenantUserInviteResponse
        '400':
          description: List tenant user invites error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_GenericErrorResponse'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_GenericErrorResponse'
  /authn2/v0/tenant/{enterprise_id}/invite/{invite_id}:
    delete:
      x-badges:
        - name: Stable
          color: green
      tags:
        - esper_cloud_api_User
      summary: Delete a invite
      description: >
        Cancels and removes a specific pending user invitation from the tenant,
        preventing the invited user from completing registration with that
        invite link.


        Use this endpoint when an invitation was sent in error, the intended
        recipient's role or email has changed, or the invite has expired and
        needs to be reissued.


        **About Delete a User Invite**


        Invite records in Esper remain active until the user accepts them or
        they are explicitly deleted. User invitations are valid for seven days —
        after that window, the invite link expires and the user must be
        re-invited. Deleting an invite does not remove or affect any existing
        user account — it only invalidates the pending invite record and its
        associated identity provider invitation. Once deleted, the
        invitation_url from the original invite will no longer be valid. Returns
        HTTP 204 on success with no response body.


        **Key Parameters**


        enterprise_id — the UUID of the tenant the invite belongs to


        invite_id — the UUID of the invite record to cancel, obtained from POST
        /authn2/v0/tenant/{enterprise_id}/invite (create response) or GET
        /authn2/v0/tenant/{enterprise_id}/invite (list)


        **Common Use Cases**


        Revoking an invitation sent to the wrong email address


        Clearing expired or stale invites before re-issuing a fresh invitation
        with updated role or group assignments


        Cleaning up the invite queue as part of periodic tenant access audits


        **Best Practices**


        Always retrieve the invite_id from the list endpoint (GET .../invite)
        rather than storing it externally, to ensure you're targeting the
        correct and current record


        Use created_at from the list response to identify invites approaching or
        past the 7-day expiry window — delete and re-invite rather than waiting
        for the user to report a broken link


        After deletion, re-invite the user immediately if access is still
        intended — the previous invitation_url is no longer valid


        If the re-invite requires a different role, including switching to or
        from AuthZ Role User, prepare the correct authz_role_id before calling
        the invite endpoint again


        Confirm deletion success via the 204 response before notifying
        stakeholders that the invite has been revoked


        **Workflow**


        Call GET /authn2/v0/tenant/{enterprise_id}/invite to identify the target
        invite and retrieve its id


        Call DELETE /authn2/v0/tenant/{enterprise_id}/invite/{invite_id} with
        the correct invite_id


        Confirm the 204 response indicating successful deletion


        Re-invite the user via POST /authn2/v0/tenant/{enterprise_id}/invite if
        access is still required
      operationId: deleteTenantUserInvite
      security:
        - esper_cloud_api_apiKey: []
      parameters:
        - $ref: '#/components/parameters/esper_cloud_api_EnterpriseID'
        - $ref: '#/components/parameters/esper_cloud_api_InviteID'
      responses:
        '204':
          description: Deleted tenant user invite
        '400':
          description: Tenant user invite delete error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_GenericErrorResponse'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_GenericErrorResponse'
  /user/:
    get:
      x-badges:
        - name: Stable
          color: green
      tags:
        - esper_cloud_api_User
      summary: Get Users
      description: >
        Returns a paginated list of all users in the tenant, including their
        profile details, role assignments, and account status.


        Use this endpoint to enumerate current tenant members, audit role
        distributions, or build user-management tooling on top of the Esper
        platform.


        **About Get Users**


        This endpoint retrieves the full set of user records within the
        authenticated enterprise, returning each user's name, email, role, group
        memberships, active status, and EMM linkage. Results are paginated with
        count, next, and previous fields for traversal. Note that POST /user/
        (user creation at this same path) is tagged User (Deprecated) — for
        adding new users, use the invite flow via POST
        /authn2/v0/tenant/{enterprise_id}/invite instead.


        **Key Fields (Response)**


        id — integer ID for the user record


        username — the user's login identifier


        email — the user's email address


        profile.role — assigned role within the enterprise (Enterprise Admin,
        Viewer, Group Admin, Group Viewer, or AuthZ Role User for custom RBAC
        assignments)


        profile.groups — group UUIDs the user has access to


        is_active — whether the account is currently enabled


        last_login — most recent authenticated session timestamp


        has_emm — whether the user has an associated EMM account


        **Common Use Cases**


        Auditing all users and their role assignments across a tenant


        Identifying inactive accounts (is_active: false) for deprovisioning


        Mapping user IDs to usernames for use in other API calls (e.g., event
        logs, audit records)


        **Best Practices**


        Use this endpoint for read-only enumeration; use the invite endpoint
        (POST /authn2/v0/tenant/{enterprise_id}/invite) to add new users rather
        than the deprecated POST /user/


        Paginate through next links when the tenant has a large number of users
        rather than assuming all users appear in the first response


        For users with profile.role of AuthZ Role User, their effective
        permissions are governed by their custom RBAC scope rather than the
        fixed role set — account for this when building access audits


        **Workflow**


        Call GET /user/ to retrieve the first page of tenant users


        Follow the next URL in the response until next is null to retrieve all
        users


        Inspect each user's profile.role, is_active, and last_login for access
        auditing or downstream processing
      operationId: getUsers
      security:
        - esper_cloud_api_apiKey: []
      responses:
        '200':
          description: Users List
          content:
            application/json:
              schema:
                type: object
                properties:
                  count:
                    type: integer
                  previous:
                    type: string
                  next:
                    type: string
                  results:
                    type: array
                    items:
                      $ref: '#/components/schemas/esper_cloud_api_UserList'
        '401':
          description: Authorization information is missing or invalid
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
    post:
      x-badges:
        - name: Deprecated
          color: red
      tags:
        - esper_cloud_api_User (Deprecated)
      summary: Create a new User
      description: Create a new User
      operationId: createUser
      security:
        - esper_cloud_api_apiKey: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/esper_cloud_api_UserCreate'
      responses:
        '201':
          description: User Created
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_User'
        '400':
          description: Bad request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '401':
          description: Authorization information is missing or invalid
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '403':
          description: Forbidden, no permission to perform this action
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
  /user/{user_id}/:
    get:
      x-badges:
        - name: Stable
          color: green
      tags:
        - esper_cloud_api_User
      summary: Get User Information
      description: >
        Retrieves the full profile and account details for a specific user by
        their integer user ID.


        Use this endpoint to look up an individual tenant member's role, group
        assignments, account status, and EMM linkage without fetching the full
        user list.


        **About Get User Information**


        This endpoint returns a single user record from the authenticated
        enterprise, identified by their integer user_id. The response uses the
        same User schema returned by GET /user/, covering identity, role, group
        memberships, active status, and EMM association. Note that other methods
        at this path — PUT, PATCH, and DELETE — are tagged User (Deprecated);
        for updating a user's role use PUT /authz2/v1/users/{user_id}, and for
        removing a user use DELETE
        /authn2/v0/tenant/{enterprise_id}/user/{user_id}/.


        **Key Fields (Response)**


        id — the integer user ID (matches the path parameter)


        username — the user's login identifier


        email — the user's email address


        profile.role — assigned role within the enterprise (Enterprise Admin,
        Viewer, Group Admin, Group Viewer, or AuthZ Role User for custom RBAC
        assignments)


        profile.groups — group UUIDs the user has access to


        is_active — whether the account is currently enabled


        last_login — most recent authenticated session timestamp


        has_emm — whether the user has an associated EMM account


        is_email_verified — whether the user has completed email verification


        **Common Use Cases**


        Looking up a specific user's role and group scope before modifying their
        access


        Verifying account status (is_active, is_email_verified) for a user who
        is reporting access problems


        Retrieving a user's EMM linkage details for troubleshooting enrollment
        issues


        **Best Practices**


        Obtain user_id from GET /user/ — it is an integer, distinct from the
        UUID-format authn_user_id used by other endpoints such as DELETE
        /authn2/v0/tenant/{enterprise_id}/user/{user_id}/


        For users with profile.role of AuthZ Role User, their effective
        permissions are governed by their custom RBAC scope — check their role
        assignment via GET /authz2/v1/users/{user_id}/groups for a complete
        picture of their access


        Use GET /user_info/ instead if you need details about the currently
        authenticated caller rather than a specific user by ID


        **Workflow**


        Call GET /user/ to enumerate tenant users and identify the target user's
        integer id


        Call GET /user/{user_id}/ with that id to retrieve the full user record


        Inspect profile.role, is_active, and is_email_verified for the
        information needed
      operationId: getUser
      security:
        - esper_cloud_api_apiKey: []
      parameters:
        - $ref: '#/components/parameters/esper_cloud_api_UserID'
      responses:
        '200':
          description: User Details
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_User'
        '401':
          description: Authorization information is missing or invalid
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '404':
          description: Not Found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
    put:
      x-badges:
        - name: Deprecated
          color: red
      tags:
        - esper_cloud_api_User (Deprecated)
      summary: Update a User
      description: Update a User
      operationId: updateUser
      security:
        - esper_cloud_api_apiKey: []
      parameters:
        - $ref: '#/components/parameters/esper_cloud_api_UserID'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/esper_cloud_api_UserCreate'
      responses:
        '200':
          description: Updated User
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_User'
        '400':
          description: Bad request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '401':
          description: Authorization information is missing or invalid
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '403':
          description: Forbidden, no permission to perform this action
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '404':
          description: Not Found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
    patch:
      x-badges:
        - name: Deprecated
          color: red
      tags:
        - esper_cloud_api_User (Deprecated)
      summary: Partial update a User
      description: Partial update a User
      operationId: partialUpdateUser
      security:
        - esper_cloud_api_apiKey: []
      parameters:
        - $ref: '#/components/parameters/esper_cloud_api_UserID'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/esper_cloud_api_UserUpdate'
      responses:
        '200':
          description: Partial updated User
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_User'
        '400':
          description: Bad request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '401':
          description: Authorization information is missing or invalid
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '403':
          description: Forbidden, no permission to perform this action
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '404':
          description: Not Found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
    delete:
      x-badges:
        - name: Deprecated
          color: red
      tags:
        - esper_cloud_api_User (Deprecated)
      summary: Delete a user
      operationId: userDelete
      security:
        - esper_cloud_api_apiKey: []
      parameters:
        - $ref: '#/components/parameters/esper_cloud_api_UserID'
      responses:
        '204':
          description: Deleted User
        '401':
          description: Authorization information is missing or invalid
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '403':
          description: Forbidden, no permission to perform this action.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '404':
          description: Not Found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
  /authz2/v1/users/{user_id}:
    put:
      x-badges:
        - name: Stable
          color: green
      tags:
        - esper_cloud_api_User
      summary: Update user role
      description: >
        Updates the role, group assignments, and access scope for a specific
        user within the tenant.


        Use this endpoint when a user's responsibilities change and their
        permissions need to be adjusted — including switching between fixed
        roles, scoping group access, or assigning a custom RBAC role via AuthZ
        Role User.


        **About Update User Role**

        This is the current, supported endpoint for modifying another user's
        role and access within Esper. It operates on the authn_user_id (UUID
        format), which is distinct from the integer id returned by GET /user/ —
        use GET /authn2/v1/users/ to retrieve the correct UUID. The request
        replaces the user's current role and group assignment in full; partial
        updates are not supported. Returns the updated User object on success.


        **Key Fields / Request Body**


        role — (required) the role to assign: Enterprise Admin, Viewer, Group
        Admin, Group Viewer, or AuthZ Role User


        groups — (required) list of group UUIDs to scope access; can be empty if
        has_all_group_access is true or the role does not require group scoping


        authz_role_id — UUID of the custom RBAC role; required when role is
        AuthZ Role User


        has_all_group_access — set to true to grant access to all groups;
        required only for AuthZ Role User role type


        can_factory_reset — whether the user should be permitted to factory
        reset devices


        **Common Use Cases**


        Promoting a Viewer to Enterprise Admin after a role change


        Scoping a user to specific device groups by switching them to Group
        Admin or Group Viewer


        Assigning a custom RBAC role for fine-grained permission control


        Revoking broad access by narrowing a user's group list


        **Best Practices**


        Use GET /authn2/v1/users/ to retrieve the user's UUID (authn_user_id)
        before calling this endpoint — the integer id from GET /user/ will not
        work here


        When setting role to AuthZ Role User, always provide both authz_role_id
        and either a populated groups list or has_all_group_access: true


        Treat this as a full replacement of the user's role record — always
        include all intended group assignments in a single call rather than
        assuming previous values are preserved


        **Workflow**


        Call GET /authn2/v1/users/ to retrieve the target user's UUID
        (authn_user_id)


        Determine the new role, group scope, and any custom RBAC role ID


        PUT to this endpoint with the fully populated request body


        Confirm the updated role and group assignments in the returned User
        object
      operationId: updateDifferentUser
      security:
        - esper_cloud_api_apiKey: []
      parameters:
        - $ref: '#/components/parameters/esper_cloud_api_AuthNUserID'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/esper_cloud_api_UpdateDifferentUserRequest'
      responses:
        '200':
          description: User Updated Successfully
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_User'
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_GenericErrorResponse'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_GenericErrorResponse'
        '403':
          description: Forbidden, no permission to perform this action.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_GenericErrorResponse'
  /authn2/v0/user/{user_id}:
    put:
      x-badges:
        - name: Stable
          color: green
      tags:
        - esper_cloud_api_User
      summary: Update user profile
      description: >
        Updates the authenticated user's own profile details.


        Use this endpoint when the currently authenticated user needs to update
        their own display name. This endpoint is scoped to self-service profile
        edits only and cannot be used to modify another user's account or change
        role and group assignments.


        **About Update User Profile**


        This endpoint allows a user to update their own profile via the authn2
        identity service. The request body accepts only first_name — role
        changes, group reassignments, and other administrative updates must be
        performed by an Enterprise Admin via PUT /authz2/v1/users/{user_id}. The
        user_id parameter expects the UUID-format authn_user_id, not the integer
        id from GET /user/.


        **Key Fields / Request Body**


        first_name — (required) the updated first name for the authenticated
        user


        **Common Use Cases**


        Allowing a user to correct or update their display name after account
        creation


        **Best Practices**


        Use GET /user_info/ to confirm the current user's authn_user_id before
        calling this endpoint


        For role or group changes, use PUT /authz2/v1/users/{user_id} — this
        endpoint cannot modify access permissions


        **Workflow**


        Call GET /user_info/ to retrieve the authenticated user's authn_user_id


        PUT to this endpoint with the updated first_name


        Confirm the change in the returned User object
      operationId: updateOwnUser
      security:
        - esper_cloud_api_apiKey: []
      parameters:
        - $ref: '#/components/parameters/esper_cloud_api_EnterpriseID'
        - $ref: '#/components/parameters/esper_cloud_api_AuthNUserID'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/esper_cloud_api_UpdateOwnUserRequest'
      responses:
        '200':
          description: User Updated Successfully
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_User'
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_GenericErrorResponse'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_GenericErrorResponse'
        '403':
          description: Forbidden, no permission to perform this action.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_GenericErrorResponse'
  /authz2/v1/users/{user_id}/groups:
    get:
      x-badges:
        - name: Stable
          color: green
      tags:
        - esper_cloud_api_User
      summary: Get user groups
      description: >
        Returns the device groups a specific user has access to, based on their
        role and group assignments.


        Use this endpoint to audit a user's group-level access scope, or to
        determine which subgroups they can reach before assigning device
        commands or bulk operations.


        **About Get User Groups**


        This endpoint retrieves the group membership for a given user from
        Esper's authorization service, returning a list of group UUIDs and a
        flag indicating whether the user has access to all groups in the tenant.
        The user_id parameter expects the UUID-format authn_user_id. The
        optional sub_groups query parameter expands the response to include
        subgroups the user can reach through their group assignments, since
        users with access to a parent group automatically have access to its
        subgroups.


        **Key Fields**


        user_id — the UUID-format authn_user_id of the target user; obtain from
        GET /authn2/v1/users/


        sub_groups — (query param, boolean) set to true to include subgroup
        access in the response


        group_ids — returned array of group UUIDs the user has access to


        has_all_group_access — if true, the user has access to all tenant groups
        regardless of the group_ids list


        **Common Use Cases**


        Auditing which device groups a user can manage before issuing
        group-level commands


        Verifying group scope for AuthZ Role User accounts where access is
        controlled by a custom RBAC role


        Confirming subgroup access inheritance when planning nested group
        structures


        **Best Practices**


        Use GET /authn2/v1/users/ to retrieve the target user's authn_user_id
        (UUID) before calling this endpoint — the integer id from GET /user/
        will not work


        Always call with sub_groups=true when you need a complete picture of a
        user's reachable device scope, not just their directly assigned groups


        If has_all_group_access is true, the group_ids list is not the full
        scope — the user can access every group in the tenant


        **Workflow**


        Call GET /authn2/v1/users/ to retrieve the target user's authn_user_id


        Call GET /authz2/v1/users/{user_id}/groups with sub_groups=true if
        subgroup access is relevant


        Inspect group_ids and has_all_group_access to determine the user's full
        device group scope
      operationId: getUserGroups
      security:
        - esper_cloud_api_apiKey: []
      parameters:
        - $ref: '#/components/parameters/esper_cloud_api_AuthNUserID'
        - in: query
          name: sub_groups
          description: >-
            Set to true to get a list of the user’s subgroup access. Users have
            access to their group’s subgroups.
          schema:
            type: boolean
      responses:
        '200':
          description: User Groups
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_UserGroups'
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_GenericErrorResponse'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_GenericErrorResponse'
        '403':
          description: Forbidden, no permission to perform this action.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_GenericErrorResponse'
  /authn2/v0/tenant/{enterprise_id}/user/{user_id}/:
    delete:
      x-badges:
        - name: Stable
          color: green
      tags:
        - esper_cloud_api_User
      summary: Delete a user from Enterprise
      description: >
        Removes a specific user from the tenant, revoking their access to all
        Esper resources within that enterprise.


        Use this endpoint to deprovision a user when they leave the
        organization, change roles outside the tenant, or have their access
        revoked as part of an access audit.

        About Delete a User from Enterprise

        This is the current, supported endpoint for removing a user from an
        Esper tenant. It operates on the authn_user_id (UUID format) rather than
        the integer id — use GET /authn2/v1/users/ to retrieve the correct
        identifier. Deletion is immediate and permanent; the user will lose all
        access to the enterprise upon removal. Returns HTTP 204 on success with
        no response body. This endpoint replaces the deprecated DELETE
        /user/{user_id}/.


        **Key Parameters**


        enterprise_id — the UUID of the tenant to remove the user from


        user_id — the UUID-format authn_user_id of the user to remove; obtain
        from GET /authn2/v1/users/


        **Common Use Cases**


        Offboarding a team member who has left the organization


        Removing a user whose access was granted in error


        Cleaning up inactive or unverified accounts as part of a periodic access
        audit


        **Best Practices**


        Use GET /authn2/v1/users/ to confirm the correct authn_user_id before
        calling — deleting the wrong user is not reversible


        Verify the user has no active device operations or pending commands in
        flight before removing them


        If the user should retain access in a reduced capacity rather than being
        fully removed, use PUT /authz2/v1/users/{user_id} to downgrade their
        role instead


        **Workflow**


        Call GET /authn2/v1/users/ to retrieve the target user's authn_user_id


        Call DELETE /authn2/v0/tenant/{enterprise_id}/user/{user_id}/ with the
        correct UUIDs


        Confirm the 204 response indicating successful removal


        If re-access is needed in future, re-invite the user via POST
        /authn2/v0/tenant/{enterprise_id}/invite
      operationId: deleteTenantUser
      security:
        - esper_cloud_api_apiKey: []
      parameters:
        - $ref: '#/components/parameters/esper_cloud_api_EnterpriseID'
        - $ref: '#/components/parameters/esper_cloud_api_AuthNUserID'
      responses:
        '204':
          description: Deleted enterprise user
        '400':
          description: Enterprise user delete error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_GenericErrorResponse'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_GenericErrorResponse'
  /enterprise/{enterprise_id}/devicegroup/{group_id}/blueprint/:
    get:
      x-badges:
        - name: Deprecated
          color: red
      parameters:
        - $ref: '#/components/parameters/esper_cloud_api_EnterpriseID'
        - $ref: '#/components/parameters/esper_cloud_api_GroupID'
        - in: query
          name: without_details
          schema:
            type: boolean
      tags:
        - esper_cloud_api_Blueprint (Deprecated)
      summary: Get list of Blueprints for the group
      description: >
        Return list of Blueprint instances for the group.


        ⚠️ **Deprecation Notice:** This endpoint will soon be deprecated. Use
        [Blueprints API](https://api.esper.io/tag/Blueprints-API) instead.
      operationId: listBlueprint
      security:
        - esper_cloud_api_apiKey: []
      responses:
        '200':
          description: Blueprint detail
          content:
            application/json:
              schema:
                type: object
                properties:
                  count:
                    type: integer
                  next:
                    type: string
                  previous:
                    type: string
                  results:
                    type: array
                    items:
                      $ref: '#/components/schemas/esper_cloud_api_Blueprint'
        default:
          description: Unexpected error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
    post:
      x-badges:
        - name: Deprecated
          color: red
      parameters:
        - $ref: '#/components/parameters/esper_cloud_api_EnterpriseID'
        - $ref: '#/components/parameters/esper_cloud_api_GroupID'
        - in: query
          name: without_details
          schema:
            type: boolean
      tags:
        - esper_cloud_api_Blueprint (Deprecated)
      summary: Create a Blueprint
      description: >
        Returns the created Blueprint instance.


        ⚠️ **Deprecation Notice:** This endpoint will soon be deprecated. Use
        [Blueprints API](https://api.esper.io/tag/Blueprints-API) instead.
      operationId: createBlueprint
      security:
        - esper_cloud_api_apiKey: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/esper_cloud_api_Blueprint'
      responses:
        '201':
          description: Created
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_Blueprint'
        '400':
          description: Blueprint create error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '401':
          description: Blueprint create error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
  /enterprise/{enterprise_id}/devicegroup/{group_id}/blueprint/{blueprint_id}/:
    get:
      x-badges:
        - name: Deprecated
          color: red
      parameters:
        - $ref: '#/components/parameters/esper_cloud_api_EnterpriseID'
        - $ref: '#/components/parameters/esper_cloud_api_GroupID'
        - $ref: '#/components/parameters/esper_cloud_api_BlueprintID'
        - in: query
          name: without_details
          schema:
            type: boolean
      tags:
        - esper_cloud_api_Blueprint (Deprecated)
      summary: Get Blueprint detail
      description: >
        Returns the details of a Blueprint instance.


        ⚠️ **Deprecation Notice:** This endpoint will soon be deprecated. Use
        [Blueprints API](https://api.esper.io/tag/Blueprints-API) instead.
      operationId: getBlueprint
      security:
        - esper_cloud_api_apiKey: []
      responses:
        '200':
          description: Blueprint detail
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_Blueprint'
        default:
          description: Unexpected error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
    patch:
      x-badges:
        - name: Deprecated
          color: red
      parameters:
        - $ref: '#/components/parameters/esper_cloud_api_EnterpriseID'
        - $ref: '#/components/parameters/esper_cloud_api_GroupID'
        - $ref: '#/components/parameters/esper_cloud_api_BlueprintID'
        - in: query
          name: without_details
          schema:
            type: boolean
      tags:
        - esper_cloud_api_Blueprint (Deprecated)
      summary: Partial update a Blueprint
      description: >
        Returns the details of the updated Blueprint instance.


        ⚠️ **Deprecation Notice:** This endpoint will soon be deprecated. Use
        [Blueprints API](https://api.esper.io/tag/Blueprints-API) instead.
      operationId: partialUpdateBlueprint
      security:
        - esper_cloud_api_apiKey: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/esper_cloud_api_Blueprint'
      responses:
        '200':
          description: Partially updated Blueprint
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_Blueprint'
        '400':
          description: Blueprint update error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '401':
          description: Blueprint update error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
    delete:
      x-badges:
        - name: Deprecated
          color: red
      parameters:
        - $ref: '#/components/parameters/esper_cloud_api_EnterpriseID'
        - $ref: '#/components/parameters/esper_cloud_api_GroupID'
        - $ref: '#/components/parameters/esper_cloud_api_BlueprintID'
        - in: query
          name: without_details
          schema:
            type: boolean
      tags:
        - esper_cloud_api_Blueprint (Deprecated)
      summary: Delete a Blueprint
      description: >
        Deletes the requested Blueprint instance.


        ⚠️ **Deprecation Notice:** This endpoint will soon be deprecated. Use
        [Blueprints API](https://api.esper.io/tag/Blueprints-API) instead.
      operationId: deleteBlueprint
      security:
        - esper_cloud_api_apiKey: []
      responses:
        '204':
          description: Deleted Blueprint
        '401':
          description: Blueprint delete error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
  /enterprise/{enterprise_id}/devicegroup/{group_id}/blueprint/{blueprint_id}/revisions/:
    get:
      x-badges:
        - name: Deprecated
          color: red
      parameters:
        - $ref: '#/components/parameters/esper_cloud_api_EnterpriseID'
        - $ref: '#/components/parameters/esper_cloud_api_GroupID'
        - $ref: '#/components/parameters/esper_cloud_api_BlueprintID'
        - in: query
          name: without_details
          schema:
            type: boolean
      tags:
        - esper_cloud_api_Blueprint (Deprecated)
      summary: Get list of Blueprint Revisions
      description: >
        Returns a list of Blueprint Revisions instances for the given Blueprint.


        ⚠️ **Deprecation Notice:** This endpoint will soon be deprecated. Use
        [Blueprints API](https://api.esper.io/tag/Blueprints-API) instead.
      operationId: listBlueprintRevisions
      security:
        - esper_cloud_api_apiKey: []
      responses:
        '200':
          description: Blueprint revision list
          content:
            application/json:
              schema:
                type: object
                properties:
                  count:
                    type: integer
                  next:
                    type: string
                  previous:
                    type: string
                  results:
                    type: array
                    items:
                      $ref: '#/components/schemas/esper_cloud_api_BlueprintRevision'
        default:
          description: Unexpected error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
  /enterprise/{enterprise_id}/devicegroup/{group_id}/blueprint/{blueprint_id}/revisions/{revision_id}/:
    get:
      x-badges:
        - name: Deprecated
          color: red
      parameters:
        - $ref: '#/components/parameters/esper_cloud_api_EnterpriseID'
        - $ref: '#/components/parameters/esper_cloud_api_GroupID'
        - $ref: '#/components/parameters/esper_cloud_api_BlueprintID'
        - $ref: '#/components/parameters/esper_cloud_api_BlueprintRevisionID'
        - in: query
          name: without_details
          schema:
            type: boolean
      tags:
        - esper_cloud_api_Blueprint (Deprecated)
      summary: Get Blueprint Revision detail
      description: >
        Returns the detail of Blueprint Revision instance.


        ⚠️ **Deprecation Notice:** This endpoint will soon be deprecated. Use
        [Blueprints API](https://api.esper.io/tag/Blueprints-API) instead.
      operationId: getBlueprintRevision
      security:
        - esper_cloud_api_apiKey: []
      responses:
        '200':
          description: Blueprint revision detail
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_BlueprintRevision'
        default:
          description: Unexpected error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
  /enterprise/{enterprise_id}/devicegroup/{group_id}/blueprint/restore/:
    post:
      x-badges:
        - name: Deprecated
          color: red
      parameters:
        - $ref: '#/components/parameters/esper_cloud_api_EnterpriseID'
        - $ref: '#/components/parameters/esper_cloud_api_GroupID'
      tags:
        - esper_cloud_api_Blueprint (Deprecated)
      summary: Restore a Blueprint
      description: >
        Returns the Blueprint instance restored to the requested Blueprint
        Revision.


        ⚠️ **Deprecation Notice:** This endpoint will soon be deprecated. Use
        [Blueprints API](https://api.esper.io/tag/Blueprints-API) instead.
      operationId: restoreBlueprintRevision
      security:
        - esper_cloud_api_apiKey: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                revision_id:
                  type: string
                  format: uuid
      responses:
        '201':
          description: Restored
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_Blueprint'
        '400':
          description: Blueprint restore error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '401':
          description: Blueprint restore error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
  /enterprise/{enterprise_id}/devicegroup/{group_id}/blueprint/upload/:
    post:
      x-badges:
        - name: Deprecated
          color: red
      parameters:
        - $ref: '#/components/parameters/esper_cloud_api_EnterpriseID'
        - $ref: '#/components/parameters/esper_cloud_api_GroupID'
      tags:
        - esper_cloud_api_Blueprint (Deprecated)
      summary: Upload a Blueprint
      description: >
        Create a Blueprint by uploading a json file.


        ⚠️ **Deprecation Notice:** This endpoint will soon be deprecated. Use
        [Blueprints API](https://api.esper.io/tag/Blueprints-API) instead.
      operationId: uploadBlueprint
      security:
        - esper_cloud_api_apiKey: []
      requestBody:
        required: true
        content:
          multipart/form-data:
            schema:
              type: object
              properties:
                file:
                  type: string
                  format: binary
      responses:
        '201':
          description: Uploaded
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_Blueprint'
        '400':
          description: Blueprint upload error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '401':
          description: Blueprint upload error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
  /v1/enterprise/{enterprise_id}/directory_record/:
    get:
      x-badges:
        - name: Stable
          color: green
      tags:
        - esper_cloud_api_Directory Record
      summary: Get all Directory Records
      description: Returns a list of all Directory Record instances
      operationId: getDirectoryRecords
      security:
        - esper_cloud_api_apiKey: []
      parameters:
        - $ref: '#/components/parameters/esper_cloud_api_EnterpriseID'
      responses:
        '200':
          description: Directory records
          content:
            application/json:
              schema:
                type: object
                properties:
                  count:
                    type: integer
                  previous:
                    type: string
                  next:
                    type: string
                  results:
                    type: array
                    items:
                      $ref: '#/components/schemas/esper_cloud_api_DirectoryRecord'
        default:
          description: Unexpected error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
    post:
      x-badges:
        - name: Stable
          color: green
      tags:
        - esper_cloud_api_Directory Record
      summary: Create a new Directory Record
      description: Returns the created Directory Record intance
      operationId: createDirectoryRecord
      security:
        - esper_cloud_api_apiKey: []
      parameters:
        - $ref: '#/components/parameters/esper_cloud_api_EnterpriseID'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/esper_cloud_api_DirectoryRecordCreate'
      responses:
        '201':
          description: Created
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_DirectoryRecord'
        '400':
          description: Directory record create error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '401':
          description: Directory record create error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
  /v1/enterprise/{enterprise_id}/directory_record/{directory_record_id}/:
    get:
      x-badges:
        - name: Stable
          color: green
      tags:
        - esper_cloud_api_Directory Record
      summary: Get details about a Directory Record
      description: Returns detail of the Directory Record instance
      operationId: getDirectoryRecord
      security:
        - esper_cloud_api_apiKey: []
      parameters:
        - $ref: '#/components/parameters/esper_cloud_api_EnterpriseID'
        - $ref: '#/components/parameters/esper_cloud_api_DirectoryRecordID'
      responses:
        '200':
          description: Directory record information
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_DirectoryRecord'
        default:
          description: Unexpected error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
    put:
      x-badges:
        - name: Stable
          color: green
      tags:
        - esper_cloud_api_Directory Record
      summary: Update a Directory Record
      description: Returns the updated Directory Record instance
      operationId: updateDirectoryRecord
      security:
        - esper_cloud_api_apiKey: []
      parameters:
        - $ref: '#/components/parameters/esper_cloud_api_EnterpriseID'
        - $ref: '#/components/parameters/esper_cloud_api_DirectoryRecordID'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/esper_cloud_api_DirectoryRecordUpdate'
      responses:
        '200':
          description: Updated Directory Record Information
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_DirectoryRecord'
        '400':
          description: Directory record update error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
        '401':
          description: Directory record update error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
    delete:
      x-badges:
        - name: Stable
          color: green
      tags:
        - esper_cloud_api_Directory Record
      summary: Delete a Directory Record
      description: Deletes the requested Directory Record instance
      operationId: deleteDirectoryRecord
      security:
        - esper_cloud_api_apiKey: []
      parameters:
        - $ref: '#/components/parameters/esper_cloud_api_EnterpriseID'
        - $ref: '#/components/parameters/esper_cloud_api_DirectoryRecordID'
      responses:
        '204':
          description: Deleted Directory Record
        '401':
          description: Directory record delete error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
  /authn2/v0/tenant/{enterprise_id}/connection:
    get:
      x-badges:
        - name: Stable
          color: green
      tags:
        - esper_cloud_api_SSO Connections
      summary: List SSO connections
      description: >
        List SSO connections of a tenant. Learn more about <a target="_blank"
        href="https://help.esper.io/hc/en-us/articles/14266541959569-Introduction-to-User-Authentication">SSO
        Connections</a>.
      operationId: getConnections
      security:
        - esper_cloud_api_apiKey: []
      parameters:
        - $ref: '#/components/parameters/esper_cloud_api_EnterpriseID'
        - $ref: '#/components/parameters/esper_cloud_api_IsDefault'
      responses:
        '200':
          description: Tenant connections
          content:
            application/json:
              schema:
                type: object
                properties:
                  count:
                    type: integer
                  connections:
                    type: array
                    items:
                      $ref: >-
                        #/components/schemas/esper_cloud_api_CustomConnectionsListResponse
        '400':
          description: List custom connections error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_GenericErrorResponse'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_GenericErrorResponse'
  /authn2/v0/tenant/{enterprise_id}/connection/{connection_id}:
    put:
      x-badges:
        - name: Stable
          color: green
      tags:
        - esper_cloud_api_SSO Connections
      summary: Edit SSO connections
      description: Edit SSO connections
      operationId: editCustomConnection
      security:
        - esper_cloud_api_apiKey: []
      parameters:
        - $ref: '#/components/parameters/esper_cloud_api_EnterpriseID'
        - $ref: '#/components/parameters/esper_cloud_api_ConnectionID'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/esper_cloud_api_CustomConnectionRequest'
      responses:
        '200':
          description: Updated connection
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_CustomConnectionResponse'
        '400':
          description: custom connection update error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_GenericErrorResponse'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_GenericErrorResponse'
        '403':
          description: Forbidden, no permission to perform this action.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_ErrorResponse'
  /authz2/v1/roles/:
    get:
      x-badges:
        - name: Stable
          color: green
      tags:
        - esper_cloud_api_Roles
      summary: List Roles API
      description: >
        Returns all custom RBAC roles defined for the tenant.


        Use this endpoint to enumerate available roles before assigning one to a
        user, or to audit the set of custom roles that have been created for
        fine-grained access control.


        **About List Roles**


        Esper's authorization service supports custom roles as an alternative to
        the built-in fixed roles. Each custom role has a name, description, and
        a set of scopes that define what actions users assigned to that role can
        perform. This endpoint returns all custom roles for the tenant as a
        roles array alongside a count field. Role IDs returned here are used
        with PUT /authz2/v1/users/{user_id} when assigning an AuthZ Role User
        and with the role detail and scopes endpoints for management.


        **Key Fields (Response)**


        id — the UUID of the role; used in all subsequent role management and
        user assignment calls


        name — the display name of the role


        description — a human-readable description of the role's intended
        purpose


        role_type — integer indicating the type of role


        **Common Use Cases**


        Enumerating available custom roles before assigning one to a newly
        invited user


        Auditing role names and IDs as part of an access management review


        Retrieving role_id values to then call GET
        /authz2/v1/roles/{role_id}/scopes to inspect what each role permits


        **Best Practices**


        Cache role IDs in automation **Workflow**s rather than calling this
        endpoint on every user assignment — custom roles change infrequently


        Use role description fields consistently when creating roles to make
        this list actionable during audits


        Cross-reference role assignments against GET /user/ to identify users
        assigned to each custom role


        **Workflow**


        Call GET /authz2/v1/roles/ to retrieve all custom roles and their IDs


        Identify the target role by name or description


        Call GET /authz2/v1/roles/{role_id}/scopes with the role's id to inspect
        its permission set


        Use the role id in user assignments (PUT /authz2/v1/users/{user_id}) as
        needed
      operationId: GetRoleURL
      security:
        - esper_cloud_api_apiKey: []
      responses:
        '200':
          description: Request Succeded
          content:
            application/json:
              schema:
                type: object
                properties:
                  count:
                    type: integer
                  roles:
                    type: array
                    items:
                      $ref: '#/components/schemas/esper_cloud_api_RoleResponse'
        '400':
          description: Bad request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_GenericErrorResponse'
        '401':
          description: Unauthorized request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_GenericErrorResponse'
    post:
      x-badges:
        - name: Stable
          color: green
      tags:
        - esper_cloud_api_Roles
      summary: >-
        Create a new role. Then optionally add scopes by using the Update Role
        Scopes API. No scopes are added by default.
      description: >
        Creates a new custom RBAC role for the tenant with a specified name and
        description.


        Use this endpoint to define a new role as part of setting up
        fine-grained access control — then assign scopes to it via PUT
        /authz2/v1/roles/{role_id}/scopes before assigning it to users.


        **About Create Role**


        Custom roles in Esper allow Enterprise Admins(and other users with
        certain permissions) to define permission sets that are more granular
        than the built-in fixed roles. A newly created role has no scopes by
        default — it must be populated with the desired action permissions via
        PUT /authz2/v1/roles/{role_id}/scopes before it grants any meaningful
        access. Once scoped, the role can be assigned to users by setting their
        role to AuthZ Role User and providing the role's UUID as authz_role_id
        via PUT /authz2/v1/users/{user_id}.


        **Key Fields / Request Body**


        name — the display name for the new role


        description — a human-readable description of the role's intended
        purpose and scope of access


        **Key Fields (Response)**


        id — the UUID of the newly created role; store this immediately for use
        in scope assignment and user assignment calls


        name — the name as set in the request


        description — the description as set in the request


        role_type — integer indicating the type of role


        **Common Use Cases**


        Creating a read-only role for auditors that grants only read:device and
        read:group scopes


        Defining a role for field technicians with a limited set of device
        command permissions


        Building a role hierarchy for multi-team fleet management


        **Best Practices**


        Always follow role creation immediately with PUT
        /authz2/v1/roles/{role_id}/scopes — a role with no scopes assigned will
        not grant users any access

        Use clear, descriptive name and description values that reflect the
        intended job function, not the technical scope list, to keep the role
        list auditable

        Store the returned id before making any further calls — it is required
        for scope assignment and cannot be retrieved from this response again
        without calling GET /authz2/v1/roles/


        **Workflow**


        POST to this endpoint with a name and description for the new role


        Store the returned role id


        Call PUT /authz2/v1/roles/{role_id}/scopes to assign the desired
        permission scopes to the role


        Assign the role to users via PUT /authz2/v1/users/{user_id} with role:
        AuthZ Role User and the role UUID as authz_role_id
      operationId: PostRoleURL
      security:
        - esper_cloud_api_apiKey: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/esper_cloud_api_Role'
      responses:
        '200':
          description: Request Succeded
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_RoleResponse'
        '400':
          description: Bad request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_GenericErrorResponse'
        '401':
          description: Unauthorized request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_GenericErrorResponse'
  /authz2/v1/roles/{role_id}:
    get:
      x-badges:
        - name: Stable
          color: green
      tags:
        - esper_cloud_api_Roles
      summary: Get Role API
      description: >
        Retrieves the details of a specific custom RBAC role by its ID.


        Use this endpoint to confirm a role's name, description, and type before
        updating it or assigning it to a user.


        **About Get Role**


        This endpoint returns the metadata for a single custom role — name,
        description, and role_type — identified by its UUID. It does not return
        the role's associated scopes; use GET /authz2/v1/roles/{role_id}/scopes
        to retrieve the permission set. This endpoint is useful for validating
        role details before making updates via PATCH /authz2/v1/roles/{role_id}.


        **Key Fields (Response)**


        id — the UUID of the role


        name — the display name of the role


        description — the human-readable description of the role's intended
        purpose


        role_type — integer indicating the type of role


        **Common Use Cases**


        Confirming role details before assigning it to a user via PUT
        /authz2/v1/users/{user_id}


        Verifying that a role's name and description are accurate before
        referencing it in documentation or automation


        Retrieving role metadata as a precursor to updating it via PATCH
        /authz2/v1/roles/{role_id}


        **Best Practices**


        Use GET /authz2/v1/roles/ first if you don't have the role_id — this
        endpoint requires it as a path parameter


        Pair this with GET /authz2/v1/roles/{role_id}/scopes to get a complete
        picture of what a role does before assigning it to users


        **Workflow**


        Obtain the role_id from GET /authz2/v1/roles/


        Call GET /authz2/v1/roles/{role_id} to confirm the role's name and
        description


        Proceed with user assignment or update as needed
      operationId: GetRoleIdURL
      security:
        - esper_cloud_api_apiKey: []
      parameters:
        - $ref: '#/components/parameters/esper_cloud_api_RoleID'
      responses:
        '200':
          description: Request Succeded
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_RoleResponse'
        '400':
          description: Bad request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_GenericErrorResponse'
        '401':
          description: Unauthorized request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_GenericErrorResponse'
    patch:
      x-badges:
        - name: Stable
          color: green
      tags:
        - esper_cloud_api_Roles
      summary: Patch Role API
      description: >
        Updates the name and/or description of an existing custom RBAC role.


        Use this endpoint to correct a role's display name or description
        without affecting the scopes or user assignments associated with that
        role.


        **About Patch Role**


        This endpoint modifies the metadata of an existing custom role — its
        name and description — and leaves the role's assigned scopes and user
        assignments unchanged. It accepts the same Role schema as POST
        /authz2/v1/roles/. To modify the permissions a role grants, use PUT
        /authz2/v1/roles/{role_id}/scopes instead.


        **Key Fields / Request Body**


        name — the updated display name for the role


        description — the updated description for the role


        **Common Use Cases**


        Renaming a role after a team restructure or job function change


        Correcting a typo or clarifying a role description to make the role list
        more auditable


        **Best Practices**


        Notify any Enterprise Admins or automation that reference this role by
        name that it has been renamed — role_id is stable across renames but
        human-readable references in scripts or documentation are not


        Use GET /authz2/v1/roles/{role_id} to confirm the current name and
        description before updating


        **Workflow**


        Call GET /authz2/v1/roles/{role_id} to confirm the current role metadata


        PATCH to this endpoint with the updated name and/or description


        Confirm the changes in the returned RoleResponse
      operationId: UpdateRoleIdURL
      security:
        - esper_cloud_api_apiKey: []
      parameters:
        - $ref: '#/components/parameters/esper_cloud_api_RoleID'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/esper_cloud_api_Role'
      responses:
        '200':
          description: Request Succeded
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_RoleResponse'
        '400':
          description: Bad request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_GenericErrorResponse'
        '401':
          description: Unauthorized request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_GenericErrorResponse'
    delete:
      x-badges:
        - name: Stable
          color: green
      tags:
        - esper_cloud_api_Roles
      summary: Delete Role API
      description: >
        Permanently deletes a custom RBAC role from the tenant.


        Use this endpoint to remove a role that is no longer needed — all users
        currently assigned to it must be reassigned to a different role before
        deletion will succeed.


        **About Delete Role**


        Deleting a custom role removes it from the tenant permanently. Any users
        currently assigned to this role via AuthZ Role User must be reassigned
        to a different role before this endpoint can be called — attempting to
        delete a role with active user assignments will fail. Returns HTTP 204
        on success with no response body.


        **Key Parameters**


        role_id — the UUID of the role to delete; obtain from GET
        /authz2/v1/roles/


        **Common Use Cases**


        Removing a role that was created for a temporary project or team that no
        longer exists


        Cleaning up duplicate or incorrectly configured roles during an access
        audit


        **Best Practices**


        Before deleting, call GET /user/ and cross-reference
        profile.authz_role_id to identify any users still assigned to this role
        — you must reassign or remove them before deletion will succeed


        Confirm deletion success via the 204 response before removing the role
        from any internal documentation or automation


        **Workflow**


        Call GET /authz2/v1/roles/ to confirm the target role's role_id


        Call GET /user/ and cross-reference profile.authz_role_id to identify
        all users assigned to this role


        Call PUT /authz2/v1/users/{user_id} for each assigned user to reassign
        them to a different role


        Call DELETE /authz2/v1/roles/{role_id} once no users remain assigned to
        the role


        Confirm the 204 response indicating successful deletion
      operationId: DeleteRoleIdURL
      security:
        - esper_cloud_api_apiKey: []
      parameters:
        - $ref: '#/components/parameters/esper_cloud_api_RoleID'
      responses:
        '204':
          description: Deleted succesfully
        '400':
          description: Bad request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_GenericErrorResponse'
        '401':
          description: Unauthorized request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_GenericErrorResponse'
  /authz2/v1/roles/{role_id}/scopes:
    put:
      x-badges:
        - name: Stable
          color: green
      tags:
        - esper_cloud_api_Roles
      summary: Update Role Scopes API
      description: >
        Replaces the full set of permission scopes assigned to a custom RBAC
        role.


        Use this endpoint after creating a new role to add its initial scopes,
        or to update an existing role's permissions when access requirements
        change.


        **About Update Role Scopes**


        Scopes define the specific actions a custom role grants — such as
        reading device data, issuing commands, or managing groups. This endpoint
        performs a full replacement of a role's scope set; any scopes not
        included in the request will be removed. Scopes can be specified either
        by UUID (scope_ids) or by name string (scope_names). A newly created
        role has no scopes by default and must be populated via this endpoint
        before it grants meaningful access to assigned users.


        **Key Fields / Request Body**


        scope_ids — array of scope UUIDs to assign to the role


        scope_names — array of scope name strings to assign; valid values
        include read:device, read:group, read:blueprint, read:directory_record,
        and a range of create:device_command:* and create:group_command:* action
        scopes


        **Common Use Cases**


        Populating a newly created role with its initial permission set


        Expanding a role's permissions after a team's responsibilities grow


        Narrowing a role's permissions during an access review by replacing the
        scope set with a reduced list


        **Best Practices**


        Treat every call to this endpoint as a full replacement — always include
        the complete intended scope set, not just the scopes you want to add


        Use GET /authz2/v1/roles/{role_id}/scopes first to retrieve the current
        scope set before making changes, to avoid accidentally removing
        permissions


        Use scope_names rather than scope_ids in automation where possible —
        names are stable and human-readable, making scripts easier to maintain


        After updating scopes, verify the change took effect via GET
        /authz2/v1/roles/{role_id}/scopes


        **Workflow**


        Call GET /authz2/v1/roles/{role_id}/scopes to retrieve the current scope
        set


        Build the updated scope list, including all scopes that should remain
        plus any new additions


        PUT to this endpoint with the full intended scope set as scope_names or
        scope_ids


        Confirm the updated scopes via GET /authz2/v1/roles/{role_id}/scopes
      operationId: PutRoleScopeURL
      security:
        - esper_cloud_api_apiKey: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                scope_ids:
                  type: array
                  items:
                    type: string
                scope_names:
                  type: array
                  items:
                    type: string
                    enum:
                      - read:device
                      - read:group
                      - read:blueprint
                      - read:directory_record
                      - create:device_command:SET_DEVICE_LOCKDOWN_STATE
                      - create:device_command:REBOOT
                      - create:device_command:BEEP_DEVICE
                      - create:device_command:WIPE
                      - create:device_command:UPDATE_HEARTBEAT
                      - create:device_command:NOTIFY_DEVICE
                      - create:device_command:LOCK
                      - create:device_command:SET_KIOSK_APP
                      - update:device:group
                      - create:device:tag
                      - update:device:tag
                      - delete:device:tag
                      - update:device:alias
                      - create:template_upgrade
                      - create:device_command:SET_STREAM_VOLUME
                      - create:device_command:SET_BRIGHTNESS_SCALE
                      - create:device_command:SET_ROTATION_STATE
                      - create:device_command:SET_SCREEN_OFF_TIMEOUT
                      - create:device_command:SET_WALLPAPER
                      - create:device_command:SET_WIFI_STATE
                      - create:device_command:ADD_WIFI_AP
                      - create:device_command:REMOVE_WIFI_AP
                      - create:device_command:UPDATE_WIFI_AP
                      - create:device_command:SET_STATIC_IP
                      - create:device_command:SET_ETHERNET_SETTINGS
                      - create:device_command:SET_GPS_STATE
                      - create:device_command:SET_BLUETOOTH_STATE
                      - create:device_command:SET_TIMEZONE
                      - create:device_command:SET_ADB_STATE
                      - create:device_command:UPDATE_DEVICE_CONFIG
                      - create:device_command:UPDATE_BLUEPRINT
                      - create:device_command:SHUT_DOWN
                      - create:device_command:CLEAR_PASSCODE
                      - create:device_command:LOST_MODE
                      - read:device_app
                      - create:device_command:REFRESH_APPLIST
                      - create:device_command:INSTALL
                      - create:device_command:INSTALL_APP
                      - create:device_command:UNINSTALL
                      - create:device_command:UNINSTALL_APP
                      - create:device_command:SET_APP_STATE
                      - create:device_command:CLEAR_APP_DATA
                      - create:device_command:CLEAR_APP_CACHE
                      - create:device_command:SET_APP_PERMISSION
                      - create:device_command:REQUEST_BUGREPORT
                      - create:device_command:SET_NEW_POLICY
                      - create:group_command:SET_NEW_POLICY
                      - create:group
                      - create:group_command:REBOOT
                      - create:group_command:LOCK
                      - create:group_command:UPDATE_HEARTBEAT
                      - create:group_command:WIPE
                      - create:group_command:NOTIFY_DEVICE
                      - create:group_command:SET_KIOSK_APP
                      - create:group_command:SET_STREAM_VOLUME
                      - create:group_command:SET_BRIGHTNESS_SCALE
                      - create:group_command:SET_ROTATION_STATE
                      - create:group_command:SET_SCREEN_OFF_TIMEOUT
                      - create:group_command:SET_WALLPAPER
                      - create:group_command:SET_WIFI_STATE
                      - create:group_command:ADD_WIFI_AP
                      - create:group_command:REMOVE_WIFI_AP
                      - create:group_command:UPDATE_WIFI_AP
                      - create:group_command:SET_STATIC_IP
                      - create:group_command:SET_ETHERNET_SETTINGS
                      - create:group_command:SET_GPS_STATE
                      - create:group_command:SET_BLUETOOTH_STATE
                      - create:group_command:SET_TIMEZONE
                      - create:group_command:SET_ADB_STATE
                      - create:group_command:UPDATE_DEVICE_CONFIG
                      - create:group_command:UPDATE_BLUEPRINT
                      - create:group_command:INSTALL
                      - create:group_command:INSTALL_APP
                      - create:group_command:UNINSTALL
                      - create:group_command:UNINSTALL_APP
                      - create:group_command:SET_APP_STATE
                      - create:device_command:INITIATE_OFFER
                      - read:device_screenshot
                      - create:device_command:CAPTURE_SCREENSHOT
                      - create:device_screenshot
                      - read:device_graph
                      - read:event_feed
                      - create:blueprint
                      - update:blueprint
                      - delete:blueprint
                      - create:device_command:CONVERGE
                      - update:device:blueprint
                      - update:group:blueprint
                      - provision:device
                      - read:compliance_policy
                      - create:compliance_policy
                      - update:compliance_policy
                      - delete:compliance_policy
                      - read:provisioning_template
                      - create:provisioning_template
                      - update:provisioning_template
                      - delete:provisioning_template
                      - create:provisioning_template:imei_serial
                      - update:provisioning_template:imei_serial
                      - delete:provisioning_template:imei_serial
                      - update:provisioning_template:wifi_management
                      - read:app
                      - read:emm
                      - create:emm
                      - update:emm
                      - create:app:esper_android
                      - update:app:esper_android
                      - delete:app:esper_android
                      - read:alert
                      - read:pipeline
                      - read:geofence
                      - read:report
                      - create:report
                      - read:personal_access_token
                      - create:personal_access_token
                      - update:personal_access_token
                      - delete:personal_access_token
                      - read:foundation_build
                      - read:foundation_device_model
                      - update:foundation_build
                      - update:foundation_device_model
                      - read:foundry_event
                      - update:command
                      - read:user:group
                      - create:app:esper_ios
                      - update:app:esper_ios
                      - delete:app:esper_ios
                      - create:operation:CONVERGE
                      - create:operation:REBOOT
                      - create:operation:INSTALL
                      - create:operation:UNINSTALL
                      - create:operation:APP_INSTALL
                      - create:operation:APP_UNINSTALL
                      - read:operation
                      - update:operation
                      - read:operation:devices
                      - read:device:operations
                      - update:operation:devices
                      - create:device_command:RUN_SHELL_SCRIPT
                      - create:remote_terminal
                      - read:report:query
                      - create:report:query
                      - read:report:saved_query
                      - create:report:saved_query
                      - update:report:saved_query
                      - delete:report:saved_query
                      - create:device_command:REMOVE_DEVICE
                      - read:report:ingest
                      - create:report:ingest
                      - read:esper_apps
                      - create:device_command:RUN_CUSTOM_ACTION
                      - create:device_command:LIST_RESTRICTED_PROFILES
                      - create:device_command:LIST_PROVISIONING_PROFILES
                      - create:group_command:SYNC_CONTENT
                      - create:device_command:SYNC_CONTENT
      parameters:
        - $ref: '#/components/parameters/esper_cloud_api_RoleID'
      responses:
        '200':
          description: Request Succeded
          content:
            application/json:
              schema:
                type: object
                properties:
                  count:
                    type: integer
                  scopes:
                    type: array
                    items:
                      $ref: '#/components/schemas/esper_cloud_api_ScopeResponse'
        '400':
          description: Bad request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_GenericErrorResponse'
        '401':
          description: Unauthorized request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_GenericErrorResponse'
    get:
      x-badges:
        - name: Stable
          color: green
      tags:
        - esper_cloud_api_Roles
      summary: List Role Scopes API
      description: >
        Returns the permission scopes currently assigned to a specific custom
        RBAC role.


        Use this endpoint to inspect what actions a role grants before assigning
        it to a user, or to retrieve the current scope set before making
        updates.


        **About List Role Scopes**


        Each custom role in Esper has a set of scopes that define the actions
        users assigned to that role are permitted to perform — such as reading
        device data, issuing specific commands, or managing group membership.
        This endpoint returns those scopes as a scopes array alongside a count
        field. Results include each scope's UUID, name, description, and type.
        This is the reference endpoint to call before using PUT
        /authz2/v1/roles/{role_id}/scopes to modify a role's permissions.


        **Key Fields (Response)**


        id — the UUID of the scope; used with PUT
        /authz2/v1/roles/{role_id}/scopes when updating via scope_ids


        name — the scope name string (e.g., read:device,
        create:device_command:REBOOT)


        description — a human-readable description of what the scope permits


        scope_type — integer indicating the type of scope


        **Common Use Cases**


        Auditing what permissions a role grants before assigning it to a user


        Retrieving the current scope set as a baseline before updating it via
        PUT /authz2/v1/roles/{role_id}/scopes


        Verifying that a scope update was applied correctly after calling the
        update endpoint


        **Best Practices**


        Always call this endpoint before PUT /authz2/v1/roles/{role_id}/scopes —
        since that endpoint performs a full replacement, knowing the current set
        prevents accidental permission removal


        Use scope name values from the response to build human-readable access
        summaries for audit reports


        **Workflow**


        Call GET /authz2/v1/roles/{role_id}/scopes to retrieve all scopes
        currently assigned to the role


        Review the name and description of each scope to confirm the role's
        permission set


        Use the results as the baseline when preparing an update via PUT
        /authz2/v1/roles/{role_id}/scopes
      operationId: GetRoleScopeURL
      security:
        - esper_cloud_api_apiKey: []
      parameters:
        - $ref: '#/components/parameters/esper_cloud_api_RoleID'
      responses:
        '200':
          description: Request Succeded
          content:
            application/json:
              schema:
                type: object
                properties:
                  count:
                    type: integer
                  scopes:
                    type: array
                    items:
                      $ref: '#/components/schemas/esper_cloud_api_ScopeResponse'
        '400':
          description: Bad request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_GenericErrorResponse'
        '401':
          description: Unauthorized request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_GenericErrorResponse'
  /authn2/v0/personal-access-token/:
    post:
      x-badges:
        - name: Stable
          color: green
      tags:
        - esper_cloud_api_Personal Access Token
      summary: Generate a new personal access token
      description: >
        Generates a new personal access token (API key) for the authenticated
        user, scoped to the current tenant.

        Use this endpoint to create a named, expiry-controlled API key for
        programmatic access to the Esper API.


        **About Generate Personal Access Token**


        Personal access tokens are named, expiry-controlled API keys tied to a
        specific user and tenant. They replace the legacy developer app token
        system (see POST
        /v0/enterprise/{enterprise_id}/developerapp/{developerapp_id}/renew-token/,
        which is deprecated). Personal access tokens are scoped to the
        authenticated caller — this endpoint generates an API key for the user
        associated with the API key making the request, and cannot be used to
        create API keys on behalf of other users. The full API key value is
        returned only in the response to this create call — it is not
        retrievable again via the list endpoint, which returns only the key
        prefix. Store the API key value securely immediately after creation.


        **Key Fields / Request Body**


        name — (required) a human-readable label for the API key, used to
        identify it in the token list


        description — (required) a description of the API key's intended use


        expiry_at — (required) the expiry date as a Unix timestamp integer; set
        to -1 for a non-expiring API key


        **Key Fields (Response)**


        id — the UUID of the newly created token record; store this for use in
        renewal and deletion calls


        token — the full API key value; this is the only time it is returned —
        store it securely immediately


        prefix — a short prefix of the API key, used to identify it in future
        list responses


        expiry_at — the expiry timestamp as set in the request


        **Common Use Cases**


        Creating an API key for a CI/CD pipeline or automated script


        Generating a long-lived API key for an integration that cannot handle
        session-based authentication


        Issuing a dedicated API key for a specific integration or team member


        **Best Practices**


        Store the token value from the response immediately and securely — it
        cannot be retrieved again after this call


        Store the id alongside the API key value for future renewal or deletion
        via PUT and DELETE
        /authn2/v0/personal-access-token/{personal_access_token_id}


        Set a meaningful expiry_at value rather than using -1 (no expiry)
        wherever possible — expiring API keys reduce the blast radius of
        credential leaks


        Use distinct name and description values per API key to make the list
        endpoint actionable during audits


        **Workflow**


        POST to this endpoint with a name, description, and expiry_at


        Immediately store the returned token value and id securely


        Use the API key value in subsequent Esper API calls


        Track the expiry_at and renew via PUT
        /authn2/v0/personal-access-token/{personal_access_token_id} before
        expiry
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                name:
                  type: string
                  description: name for the token.
                description:
                  type: string
                  description: description for the token.
                expiry_at:
                  type: integer
                  description: exipy date for token.
              required:
                - name
                - description
                - expiry_at
      responses:
        '200':
          description: Token successfully generated
          content:
            application/json:
              schema:
                $ref: >-
                  #/components/schemas/esper_cloud_api_PersonalAccessTokenCreateResponse
        '400':
          description: Bad request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_GenericErrorResponse'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_GenericErrorResponse'
    get:
      x-badges:
        - name: Stable
          color: green
      tags:
        - esper_cloud_api_Personal Access Token
      summary: Get tokens for corresponding user and tenant
      description: >
        Returns the full list of tokens for the current user and tenant. Tokens
        are scoped to the authenticated caller. This endpoint only returns
        tokens belonging to the user associated with the API key making the
        request, not tokens for other users in the tenant. Use this endpoint to
        locate the id of a specific token for use with the renew (PUT) or delete
        (DELETE) endpoints.


        Use this endpoint to audit active API keys, identify keys approaching
        expiry, or retrieve token IDs for renewal or deletion.


        **About Get Personal Access Tokens**


        Returns the full list of personal access tokens for the current user and
        tenant. Personal access tokens are scoped to the authenticated caller.
        This endpoint only returns API keys belonging to the user associated
        with the API key making the request, not those belonging to other users
        in the tenant. Use this endpoint to locate the id of a specific token
        for use with the renew (PUT) or delete (DELETE) endpoints.


        **Key Fields (Response)**


        id — the UUID of the token record; use with PUT and DELETE
        /authn2/v0/personal-access-token/{personal_access_token_id}


        name — the human-readable label assigned at creation


        description — the description assigned at creation


        prefix — a short prefix of the API key; use this to identify which key
        corresponds to a known credential without exposing the secret


        expiry_at — the expiry as a Unix timestamp; -1 indicates no expiry


        created_at / updated_at — timestamps for the token record


        legacy_token_id / legacy_developer_app_id — references to the legacy
        token system, if applicable


        **Common Use Cases**


        Auditing which API keys are active for the current user


        Identifying API keys approaching expiry so they can be renewed before
        they stop working


        Retrieving the id of a specific token for renewal or deletion when the
        ID was not stored at creation time


        **Best Practices**


        Use prefix values to match list entries to known API keys in your
        secrets store — the full key value is never returned here


        Regularly review expiry_at values and renew any API keys that will
        expire before your next maintenance window


        Treat any token with a legacy_token_id as a migration candidate —
        consider replacing it with a new personal access token and retiring the
        legacy credential


        **Workflow**


        Call GET /authn2/v0/personal-access-token/ to retrieve all API keys for
        the current user


        Identify the target token by name, prefix, or expiry_at


        Use the token id with PUT
        .../personal-access-token/{personal_access_token_id} to renew, or DELETE
        to revoke
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: >-
                  #/components/schemas/esper_cloud_api_PersonalAccessTokenGetResponse
        '400':
          description: Bad request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_GenericErrorResponse'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_GenericErrorResponse'
  /authn2/v0/personal-access-token/{personal_access_token_id}:
    put:
      x-badges:
        - name: Stable
          color: green
      tags:
        - esper_cloud_api_Personal Access Token
      summary: Renew personal access token
      description: >
        Renews a personal access token by updating its expiry date.


        Use this endpoint to extend the validity of an existing API key before
        it expires, without needing to generate a new key and update credentials
        in all systems that use it.


        **About Renew Personal Access Token**


        Personal access tokens are API keys with an expiry date set at creation.
        This endpoint extends the expiry in place — the API key value itself
        does not change, only the expiry_at timestamp is updated. Personal
        access tokens are scoped to the authenticated caller — only API keys
        belonging to the user associated with the API key making the request can
        be renewed; those belonging to other users cannot be managed here. The
        API key value is returned in the response. API keys created with
        expiry_at: -1 (no expiry) can also be updated to add an expiry via this
        endpoint.


        **Key Fields / Request Body**


        expiry_at — (required) the new expiry date as a Unix timestamp integer;
        set to -1 for no expiry


        **Key Fields (Response)**


        id — the UUID of the token record


        token — the API key value (unchanged); returned here for convenience


        expiry_at — the updated expiry timestamp as set in the request


        updated_at — timestamp confirming when the renewal was applied


        **Common Use Cases**


        Extending an API key's validity before it expires to avoid service
        interruption in automated integrations


        Converting an API key from a fixed expiry to no expiry (or vice versa)
        by updating expiry_at


        Renewing an API key as part of a scheduled credential rotation policy


        **Best Practices**


        Use GET /authn2/v0/personal-access-token/ to retrieve the
        personal_access_token_id if it was not stored at creation time — match
        by name or prefix


        Renew API keys before they expire rather than after — a lapsed key will
        cause API calls to fail until renewed or replaced


        Keep a record of each API key's expiry_at in your secrets management
        system so renewals can be scheduled proactively


        **Workflow**


        Call GET /authn2/v0/personal-access-token/ to identify the target token
        and retrieve its id if needed


        PUT to this endpoint with the new expiry_at value


        Confirm the updated expiry_at in the response
      parameters:
        - $ref: '#/components/parameters/esper_cloud_api_PersonalAccessTokenID'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                expiry_at:
                  type: integer
                  description: exipy date for token.
              required:
                - expiry_at
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: >-
                  #/components/schemas/esper_cloud_api_PersonalAccessTokenUpdateResponse
        '400':
          description: Bad request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_GenericErrorResponse'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_GenericErrorResponse'
    delete:
      x-badges:
        - name: Stable
          color: green
      tags:
        - esper_cloud_api_Personal Access Token
      summary: Delete personal access token
      description: >
        Permanently revokes a personal access token (API key), immediately
        invalidating any API calls that use it.


        Use this endpoint to decommission an API key that is no longer needed,
        has been compromised, or belongs to a user who is leaving the
        organization.


        **About Delete Personal Access Token**


        Deleting a personal access token permanently revokes the API key — any
        integration or script using it will receive authentication errors on its
        next call. Personal access tokens are scoped to the authenticated caller
        — only API keys belonging to the user associated with the API key making
        the request can be deleted; those belonging to other users cannot be
        managed here. Deletion is immediate with no grace period. Returns HTTP
        204 on success with no response body. If an API key needs to be replaced
        rather than simply revoked, generate a new one via POST
        /authn2/v0/personal-access-token/ and update all dependent systems
        before deleting the old key.

        **Key Parameters**


        personal_access_token_id — the UUID of the token record to revoke;
        obtain from GET /authn2/v0/personal-access-token/


        **Common Use Cases**


        Revoking an API key that may have been exposed or compromised


        Decommissioning an API key used by a departing team member or retired
        integration


        Cleaning up unused or expired API keys during a credential audit


        **Best Practices**


        If the API key is in active use, generate and deploy a replacement via
        POST /authn2/v0/personal-access-token/ before deleting the old one to
        avoid service interruption


        Use GET /authn2/v0/personal-access-token/ to confirm the correct
        personal_access_token_id by matching on name or prefix before deleting —
        revocation is immediate and irreversible


        Confirm the 204 response before notifying stakeholders that the API key
        has been revoked


        **Workflow**


        Call GET /authn2/v0/personal-access-token/ to identify the target token
        and retrieve its id


        If the API key is in active use, generate and deploy a replacement first


        Call DELETE /authn2/v0/personal-access-token/{personal_access_token_id}


        Confirm the 204 response indicating successful revocation
      parameters:
        - $ref: '#/components/parameters/esper_cloud_api_PersonalAccessTokenID'
      responses:
        '204':
          description: OK
        '400':
          description: Bad request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_GenericErrorResponse'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_GenericErrorResponse'
  /authn2/v1/users/:
    get:
      x-badges:
        - name: Stable
          color: green
      tags:
        - esper_cloud_api_User
      summary: Get Users details
      description: >
        Retrieves the list of users belonging to the tenant.


        Returns each user's UsersListResponse record, including their
        UUID-format user_id, email, name, and the connection they authenticated
        through. Optionally filter by a legacy integer user ID for
        cross-referencing against older user records.


        **About Get Users**


        This is the current, supported endpoint for listing users in a tenant,
        and it returns the UUID-format identifier (user_id) needed for other
        user-management endpoints such as Update User Role, which requires an
        authn_user_id in UUID format. This UUID is distinct from the integer id
        returned by the older GET /user/ endpoint; use this endpoint whenever a
        downstream call requires the UUID form.


        **Key Fields / Query Parameters**


        legacy_user_id — an optional integer filter for cross-referencing
        against the older, integer-based user id from GET /user/


        **Common Use Cases**


        Retrieving a user's UUID before calling Update User Role or another
        endpoint that requires authn_user_id


        Auditing the full list of users in a tenant along with their email and
        connection


        Cross-referencing a legacy integer user id against its corresponding
        UUID


        **Best Practices**


        Always retrieve the UUID form of a user's id from this endpoint before
        calling endpoints that require authn_user_id, rather than assuming the
        integer id from GET /user/ will work


        Use legacy_user_id when migrating scripts that were written against the
        older integer-based user id


        **Workflow**


        Call this endpoint to list users, optionally filtering by legacy_user_id


        Capture the user_id (UUID) for the target user


        Use that UUID in downstream calls such as Update User Role

        This endpoint allows to fetch user list of a tenant
      parameters:
        - $ref: '#/components/parameters/esper_cloud_api_LegacyUserID'
      responses:
        '200':
          description: Users fetched successfully.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_UsersListResponse'
        '400':
          description: Bad request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_GenericErrorResponse'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/esper_cloud_api_GenericErrorResponse'
  /v2/blueprints/:
    get:
      x-badges:
        - name: Stable
          color: green
      tags:
        - blueprints_Blueprints API
      description: >
        Retrieves a paginated list of all Blueprint V2 blueprints in the
        enterprise, with optional filtering and sorting.

        Returns an array of BlueprintV2 objects matching the provided filters;
        supports filtering by name (case-insensitive or exact), by app or app
        version IDs across Android, iOS, and Windows, by file or Wi-Fi network
        references, and by iOS provisioning profile. Results can be ordered by
        any supported field using the ordering parameter.


        **About List Blueprints (V2)**


        Blueprints in Esper define the desired state for managed devices —
        grouping app assignments, device settings, policies, and content into a
        reusable configuration template. Blueprint V2 is the current, supported
        version of the blueprint system; Blueprint V1 is deprecated. This
        endpoint lists all blueprints scoped to the enterprise, enabling
        integrators to build UIs, trigger automated deployments, or audit which
        blueprints reference a given app, file, or network configuration.


        **Key Fields / Query Parameters**


        name — Filter by blueprint name, case-insensitive partial match


        name_exact — Filter by exact name, case-sensitive


        ordering — Sort results by a field (prefix with - for descending);
        combine multiple fields with commas (e.g., -created_at,-updated_at)


        settings__android__app_id — Filter to blueprints that include a specific
        Android app (by Esper app UUID)


        settings__android__app_version_id — Filter to blueprints that include a
        specific Android app version


        settings__ios__app_id / settings__ios__app_version_id — Same as above
        for iOS apps


        settings__windows__app_id / settings__windows__app_version_id — Same as
        above for Windows apps


        settings__android__file_id — Filter to blueprints that reference a
        specific managed file


        settings__android__wifi_network_id — Filter to blueprints that include a
        specific Wi-Fi network profile


        settings__ios__provisioning_profile_id /
        settings__ios__provisioning_profile_version_id — Filter by iOS
        provisioning profile or profile version


        **Common Use Cases**


        Listing all blueprints to populate a blueprint selection UI or dashboard


        Finding which blueprints reference a specific app version before pushing
        an update or deprecating a version


        Auditing all blueprints that use a particular Wi-Fi network or managed
        file


        Retrieving all iOS blueprints that include a specific provisioning
        profile


        **Best Practices**


        Use settings__* filter parameters when tracing blueprint dependencies on
        a specific resource — this is faster than fetching all blueprints and
        filtering client-side


        Use name for fuzzy search and name_exact when integrating with systems
        that require precise name matching


        Paginate results using next and previous links in the response for large
        blueprint libraries


        **Workflow**


        Call GET /api/v2/blueprints/ with any relevant filter parameters


        Inspect the count field in the response to determine if pagination is
        needed


        Iterate through next links to retrieve subsequent pages if next is
        non-null
      parameters:
        - in: query
          name: ordering
          schema:
            type: string
          description: >
            Order the results by a specific field (-field for descending order),
            Combine Multiple with , like -created_at,-updated_at.
        - in: query
          name: name
          schema:
            type: string
          description: |
            Filter the results by name, case insensitive
        - in: query
          name: name_exact
          schema:
            type: string
          description: |
            Filter the results by name, case sensitive and matches exact name
        - in: query
          name: settings__android__app_id
          schema:
            type: string
            format: uuid
          description: >
            List the blueprints which have given app_id in any of the versions
            for android apps.
        - in: query
          name: settings__android__app_version_id
          schema:
            type: string
            format: uuid
          description: >
            List the blueprints which have given app_version_id in any of the
            versions for android apps.
        - in: query
          name: settings__ios__app_id
          schema:
            type: string
            format: uuid
          description: >
            List the blueprints which have given app_id in any of the versions
            for ios apps.
        - in: query
          name: settings__ios__app_version_id
          schema:
            type: string
            format: uuid
          description: >
            List the blueprints which have given app_version_id in any of the
            versions for ios apps.
        - in: query
          name: settings__windows__app_id
          schema:
            type: string
            format: uuid
          description: >
            List the blueprints which have given app_id in any of the versions
            for windows apps.
        - in: query
          name: settings__windows__app_version_id
          schema:
            type: string
            format: uuid
          description: >
            List the blueprints which have given app_version_id in any of the
            versions for windows apps.
        - in: query
          name: settings__android__file_id
          schema:
            type: string
            format: uuid
          description: |
            List the blueprints which have given file_id in any of the versions.
        - in: query
          name: settings__android__wifi_network_id
          schema:
            type: string
            format: uuid
          description: >
            List the blueprints which have given wifi_network_id in any of the
            versions.
        - in: query
          name: settings__ios__provisioning_profile_id
          schema:
            type: string
            format: uuid
          description: >
            Filter blueprints that have the given provisioning profile ID in any
            version.
        - in: query
          name: settings__ios__provisioning_profile_version_id
          schema:
            type: string
            format: uuid
          description: >
            Filter blueprints that have the given provisioning profile version
            ID in any version.
        - in: query
          name: settings__tvos__app_id
          schema:
            type: string
            format: uuid
          description: >
            List the blueprints which have given app_id in any of the versions
            for tvos apps.
        - in: query
          name: settings__tvos__app_version_id
          schema:
            type: string
            format: uuid
          description: >
            List the blueprints which have given app_version_id in any of the
            versions for tvos apps.
        - in: query
          name: settings__tvos__provisioning_profile_id
          schema:
            type: string
            format: uuid
          description: >
            Filter blueprints that have the given provisioning profile ID in any
            version for tvos.
        - in: query
          name: settings__tvos__provisioning_profile_version_id
          schema:
            type: string
            format: uuid
          description: >
            Filter blueprints that have the given provisioning profile version
            ID in any version for tvos.
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                type: object
                properties:
                  content:
                    type: object
                    properties:
                      count:
                        type: integer
                        format: int64
                        description: The number of objects in the result set
                      next:
                        type: string
                        description: >-
                          The link to retrieve the next set of objects in the
                          result set
                      previous:
                        type: string
                        description: >-
                          The link to retrieve the previous set of objects in
                          the result set
                      results:
                        type: array
                        items:
                          $ref: '#/components/schemas/blueprints_BlueprintV2'
                      message:
                        type: string
                      code:
                        type: integer
    post:
      x-badges:
        - name: Stable
          color: green
      tags:
        - blueprints_Blueprints API
      description: >
        Creates a new blueprint in the enterprise. Blueprints define device
        configuration and management rules (for example, kiosk/device mode
        settings, app/file payloads, Wi-Fi networks, and OS-specific
        restrictions). After you create a blueprint, you can publish versions
        and then assign/apply it to devices through separate workflows. Creating
        a blueprint doesn’t affect devices by itself. Devices won’t change until
        the blueprint (and typically a specific version) is assigned/applied via
        a separate endpoint/workflow. Because the create response is
        list-shaped, you should read the new blueprint ID from
        content.results[0].id. If your workflow relies on versioning, capture
        both the blueprint id and the returned version_id (if present in your
        create response), since later calls may require one or the other.
        Workflow: After creating a bluerprint, assign a device or group to it
        using POST https://{foo}-api.esper.cloud/api/v2/converge
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/blueprints_BlueprintV2'
      responses:
        '201':
          description: Success
          content:
            application/json:
              schema:
                type: object
                properties:
                  content:
                    $ref: '#/components/schemas/blueprints_BlueprintV2'
                  message:
                    type: string
                  code:
                    type: integer
                    enum:
                      - 201
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                type: object
                properties:
                  content:
                    type: string
                  message:
                    type: string
                  code:
                    type: integer
                    enum:
                      - 400
  /v2/blueprints/{blueprint_id}/:
    get:
      x-badges:
        - name: Stable
          color: green
      tags:
        - blueprints_Blueprints API
      description: >
        Retrieves the full configuration for a single blueprint by its ID.


        Returns the BlueprintV2 object representing the blueprint's current
        configuration and metadata. This does not return version-specific
        settings on its own; use the versions endpoints to retrieve a specific
        published version's configuration.


        **About Get Blueprint**


        Blueprints define device configuration and management rules, including
        kiosk and device mode settings, app and file payloads, Wi-Fi networks,
        and OS-specific restrictions. This endpoint returns the blueprint record
        itself; the actual configuration a device receives comes from a specific
        version of the blueprint, retrieved separately through the versions
        endpoints. Blueprint V2 is the current version of this system and should
        be used for all new integrations; Blueprint V1 (the older
        devicegroup-scoped blueprint endpoints) is deprecated.


        **Common Use Cases**


        Looking up a blueprint's current metadata before publishing a new
        version


        Confirming a blueprint exists and is accessible before assigning it to a
        device or group through Converge


        **Best Practices**


        Use the returned id together with the versions endpoints to retrieve the
        specific configuration a device will receive


        Treat a 404 response as meaning the blueprint_id does not exist or was
        deleted, not as a transient error


        **Workflow**


        Obtain the blueprint_id from a blueprint list or from POST
        /v2/blueprints/


        Call this endpoint to retrieve the blueprint record


        Call GET /v2/blueprints/{blueprint_id}/versions/ to see its published
        versions
      parameters:
        - in: path
          name: blueprint_id
          required: true
          schema:
            type: string
            format: uuid
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                type: object
                properties:
                  content:
                    $ref: '#/components/schemas/blueprints_BlueprintV2'
                  message:
                    type: string
                  code:
                    type: integer
                    enum:
                      - 201
        '404':
          description: Content not found
          content:
            application/json:
              schema:
                type: object
                properties:
                  content:
                    type: object
                  message:
                    type: string
                  code:
                    type: integer
                    enum:
                      - 404
    put:
      x-badges:
        - name: Stable
          color: green
      tags:
        - blueprints_Blueprints API
      description: >
        Updates a blueprint's top-level record by ID.


        This performs a full replacement of the blueprint's editable fields
        using the BlueprintV2Put schema. It updates the blueprint record itself,
        not a specific version; to change the configuration devices actually
        receive, publish a new version instead.


        **About Update Blueprint**

        Because Converge applies a specific version rather than the blueprint
        record directly, updating the blueprint itself is typically limited to
        metadata-level changes rather than configuration changes. If the goal is
        to change what devices receive (apps, files, restrictions, and so on),
        the correct approach is to create a new blueprint version rather than
        editing the existing blueprint record.


        **Common Use Cases**


        Renaming a blueprint or updating its top-level metadata


        Correcting a blueprint record without affecting any of its published
        versions


        **Best Practices**


        Confirm whether the change belongs on the blueprint record or on a new
        version before calling this endpoint; device-facing configuration
        changes belong on a version


        Provide the full set of editable fields in the request body, since this
        is a full replacement rather than a partial update


        **Workflow**


        Call GET /v2/blueprints/{blueprint_id}/ to review the current record


        Prepare the full BlueprintV2Put payload with the updated fields


        PUT to this endpoint to apply the update


        Confirm the change with a follow-up GET
      parameters:
        - in: path
          name: blueprint_id
          required: true
          schema:
            type: string
            format: uuid
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/blueprints_BlueprintV2Put'
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                type: object
                properties:
                  content:
                    $ref: '#/components/schemas/blueprints_BlueprintV2'
                  message:
                    type: string
                  code:
                    type: string
                    enum:
                      - 201
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                type: object
                properties:
                  content:
                    type: string
                  message:
                    type: string
                  code:
                    type: string
                    enum:
                      - 3456
        '404':
          description: Resource not found
          content:
            application/json:
              schema:
                type: object
                properties:
                  content:
                    type: object
                  message:
                    type: string
                  code:
                    type: string
                    enum:
                      - 3456
    delete:
      x-badges:
        - name: Stable
          color: green
      tags:
        - blueprints_Blueprints API
      description: Delete a blueprint by ID
      parameters:
        - in: path
          name: blueprint_id
          required: true
          schema:
            type: string
            format: uuid
      responses:
        '204':
          description: Success
          content:
            application/json:
              schema:
                type: object
                properties:
                  content:
                    $ref: '#/components/schemas/blueprints_BlueprintV2'
                  message:
                    type: string
                  code:
                    type: string
                    enum:
                      - 201
        '404':
          description: Resource not found
          content:
            application/json:
              schema:
                type: object
                properties:
                  content:
                    type: object
                  message:
                    type: string
                  code:
                    type: string
                    enum:
                      - 201
  /v2/blueprints/{blueprint_id}/versions/:
    get:
      x-badges:
        - name: Stable
          color: green
      tags:
        - blueprints_Blueprints API
      description: >
        Retrieves a paginated list of every version created for a specific
        blueprint.


        Each blueprint can have multiple versions as its configuration evolves
        over time; this endpoint returns them all, with filters available for
        version number, publish status, and specific apps, files, or Wi-Fi
        networks referenced within a version's settings.


        **About Blueprint Versions**


        A blueprint's actual device configuration lives on its versions, not on
        the blueprint record itself. Versions let you iterate on a blueprint's
        settings (apps, files, restrictions, and so on) while keeping a history
        of what changed and when. Devices are converged to a specific
        blueprint_version_id, not just a blueprint_id, so this endpoint is the
        standard way to find the version currently in use or the version you
        intend to publish next.


        **Key Fields / Query Parameters**


        version_number — filters results to a specific version number


        publish — filters by publish status


        settings__android__app_id — returns versions that include the given app
        in their settings


        ordering — orders results by one or more fields such as version_number
        or minor_version_number; prefix a field with a minus sign to reverse
        order, combine multiple fields with a comma


        **Common Use Cases**


        Finding the latest published version of a blueprint before converging
        devices to it


        Auditing how a blueprint's app or Wi-Fi network settings have changed
        across versions


        Confirming which blueprint versions reference a specific app before
        removing that app from the tenant


        **Best Practices**


        Filter by publish to distinguish draft versions from versions that are
        live and available for Converge


        Use the settings__android__app_id and similar filters to find every
        version affected before making a breaking change to a shared resource


        **Workflow**


        Call this endpoint with the blueprint_id to list its versions


        Identify the version_id of the version you need, typically the latest
        published one


        Call GET /v2/blueprints/{blueprint_id}/versions/{version_id}/ for that
        version's full settings


        Use the version_id in a Converge request to apply it to devices
      parameters:
        - in: path
          name: blueprint_id
          required: true
          schema:
            type: string
            format: uuid
        - in: query
          name: ordering
          schema:
            type: string
          description: >
            Order the results by a specific field (-field for descending order),
            Combine Multiple with , like -version_number,-minor_version_number.
        - in: query
          name: version_number
          schema:
            type: string
          description: |
            Filter the results by version_number
        - in: query
          name: publish
          schema:
            type: string
          description: |
            Filter the results by publish
        - in: query
          name: settings__android__app_id
          schema:
            type: string
            format: uuid
          description: |
            List the versions which have given app_id.
        - in: query
          name: settings__android__app_version_id
          schema:
            type: string
            format: uuid
          description: |
            List the versions which have given app_version_id.
        - in: query
          name: settings__android__file_id
          schema:
            type: string
            format: uuid
          description: |
            List the blueprints which have given file_id.
        - in: query
          name: settings__android__wifi_network_id
          schema:
            type: string
            format: uuid
          description: |
            List the blueprints which have given wifi_network_id.
        - in: query
          name: settings__ios__provisioning_profile_id
          schema:
            type: string
            format: uuid
          description: |
            Filter versions that have the given provisioning profile ID for iOS.
        - in: query
          name: settings__ios__provisioning_profile_version_id
          schema:
            type: string
            format: uuid
          description: >
            Filter versions that have the given provisioning profile version ID
            for iOS.
        - in: query
          name: settings__tvos__provisioning_profile_id
          schema:
            type: string
            format: uuid
          description: >
            Filter versions that have the given provisioning profile ID for
            tvos.
        - in: query
          name: settings__tvos__provisioning_profile_version_id
          schema:
            type: string
            format: uuid
          description: >
            Filter versions that have the given provisioning profile version ID
            for tvos.
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                type: object
                properties:
                  content:
                    type: object
                    properties:
                      count:
                        type: integer
                        format: int64
                        description: The number of objects in the result set
                      next:
                        type: string
                        description: >-
                          The link to retrieve the next set of objects in the
                          result set
                      previous:
                        type: string
                        description: >-
                          The link to retrieve the previous set of objects in
                          the result set
                      results:
                        type: array
                        items:
                          $ref: '#/components/schemas/blueprints_BlueprintV2'
                      message:
                        type: string
                      code:
                        type: integer
  /v2/blueprints/{blueprint_id}/versions/{version_id}/:
    get:
      x-badges:
        - name: Stable
          color: green
      tags:
        - blueprints_Blueprints API
      description: >
        Retrieves the full configuration for a single, specific version of a
        blueprint.


        Returns the complete settings payload for the given version_id,
        including whatever apps, files, Wi-Fi networks, and platform-specific
        restrictions were defined at that point in the blueprint's history.


        **About Get Blueprint Version**

        This is the endpoint that returns the actual configuration a device
        receives when converged to a blueprint, since Converge applies a
        specific blueprint_version_id rather than just a blueprint_id. Use it to
        inspect exactly what a version will change on a device before rolling it
        out broadly.


        **Common Use Cases**


        Reviewing a version's full settings before using it in a Converge action


        Comparing two versions of the same blueprint to understand what changed
        between them


        **Best Practices**


        Always confirm the version_id belongs to the expected blueprint_id,
        since version IDs are not unique across blueprints in isolation


        Review a version's settings in full before converging a large device
        group to it, since Converge applies the configuration broadly and does
        not offer a partial rollback


        **Workflow**


        Call GET /v2/blueprints/{blueprint_id}/versions/ to find the version_id
        you need


        Call this endpoint with both blueprint_id and version_id to retrieve the
        full settings


        Use the blueprint_id and blueprint_version_id together in a POST to
        /v2/converge to apply this version to a device
      parameters:
        - in: path
          name: blueprint_id
          required: true
          schema:
            type: string
            format: uuid
        - in: path
          name: version_id
          required: true
          schema:
            type: string
            format: uuid
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                type: object
                properties:
                  content:
                    $ref: '#/components/schemas/blueprints_BlueprintV2'
                  message:
                    type: string
                  code:
                    type: string
                    enum:
                      - 201
        '404':
          description: Resouce not found
          content:
            application/json:
              schema:
                type: object
                properties:
                  content:
                    type: object
                  message:
                    type: string
                  code:
                    type: string
                    enum:
                      - 201
  /v2/custom-actions/:
    get:
      x-badges:
        - name: Stable
          color: green
      tags:
        - blueprints_Custom Actions API
      description: >
        ⚠️ Linux only. Custom actions apply exclusively to Linux-managed
        devices. This endpoint is not applicable to Android, iOS, or Windows
        devices.


        Retrieves all custom actions defined for the tenant.

        Returns a list of CustomActionRead objects representing every custom
        action in the tenant, including their name, type, state, position
        settings, options, and audit metadata. Supports ordering to control the
        sort order of results. Use this endpoint to enumerate available custom
        actions before assigning them to a Blueprint or deploying them to Linux
        devices.


        **About Custom Actions**


        Custom actions allow operators to define custom scripts and commands
        that can be surfaced on Linux devices, either within a Blueprint's
        settings sections or as device Quick Actions. Each custom action has a
        type (button, toggle, radio, or dropdown), a state (draft, active, or
        inactive), and one or more options, each of which contains a Linux
        platform script. Only active custom actions can be deployed to devices.
        Custom actions are managed separately from blueprints but referenced
        within Blueprint settings via position_in_blueprints.


        **Key Query Parameters**


        ordering — Sort results by a specified field; prefix with - for
        descending order (e.g., -created_at for newest first)


        **Common Use Cases**


        List all custom actions before deciding which to include in a Blueprint
        V2 configuration


        Audit the state of all custom actions to identify which are active vs.
        draft or inactive


        Retrieve id values for use in subsequent GET, PUT, or DELETE calls on
        specific custom actions


        **Best Practices**


        Filter mentally by state in your integration logic: only active custom
        actions can be deployed to devices; drafts are not eligible


        Use ordering=-created_at to surface recently created or modified actions
        first


        Pair with GET /v2/custom-actions/{custom_action_id}/ when you need the
        full option and script payload for a specific action


        **Workflow**


        Call GET /v2/custom-actions/ to retrieve the full list of tenant custom
        actions


        Review the state and position_in_blueprints fields to identify which
        actions are deployment-ready


        Use the returned id values to fetch, update, or delete individual custom
        actions as needed
      parameters:
        - in: query
          name: ordering
          schema:
            type: string
          description: >
            Order the results by a specific field (-field for descending order).
            Valid fields are 'name', 'created_at', 'updated_at', 'created_by',
            'updated_by'.
        - in: query
          name: name
          schema:
            type: string
          description: |
            Filter the results by name (partial match, case insensitive).
        - in: query
          name: type
          schema:
            type: string
          description: >
            Filter by action type. Comma-separated list. Valid values: button,
            toggle, radio, dropdown.
        - in: query
          name: state
          schema:
            type: string
          description: >
            Filter by action state. Comma-separated list. Valid values: draft,
            active, inactive.
        - in: query
          name: position_in_blueprints
          schema:
            type: string
          description: >
            Filter by blueprint position. Comma-separated list. Valid values:
            none, blueprints_apps_and_configuration, blueprints_connectivity,
            blueprints_device_security, blueprints_display_and_branding,
            blueprints_esper_settings, blueprints_scripts, blueprints_files,
            blueprints_platform_services, blueprints_hardware_settings,
            blueprints_sound, blueprints_system_updates,
            blueprints_time_and_date.
        - in: query
          name: position_in_device_settings
          schema:
            type: string
          description: >
            Filter by device settings position. Comma-separated list. Valid
            values: none, device_quick_settings.
        - in: query
          name: created_by
          schema:
            type: integer
          description: |
            Filter by user ID who created the action.
        - in: query
          name: updated_by
          schema:
            type: integer
          description: |
            Filter by user ID who last updated the action.
        - in: query
          name: limit
          schema:
            type: integer
            minimum: 1
            maximum: 100
            default: 10
          description: |
            Number of results to return per page.
        - in: query
          name: offset
          schema:
            type: integer
            minimum: 0
            default: 0
          description: |
            The initial index from which to return the results.
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                type: object
                properties:
                  content:
                    type: object
                    properties:
                      count:
                        type: integer
                        format: int64
                        description: The total number of custom actions
                      next:
                        type: string
                        nullable: true
                        description: >-
                          The link to retrieve the next set of objects in the
                          result set
                      previous:
                        type: string
                        nullable: true
                        description: >-
                          The link to retrieve the previous set of objects in
                          the result set
                      results:
                        type: array
                        items:
                          $ref: '#/components/schemas/blueprints_CustomActionRead'
                  message:
                    type: string
                  code:
                    type: integer
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                type: object
                properties:
                  errors:
                    type: array
                    items:
                      type: string
                  message:
                    type: string
                  code:
                    type: integer
                    enum:
                      - 400
    post:
      x-badges:
        - name: Stable
          color: green
      tags:
        - blueprints_Custom Actions API
      description: >
        ⚠️ Linux only. Custom actions apply exclusively to Linux-managed
        devices. This endpoint is not applicable to Android, iOS, or Windows
        devices.


        Creates a new custom action for the tenant.


        Accepts a CustomActionCreate body defining the action's name, UI
        component type, lifecycle state, blueprint and device placement, display
        properties, and one or more options — each option containing a Linux
        platform script with its interpreter. Returns the created
        CustomActionRead object on success. Returns 409 if a custom action with
        the same name already exists.


        **About Create Custom Action**


        Custom actions are operator-defined interactive controls that execute
        scripts on Linux devices. When created, a custom action is placed in a
        specified section of a Blueprint V2 (via position_in_blueprints) and/or
        surfaced in the device's Quick Actions panel (via
        position_in_device_settings). Each option within the action maps a UI
        label to a script that runs on the device when the user triggers that
        option. Only active custom actions are eligible for deployment; new
        actions can be created in draft state for review before activation.


        **Key Fields**


        name — Unique display name for the custom action (1–50 characters; must
        be unique within the tenant)


        type — UI component type: button, toggle, radio, or dropdown


        state — Lifecycle state: draft, active, or inactive; only active actions
        can be deployed


        position_in_blueprints — The Blueprint section where this action will
        appear (e.g., blueprints_scripts, blueprints_apps_and_configuration, or
        none)


        position_in_device_settings — Device-side placement:
        device_quick_settings or none


        properties — Object containing description, info_message, and
        tooltip_message for the UI


        options — Array of option objects, each with a label, a unique key UUID,
        and a scripts.linux object containing script (the script content) and
        interpreter (e.g., bash, python3; defaults to bash)


        **Common Use Cases**


        Create a button-type action that runs a diagnostic script on Linux
        devices from the Blueprint settings


        Define a toggle-type action that enables or disables a system feature
        via a shell script


        Build a dropdown-type action with multiple options, each mapping to a
        different script


        **Best Practices**


        Create custom actions in draft state first; activate them only after
        validating the script logic


        Ensure name is unique within the tenant — the API returns 409 on
        conflict


        Provide meaningful label values in each option so device operators can
        identify which script they are triggering


        Specify the interpreter explicitly (e.g., python3) rather than relying
        on the bash default when your script requires a different runtime


        **Workflow**


        Design your script content and identify which Blueprint section or Quick
        Actions position the action should occupy


        Build the CustomActionCreate payload: set name, type, state: "draft",
        positions, properties, and options with embedded scripts


        Submit POST /v2/custom-actions/


        Capture the returned id and options[*].scripts.linux.script_id for
        future reference


        When ready, update the action to state: "active" via PUT
        /v2/custom-actions/{custom_action_id}/ to make it deployable
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/blueprints_CustomActionCreate'
      responses:
        '201':
          description: Success
          content:
            application/json:
              schema:
                type: object
                properties:
                  content:
                    $ref: '#/components/schemas/blueprints_CustomActionRead'
                  message:
                    type: string
                  code:
                    type: integer
                    enum:
                      - 201
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                type: object
                properties:
                  errors:
                    type: array
                    items:
                      type: object
                  message:
                    type: string
                  code:
                    type: integer
                    enum:
                      - 400
        '409':
          description: Conflict - Custom Action name already exists
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                  code:
                    type: integer
                    enum:
                      - 409
        '500':
          description: Internal Server Error
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                  code:
                    type: integer
                    enum:
                      - 500
  /v2/custom-actions/{custom_action_id}/:
    get:
      x-badges:
        - name: Stable
          color: green
      tags:
        - blueprints_Custom Actions API
      description: >
        ⚠️ Linux only. Custom actions apply exclusively to Linux-managed
        devices. This endpoint is not applicable to Android, iOS, or Windows
        devices.


        Retrieves the full details of a specific custom action by its unique ID.

        Returns a CustomActionRead object containing the action's name, type,
        state, blueprint and device placement, display properties, options (with
        script references), and audit fields including created_by, updated_by,
        created_at, and updated_at. Use this endpoint to inspect a custom
        action's current configuration and retrieve its associated script_id
        values before modifying or deploying it.


        **About Retrieve Custom Action**


        Custom actions are operator-defined scripts surfaced on Linux devices
        through Blueprint settings or device Quick Actions. The CustomActionRead
        response includes each option's scripts.linux.script_id — a UUID
        referencing the script content stored externally. To retrieve the actual
        script content, use GET /v2/scripts/{script_id}/ with that UUID.


        **Key Fields**


        custom_action_id — UUID of the custom action to retrieve (path
        parameter, required)


        id — UUID of the custom action in the response body


        state — Current lifecycle state: draft, active, or inactive


        options[*].scripts.linux.script_id — UUID reference to the script
        content; use with GET /v2/scripts/{script_id}/ to fetch the actual
        script


        position_in_blueprints / position_in_device_settings — Where this action
        is surfaced in Blueprint and device UI


        created_at / updated_at — Audit timestamps


        **Common Use Cases**


        Inspect a custom action's current state and placement before deciding to
        activate or deactivate it


        Retrieve script_id values from the options to fetch and review the
        associated scripts


        Confirm that a custom action's properties labels and messages are
        correctly set before deploying it in a Blueprint


        **Best Practices**


        Use this endpoint before calling PUT
        /v2/custom-actions/{custom_action_id}/ to understand the current state
        of the action


        Cross-reference script_id values with GET /v2/scripts/{script_id}/ to
        verify script content is correct before activating the action


        Check the state field to confirm whether the action is eligible for
        deployment (active) before including it in a Blueprint


        **Workflow**


        Obtain the custom_action_id from GET /v2/custom-actions/ or from the
        Console


        Call GET /v2/custom-actions/{custom_action_id}/ to retrieve the full
        action object


        Review state, options, and placement fields


        If needed, use the script_id from each option's scripts.linux object to
        inspect the script content via GET /v2/scripts/{script_id}/
      parameters:
        - in: path
          name: custom_action_id
          required: true
          schema:
            type: string
            format: uuid
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                type: object
                properties:
                  content:
                    $ref: '#/components/schemas/blueprints_CustomActionRead'
                  message:
                    type: string
                  code:
                    type: integer
                    enum:
                      - 200
        '404':
          description: Custom Action not found
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                  code:
                    type: integer
                    enum:
                      - 404
    put:
      x-badges:
        - name: Stable
          color: green
      tags:
        - blueprints_Custom Actions API
      description: >
        ⚠️ Linux only. Custom actions apply exclusively to Linux-managed
        devices. This endpoint is not applicable to Android, iOS, or Windows
        devices.


        Updates an existing custom action by ID, modifying any combination of
        its name, type, state, placement, properties, and options.

        Accepts a CustomActionUpdate body where all fields are optional — only
        the fields provided will be updated. If options is included, it fully
        replaces the existing options list. Returns the updated CustomActionRead
        object on success. Returns 400 if the update is invalid (e.g., an
        invalid state transition) or 409 if the new name conflicts with an
        existing custom action.


        **About Update Custom Action**


        Custom action updates follow partial-update semantics for most fields,
        but options is a full replacement — supplying it overwrites all existing
        options and their associated scripts. State transitions follow lifecycle
        rules: only active custom actions can be deployed to Linux devices.
        Moving an action from active to inactive or draft will prevent it from
        being used in new Blueprint deployments.


        **Key Fields**


        custom_action_id — UUID of the custom action to update (path parameter,
        required)


        name — Updated display name (1–50 characters; must remain unique within
        the tenant)


        type — Updated UI component type: button, toggle, radio, or dropdown


        state — Updated lifecycle state: draft, active, or inactive; only active
        actions are deployable


        position_in_blueprints — Updated Blueprint section placement


        position_in_device_settings — Updated device Quick Actions placement


        properties — Replacement object for description, info_message, and
        tooltip_message


        options — Replacement list of options; each option requires label, key
        UUID, and scripts.linux with script and interpreter


        **Common Use Cases**


        Activate a draft custom action by updating state to active when it's
        ready for deployment


        Update script content by supplying a new options array with revised
        scripts


        Rename or reposition a custom action within Blueprint sections


        **Best Practices**


        Retrieve the current state of the action with GET
        /v2/custom-actions/{custom_action_id}/ before updating to avoid
        unintentional changes


        When updating options, include all options you want to retain — the list
        is fully replaced, not merged


        Validate state transitions: moving from active to inactive may affect
        Blueprints currently referencing this action


        **Workflow**


        Retrieve the current action with GET
        /v2/custom-actions/{custom_action_id}/


        Build a CustomActionUpdate payload with only the fields you intend to
        change (or a full options replacement if updating scripts)


        Submit PUT /v2/custom-actions/{custom_action_id}/


        Confirm the response reflects the updated fields and review the new
        updated_at timestamp
      parameters:
        - in: path
          name: custom_action_id
          required: true
          schema:
            type: string
            format: uuid
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/blueprints_CustomActionUpdate'
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                type: object
                properties:
                  content:
                    $ref: '#/components/schemas/blueprints_CustomActionRead'
                  message:
                    type: string
                  code:
                    type: integer
                    enum:
                      - 200
        '400':
          description: Bad Request (validation error or invalid state transition)
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                  code:
                    type: integer
                    enum:
                      - 400
        '404':
          description: Custom Action not found
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                  code:
                    type: integer
                    enum:
                      - 404
        '409':
          description: Conflict - Custom Action name already exists
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                  code:
                    type: integer
                    enum:
                      - 409
        '500':
          description: Internal Server Error
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                  code:
                    type: integer
                    enum:
                      - 500
    delete:
      x-badges:
        - name: Stable
          color: green
      tags:
        - blueprints_Custom Actions API
      description: >
        ⚠️ Linux only. Custom actions apply exclusively to Linux-managed
        devices. This endpoint is not applicable to Android, iOS, or Windows
        devices.


        Permanently deletes a custom action by its unique ID.

        Returns HTTP 200 on success. Returns 400 if the custom action is
        currently in an active state — active custom actions must be deactivated
        before they can be deleted. Returns 404 if the custom action does not
        exist. Deletion is irreversible and removes the action and all its
        associated option scripts.


        **About Delete Custom Action**


        Custom actions define scripts that can be embedded in Blueprint V2
        configurations and deployed to Linux devices. Deleting an active custom
        action is blocked to prevent accidental removal of actions currently
        referenced in live blueprints. Before deleting, transition the action to
        inactive or draft state using PUT
        /v2/custom-actions/{custom_action_id}/, then verify it is not referenced
        by any active blueprints.


        **Key Fields**


        custom_action_id — UUID of the custom action to delete (path parameter,
        required)


        **Common Use Cases**


        Remove a deprecated or unused custom action after it has been replaced
        by a newer one


        Clean up test or draft custom actions that are no longer needed


        Decommission a custom action tied to a retired Linux device workflow


        **Best Practices**


        Before deleting, update the action's state to inactive via PUT
        /v2/custom-actions/{custom_action_id}/ — the API blocks deletion of
        active actions (returns 400)


        Confirm that no active Blueprint V2 configurations reference this custom
        action before deleting


        Archive the script content by calling GET /v2/scripts/{script_id}/ for
        each option's script if you may need it later


        **Workflow**


        If the action is active, update it to state: "inactive" via PUT
        /v2/custom-actions/{custom_action_id}/


        Verify that no live Blueprints reference this custom action


        Call DELETE /v2/custom-actions/{custom_action_id}/


        Confirm HTTP 200 response; the action will no longer appear in GET
        /v2/custom-actions/ results
      parameters:
        - in: path
          name: custom_action_id
          required: true
          schema:
            type: string
            format: uuid
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                  code:
                    type: integer
                    enum:
                      - 200
        '400':
          description: Bad Request - Cannot delete active custom action
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                  code:
                    type: integer
                    enum:
                      - 400
        '404':
          description: Custom Action not found
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                  code:
                    type: integer
                    enum:
                      - 404
        '500':
          description: Internal Server Error
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                  code:
                    type: integer
                    enum:
                      - 500
  /v2/scripts/{script_id}/:
    get:
      x-badges:
        - name: Stable
          color: green
      tags:
        - blueprints_Custom Actions API
      description: >
        ⚠️ Linux only. Scripts retrieved by this endpoint are associated with
        custom actions that run exclusively on Linux-managed devices.


        Retrieves the content of a specific script by its unique script ID.

        Returns a platformScript object containing the raw script content and
        the interpreter used to execute it (e.g., bash, python3). Script IDs are
        generated when a custom action is created and are referenced within the
        options[*].scripts.linux.script_id field of a CustomActionRead response.
        Use this endpoint to inspect or archive the exact script code associated
        with a custom action option before modifying or deleting it.


        **About Retrieve Script**


        Scripts in Esper's custom actions system are stored as discrete objects
        in external storage, each identified by a UUID script_id. They are not
        directly editable in place — to update a script, you must supply a
        replacement options array in PUT /v2/custom-actions/{custom_action_id}/,
        which generates a new script_id. This endpoint provides read-only access
        to the raw script content and its interpreter metadata.


        **Key Fields**


        script_id — UUID of the script to retrieve (path parameter, required);
        obtained from a custom action's options[*].scripts.linux.script_id


        script — The raw script content (string)


        interpreter — The runtime used to execute the script (e.g., bash, sh,
        python, python3; defaults to bash)


        **Common Use Cases**


        Retrieve and review script content before activating a custom action or
        including it in a Blueprint


        Archive the script code of a custom action option before replacing it
        with an updated version


        Audit which interpreter is configured for a script to ensure
        compatibility with the target Linux environment


        **Best Practices**


        Obtain script_id values from the options array returned by GET
        /v2/custom-actions/{custom_action_id}/ — they are not independently
        discoverable


        Scripts are immutable once created; to change script content, update the
        parent custom action via PUT /v2/custom-actions/{custom_action_id}/ with
        a new options array


        Store the retrieved script content in version control if the script
        logic is critical to your deployment workflow


        **Workflow**


        Call GET /v2/custom-actions/{custom_action_id}/ to retrieve the custom
        action and locate script_id values in options[*].scripts.linux.script_id


        Call GET /v2/scripts/{script_id}/ for each script you want to inspect


        Review the script content and interpreter field


        To update the script, build a new options array and submit it via PUT
        /v2/custom-actions/{custom_action_id}/
      parameters:
        - in: path
          name: script_id
          required: true
          schema:
            type: string
            format: uuid
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                type: object
                properties:
                  content:
                    $ref: '#/components/schemas/blueprints_platformScript'
                  message:
                    type: string
                  code:
                    type: integer
                    enum:
                      - 200
        '403':
          description: Permission denied
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                  code:
                    type: integer
                    enum:
                      - 403
        '404':
          description: Script not found
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                  code:
                    type: integer
                    enum:
                      - 404
        '500':
          description: Internal Server Error
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                  code:
                    type: integer
                    enum:
                      - 500
  /v2/background-scripts/:
    post:
      x-badges:
        - name: Stable
          color: green
      tags:
        - blueprints_Background Scripts API
      description: Create a new background script
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/blueprints_BackgroundScriptCreate'
      responses:
        '201':
          description: Success
          content:
            application/json:
              schema:
                type: object
                properties:
                  content:
                    $ref: '#/components/schemas/blueprints_BackgroundScriptRead'
                  message:
                    type: string
                  code:
                    type: integer
                    enum:
                      - 201
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                type: object
                properties:
                  errors:
                    type: array
                    items:
                      type: object
                  message:
                    type: string
                  code:
                    type: integer
                    enum:
                      - 400
        '409':
          description: Conflict - Background Script name already exists
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                  code:
                    type: integer
                    enum:
                      - 409
    get:
      x-badges:
        - name: Stable
          color: green
      tags:
        - blueprints_Background Scripts API
      description: Retrieve all background scripts for the tenant
      parameters:
        - in: query
          name: ordering
          schema:
            type: string
          description: >
            Order the results by a specific field (-field for descending order).
            Valid fields are 'name', 'created_at', 'updated_at', 'created_by',
            'updated_by'.
        - in: query
          name: name
          schema:
            type: string
          description: |
            Filter the results by name (partial match, case insensitive).
        - in: query
          name: always_run
          schema:
            type: boolean
          description: |
            Filter the results by always_run flag.
        - in: query
          name: limit
          schema:
            type: integer
            minimum: 1
            maximum: 100
            default: 10
          description: |
            Number of results to return per page.
        - in: query
          name: offset
          schema:
            type: integer
            minimum: 0
            default: 0
          description: |
            The initial index from which to return the results.
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                type: object
                properties:
                  content:
                    type: object
                    properties:
                      count:
                        type: integer
                        format: int64
                        description: The total number of background scripts
                      next:
                        type: string
                        nullable: true
                        description: >-
                          The link to retrieve the next set of objects in the
                          result set
                      previous:
                        type: string
                        nullable: true
                        description: >-
                          The link to retrieve the previous set of objects in
                          the result set
                      results:
                        type: array
                        items:
                          $ref: '#/components/schemas/blueprints_BackgroundScriptRead'
                  message:
                    type: string
                  code:
                    type: integer
  /v2/background-scripts/{background_script_id}/:
    get:
      x-badges:
        - name: Stable
          color: green
      tags:
        - blueprints_Background Scripts API
      description: >-
        Retrieve a background script by ID. Includes the script content fetched
        from S3.
      parameters:
        - in: path
          name: background_script_id
          required: true
          schema:
            type: string
            format: uuid
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                type: object
                properties:
                  content:
                    $ref: '#/components/schemas/blueprints_BackgroundScriptDetailRead'
                  message:
                    type: string
                  code:
                    type: integer
                    enum:
                      - 200
        '404':
          description: Background Script not found
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                  code:
                    type: integer
                    enum:
                      - 404
  /pipelines/v0/pipelines/:
    get:
      x-badges:
        - name: Stable
          color: green
      summary: Get all Pipelines for the Enterprise
      description: >-
        List all pipelines for the enterprise. Retrieves all active
        (non-deleted) pipelines configured for the enterprise, including
        metadata such as name, description, active and validity status, archive
        state, timeout configuration, and whether the pipeline is set as the
        default. Results can be filtered by name or sorted alphabetically.


        About Pipelines


        A pipeline is a multi-stage workflow that executes a sequence of
        operations — such as app installs, configuration changes, or commands —
        across targeted device groups. Each pipeline consists of one or more
        stages, each with its own target list and operation list. Pipelines
        allow you to coordinate staged rollouts with configurable timeouts and
        sequencing across your device fleet.


        Common use cases


        Auditing all pipelines configured for an enterprise, retrieving
        pipeline_id values needed to manage stages, target lists, or pipeline
        runs, identifying which pipelines are active or archived before
        triggering a run, and confirming the default pipeline configuration.


        Best Practices


        Use the name query parameter to filter results when working in
        enterprises with many pipelines. Use is_active and is_archived in the
        response to confirm a pipeline is in a runnable state before triggering
        a run. Always retrieve a pipeline_id from this endpoint before calling
        pipeline stage, target list, or run endpoints.


        Workflow


        1. Call this endpoint to retrieve all pipelines and identify the
        pipeline_id for the pipeline you want to work with.

        2. Use GET /pipelines/v0/pipelines/{pipeline_id}/ to retrieve full
        details for a specific pipeline.

        3. Use GET /pipelines/v0/pipelines/{pipeline_id}/stages/ to inspect or
        modify the stages within a pipeline.
      operationId: getPipelines
      tags:
        - pipelines_Pipelines
      parameters:
        - in: query
          name: default
          schema:
            type: boolean
            enum:
              - true
              - false
        - in: query
          name: name
          description: Filter by name
          schema:
            type: string
        - in: query
          name: ordering
          description: Sorting pipelines based on the field name
          schema:
            type: string
            enum:
              - name
              - '-name'
      security:
        - pipelines_SCAPIAuthToken: []
      responses:
        '200':
          description: Pipelines list for the Enterprise
          content:
            application/json:
              schema:
                type: object
                properties:
                  code:
                    type: integer
                  message:
                    type: string
                  content:
                    type: object
                    properties:
                      count:
                        type: integer
                      previous:
                        type: string
                      next:
                        type: string
                      results:
                        type: array
                        items:
                          $ref: '#/components/schemas/pipelines_Pipeline'
    post:
      x-badges:
        - name: Stable
          color: green
      summary: Create a new Pipeline
      description: Create a Pipeline for the enterprise using logged in user token
      operationId: createPipeline
      tags:
        - pipelines_Pipelines
      security:
        - pipelines_SCAPIAuthToken: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/pipelines_Pipeline_POST'
      responses:
        '200':
          description: Created
          content:
            application/json:
              schema:
                type: object
                properties:
                  code:
                    type: integer
                  message:
                    type: string
                  content:
                    $ref: '#/components/schemas/pipelines_Pipeline'
        '400':
          description: Pipelines create error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/pipelines_Error_400_Bad_Data'
        '401':
          description: Pipelines create error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/pipelines_Error_401_Unauthorized'
  /pipelines/v0/pipelines/{pipeline_id}/:
    get:
      x-badges:
        - name: Stable
          color: green
      summary: Get a Pipeline
      operationId: getPipeline
      tags:
        - pipelines_Pipelines
      security:
        - pipelines_SCAPIAuthToken: []
      parameters:
        - name: pipeline_id
          in: path
          description: ID of the Pipeline
          required: true
          schema:
            type: string
      responses:
        '200':
          description: Pipeline information
          content:
            application/json:
              schema:
                type: object
                properties:
                  code:
                    type: integer
                  message:
                    type: string
                  content:
                    $ref: '#/components/schemas/pipelines_Pipeline'
    put:
      x-badges:
        - name: Stable
          color: green
      summary: Update a Pipeline
      operationId: updatePipeline
      tags:
        - pipelines_Pipelines
      security:
        - pipelines_SCAPIAuthToken: []
      parameters:
        - name: pipeline_id
          in: path
          description: ID of the Pipeline
          required: true
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/pipelines_Pipeline_PUT'
      responses:
        '200':
          description: Updated Pipeline Information
          content:
            application/json:
              schema:
                type: object
                properties:
                  code:
                    type: integer
                  message:
                    type: string
                  content:
                    $ref: '#/components/schemas/pipelines_Pipeline'
        '400':
          description: Pipelines update error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/pipelines_Error_400_Bad_Data'
        '401':
          description: Pipelines update error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/pipelines_Error_401_Unauthorized'
    delete:
      x-badges:
        - name: Stable
          color: green
      summary: Delete a Pipeline
      operationId: deletePipeline
      tags:
        - pipelines_Pipelines
      security:
        - pipelines_SCAPIAuthToken: []
      parameters:
        - name: pipeline_id
          in: path
          description: ID of the Pipeline
          required: true
          schema:
            type: string
      responses:
        '200':
          description: Deleted Pipeline Information
          content:
            application/json:
              schema:
                type: object
                properties:
                  code:
                    type: integer
                  message:
                    type: string
                  content:
                    $ref: '#/components/schemas/pipelines_Pipeline'
        '401':
          description: Pipelines delete error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/pipelines_Error_401_Unauthorized'
  /pipelines/v0/pipelines/{pipeline_id}/stages/:
    get:
      x-badges:
        - name: Stable
          color: green
      summary: Get all Pipeline stages
      security:
        - pipelines_SCAPIAuthToken: []
      operationId: getPipelineStages
      tags:
        - pipelines_Stages
      parameters:
        - name: pipeline_id
          in: path
          description: ID of the Pipeline
          required: true
          schema:
            type: string
      responses:
        '200':
          description: Pipelines stages response
          content:
            application/json:
              schema:
                type: object
                properties:
                  code:
                    type: integer
                  message:
                    type: string
                  content:
                    type: object
                    properties:
                      count:
                        type: integer
                      previous:
                        type: string
                      next:
                        type: string
                      results:
                        type: array
                        items:
                          $ref: '#/components/schemas/pipelines_Stage'
    post:
      x-badges:
        - name: Stable
          color: green
      summary: Create a Pipeline stage
      security:
        - pipelines_SCAPIAuthToken: []
      operationId: createPipelineStage
      tags:
        - pipelines_Stages
      parameters:
        - name: pipeline_id
          in: path
          description: ID of the Pipeline
          required: true
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/pipelines_Stage_POST'
      responses:
        '200':
          description: Pipelines stages create response
          content:
            application/json:
              schema:
                type: object
                properties:
                  code:
                    type: integer
                  message:
                    type: string
                  content:
                    $ref: '#/components/schemas/pipelines_Stage'
        '400':
          description: Stage create error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/pipelines_Error_400_Bad_Data'
  /pipelines/v0/pipelines/{pipeline_id}/stages/{stage_id}/:
    get:
      x-badges:
        - name: Stable
          color: green
      summary: Get a Pipeline Stage
      security:
        - pipelines_SCAPIAuthToken: []
      operationId: getPipelineStage
      tags:
        - pipelines_Stages
      parameters:
        - name: pipeline_id
          in: path
          description: ID of the Pipeline
          required: true
          schema:
            type: string
        - name: stage_id
          in: path
          description: ID of the Stage
          required: true
          schema:
            type: string
      responses:
        '200':
          description: Pipelines stage get response
          content:
            application/json:
              schema:
                type: object
                properties:
                  code:
                    type: integer
                  message:
                    type: string
                  content:
                    $ref: '#/components/schemas/pipelines_Stage'
    put:
      x-badges:
        - name: Stable
          color: green
      summary: Update a Pipeline Stage
      security:
        - pipelines_SCAPIAuthToken: []
      operationId: updatePipelineStage
      tags:
        - pipelines_Stages
      parameters:
        - name: pipeline_id
          in: path
          description: ID of the Pipeline
          required: true
          schema:
            type: string
        - name: stage_id
          in: path
          description: ID of the Stage
          required: true
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/pipelines_Stage_PUT'
      responses:
        '200':
          description: Updated Stage Information
          content:
            application/json:
              schema:
                type: object
                properties:
                  code:
                    type: integer
                  message:
                    type: string
                  content:
                    $ref: '#/components/schemas/pipelines_Stage'
        '400':
          description: Stage update error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/pipelines_Error_400_Bad_Data'
        '401':
          description: Stage update error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/pipelines_Error_401_Unauthorized'
    delete:
      x-badges:
        - name: Stable
          color: green
      summary: Delete a pipeline stage
      security:
        - pipelines_SCAPIAuthToken: []
      operationId: deletePipelineStage
      tags:
        - pipelines_Stages
      parameters:
        - name: pipeline_id
          in: path
          description: ID of the Pipeline
          required: true
          schema:
            type: string
        - name: stage_id
          in: path
          description: ID of the Stage
          required: true
          schema:
            type: string
      responses:
        '200':
          description: Deleted Stage Information
          content:
            application/json:
              schema:
                type: object
                properties:
                  code:
                    type: integer
                  message:
                    type: string
                  content:
                    $ref: '#/components/schemas/pipelines_Stage'
        '401':
          description: Stage delete error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/pipelines_Error_401_Unauthorized'
  /pipelines/v0/stages/{stage_id}/targetlists/:
    get:
      x-badges:
        - name: Stable
          color: green
      summary: Get all Target Lists attached to the Stage
      security:
        - pipelines_SCAPIAuthToken: []
      operationId: getStageTargetLists
      tags:
        - pipelines_Stages
      parameters:
        - name: stage_id
          in: path
          description: ID of the Stage
          required: true
          schema:
            type: string
            format: uuid
        - in: query
          name: type
          schema:
            type: string
            enum:
              - groups
              - devices
              - collections
      responses:
        '200':
          description: All Targets Lists attached to the Stage
          content:
            application/json:
              schema:
                type: object
                properties:
                  code:
                    type: integer
                  message:
                    type: string
                  content:
                    type: object
                    properties:
                      count:
                        type: integer
                      previous:
                        type: string
                      next:
                        type: string
                      results:
                        type: array
                        items:
                          $ref: '#/components/schemas/pipelines_TargetList'
        '401':
          description: Target List get error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/pipelines_Error_401_Unauthorized'
    post:
      x-badges:
        - name: Stable
          color: green
      summary: Attach the Target List to the Stage
      security:
        - pipelines_SCAPIAuthToken: []
      operationId: addStageTargetList
      tags:
        - pipelines_Stages
      parameters:
        - name: stage_id
          in: path
          description: ID of the Stage
          required: true
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/pipelines_StageTargetList_POST'
      responses:
        '200':
          description: Attach target list to a Stage
          content:
            application/json:
              schema:
                type: object
                properties:
                  code:
                    type: integer
                  message:
                    type: string
                  content:
                    $ref: '#/components/schemas/pipelines_TargetList'
        '401':
          description: Target list attach error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/pipelines_Error_401_Unauthorized'
  /pipelines/v0/stages/{stage_id}/targetlists/{targetlist_id}/:
    delete:
      x-badges:
        - name: Stable
          color: green
      summary: Detach the Target List from the Stage
      security:
        - pipelines_SCAPIAuthToken: []
      operationId: deleteStageTargetList
      tags:
        - pipelines_Stages
      parameters:
        - name: stage_id
          in: path
          description: ID of the Stage
          required: true
          schema:
            type: string
        - name: targetlist_id
          in: path
          description: ID of the Target List
          required: true
          schema:
            type: string
      responses:
        '200':
          description: Detach target list from stage
          content:
            application/json:
              schema:
                type: object
                properties:
                  code:
                    type: integer
                  message:
                    type: string
                  content:
                    $ref: '#/components/schemas/pipelines_TargetList'
        '401':
          description: Target list attach error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/pipelines_Error_401_Unauthorized'
  /pipelines/v0/stages/{stage_id}/operationlists/:
    get:
      x-badges:
        - name: Stable
          color: green
      summary: Get all Operation Lists attached to the Stage
      security:
        - pipelines_SCAPIAuthToken: []
      operationId: getStageOperationLists
      tags:
        - pipelines_Operation Lists
      parameters:
        - name: stage_id
          in: path
          description: ID of the Stage
          required: true
          schema:
            type: string
      responses:
        '200':
          description: All Operation Lists attached to the Stage
          content:
            application/json:
              schema:
                type: object
                properties:
                  code:
                    type: integer
                  message:
                    type: string
                  content:
                    type: object
                    properties:
                      count:
                        type: integer
                      previous:
                        type: string
                      next:
                        type: string
                      results:
                        type: array
                        items:
                          $ref: '#/components/schemas/pipelines_OperationList'
        '401':
          description: Operation List get error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/pipelines_Error_401_Unauthorized'
    post:
      x-badges:
        - name: Stable
          color: green
      summary: Create an Operation list for the Stage
      security:
        - pipelines_SCAPIAuthToken: []
      operationId: addStageOperationList
      tags:
        - pipelines_Operation Lists
      parameters:
        - name: stage_id
          in: path
          description: ID of the Stage
          required: true
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/pipelines_OperationList_POST'
      responses:
        '200':
          description: Attach Operation list to a Stage
          content:
            application/json:
              schema:
                type: object
                properties:
                  code:
                    type: integer
                  message:
                    type: string
                  content:
                    $ref: '#/components/schemas/pipelines_OperationList'
        '401':
          description: Operation list attach error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/pipelines_Error_401_Unauthorized'
  /pipelines/v0/stages/{stage_id}/operationlists/{operationlist_id}/:
    put:
      x-badges:
        - name: Stable
          color: green
      summary: Update an Operation List
      operationId: updatePipelineOperationList
      tags:
        - pipelines_Operation Lists
      security:
        - pipelines_SCAPIAuthToken: []
      parameters:
        - name: stage_id
          in: path
          description: ID of the Stage
          required: true
          schema:
            type: string
        - name: operationlist_id
          in: path
          description: ID of the Operation List
          required: true
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/pipelines_OperationList'
      responses:
        '200':
          description: Updated Operation List Information
          content:
            application/json:
              schema:
                type: object
                properties:
                  code:
                    type: integer
                  message:
                    type: string
                  content:
                    $ref: '#/components/schemas/pipelines_OperationList'
        '400':
          description: Operation List update error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/pipelines_Error_400_Bad_Data'
        '401':
          description: Operation List update error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/pipelines_Error_401_Unauthorized'
    delete:
      x-badges:
        - name: Stable
          color: green
      summary: Delete stage operation list
      description: >
        Permanently deletes an Operation List attached to a Pipeline Stage.


        Removes the Operation List record identified by operationlist_id from
        the given stage_id, along with the individual Operations it contains.
        This does not delete the Stage itself, only the Operation List and its
        operations.


        **About Delete Stage Operation List**


        ⚠️ Android only. Pipelines orchestrate multi-step device operations
        using a Pipeline → Stages → Operation List → Target List hierarchy. An
        Operation List holds the ordered set of actions (such as commands or
        scripts) that a Stage runs against its Target List. Deleting the
        Operation List removes that stage's action definitions, so the stage
        will have nothing to execute until a new Operation List is created and
        attached.


        **Common Use Cases**


        Removing an outdated Operation List before rebuilding a Pipeline Stage
        with new actions


        Cleaning up unused Operation Lists during Pipeline maintenance


        **Best Practices**


        Confirm the Operation List is not currently referenced by an active or
        scheduled Pipeline Run before deleting it


        Create the replacement Operation List first if the Stage needs to remain
        runnable without downtime


        **Workflow**


        Call GET /pipelines/v0/pipelines/{pipeline_id}/stages/{stage_id}/ to
        confirm the operationlist_id belongs to the intended stage


        DELETE the Operation List using its stage_id and operationlist_id


        Create and attach a new Operation List to the stage if it should
        continue to run actions
      security:
        - pipelines_SCAPIAuthToken: []
      operationId: deleteStageOperationList
      tags:
        - pipelines_Operation Lists
      parameters:
        - name: stage_id
          in: path
          description: ID of the Stage
          required: true
          schema:
            type: string
        - name: operationlist_id
          in: path
          description: ID of the Operation List
          required: true
          schema:
            type: string
      responses:
        '200':
          description: Delete operation list from stage
          content:
            application/json:
              schema:
                type: object
                properties:
                  code:
                    type: integer
                  message:
                    type: string
                  content:
                    $ref: '#/components/schemas/pipelines_OperationList'
        '401':
          description: Operation list detach error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/pipelines_Error_401_Unauthorized'
  /pipelines/v0/pipelines/{pipeline_id}/targetlists/:
    get:
      x-badges:
        - name: Stable
          color: green
      summary: Get all Target Lists in Pipeline
      security:
        - pipelines_SCAPIAuthToken: []
      operationId: getPipelineTargetLists
      tags:
        - pipelines_Target Lists
      parameters:
        - name: pipeline_id
          in: path
          description: ID of the Pipeline
          required: true
          schema:
            type: string
      responses:
        '200':
          description: All Target Lists in Pipeline
          content:
            application/json:
              schema:
                type: object
                properties:
                  code:
                    type: integer
                  message:
                    type: string
                  content:
                    type: object
                    properties:
                      count:
                        type: integer
                      previous:
                        type: string
                      next:
                        type: string
                      results:
                        type: array
                        items:
                          $ref: '#/components/schemas/pipelines_TargetList'
        '401':
          description: Target List get error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/pipelines_Error_401_Unauthorized'
    post:
      x-badges:
        - name: Stable
          color: green
      summary: Create a Target List
      security:
        - pipelines_SCAPIAuthToken: []
      operationId: addPipelineTargetList
      tags:
        - pipelines_Target Lists
      parameters:
        - name: pipeline_id
          in: path
          description: ID of the Pipeline
          required: true
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/pipelines_TargetList_POST'
      responses:
        '200':
          description: All Targets in Target List
          content:
            application/json:
              schema:
                type: object
                properties:
                  code:
                    type: integer
                  message:
                    type: string
                  content:
                    $ref: '#/components/schemas/pipelines_TargetList'
        '401':
          description: Target List get error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/pipelines_Error_401_Unauthorized'
  /pipelines/v0/pipelines/{pipeline_id}/targetlists/{targetlist_id}/:
    get:
      x-badges:
        - name: Stable
          color: green
      summary: Get a Pipeline Target list
      security:
        - pipelines_SCAPIAuthToken: []
      operationId: getPipelineTargetList
      tags:
        - pipelines_Target Lists
      parameters:
        - name: pipeline_id
          in: path
          description: ID of the Pipeline
          required: true
          schema:
            type: string
        - name: targetlist_id
          in: path
          description: ID of the Target list
          required: true
          schema:
            type: string
      responses:
        '200':
          description: Get target list
          content:
            application/json:
              schema:
                type: object
                properties:
                  code:
                    type: integer
                  message:
                    type: string
                  content:
                    $ref: '#/components/schemas/pipelines_TargetList'
        '401':
          description: Target list attach error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/pipelines_Error_401_Unauthorized'
    put:
      x-badges:
        - name: Stable
          color: green
      summary: Update a Pipeline Target List
      operationId: updatePipelineTargetList
      tags:
        - pipelines_Target Lists
      security:
        - pipelines_SCAPIAuthToken: []
      parameters:
        - name: pipeline_id
          in: path
          description: ID of the Pipeline
          required: true
          schema:
            type: string
        - name: targetlist_id
          in: path
          description: ID of the Target List
          required: true
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/pipelines_TargetList'
      responses:
        '200':
          description: Updated Target List Information
          content:
            application/json:
              schema:
                type: object
                properties:
                  code:
                    type: integer
                  message:
                    type: string
                  content:
                    $ref: '#/components/schemas/pipelines_TargetList'
        '400':
          description: Target List update error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/pipelines_Error_400_Bad_Data'
        '401':
          description: Target List update error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/pipelines_Error_401_Unauthorized'
    delete:
      x-badges:
        - name: Stable
          color: green
      summary: Delete a Pipeline Target list
      security:
        - pipelines_SCAPIAuthToken: []
      operationId: deletePipelineTargetList
      tags:
        - pipelines_Target Lists
      parameters:
        - name: pipeline_id
          in: path
          description: ID of the Pipeline
          required: true
          schema:
            type: string
        - name: targetlist_id
          in: path
          description: ID of the Target List
          required: true
          schema:
            type: string
      responses:
        '200':
          description: Delete target list
          content:
            application/json:
              schema:
                type: object
                properties:
                  code:
                    type: integer
                  message:
                    type: string
                  content:
                    $ref: '#/components/schemas/pipelines_TargetList'
        '401':
          description: Target list delete error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/pipelines_Error_401_Unauthorized'
  /pipelines/v0/pipelines/{pipeline_id}/targetlists/{targetlist_id}/targets/:
    get:
      x-badges:
        - name: Stable
          color: green
      summary: Get all Targets in the Target List
      security:
        - pipelines_SCAPIAuthToken: []
      operationId: getTargetListTargets
      tags:
        - pipelines_Targets
      parameters:
        - name: pipeline_id
          in: path
          description: ID of the Pipeline
          required: true
          schema:
            type: string
        - name: targetlist_id
          in: path
          description: ID of the Target List
          required: true
          schema:
            type: string
      responses:
        '200':
          description: All Targets in Target List
          content:
            application/json:
              schema:
                type: object
                properties:
                  code:
                    type: integer
                  message:
                    type: string
                  content:
                    type: object
                    properties:
                      count:
                        type: integer
                      previous:
                        type: string
                      next:
                        type: string
                      results:
                        type: array
                        items:
                          $ref: '#/components/schemas/pipelines_Target'
        '401':
          description: Target List get error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/pipelines_Error_401_Unauthorized'
    post:
      x-badges:
        - name: Stable
          color: green
      summary: Create a target for the target list
      security:
        - pipelines_SCAPIAuthToken: []
      operationId: createTargetListTargets
      tags:
        - pipelines_Targets
      parameters:
        - name: pipeline_id
          in: path
          description: ID of the Pipeline
          required: true
          schema:
            type: string
        - name: targetlist_id
          in: path
          description: ID of the Target List
          required: true
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/pipelines_Target_POST'
      responses:
        '200':
          description: All Targets in Target List
          content:
            application/json:
              schema:
                type: object
                properties:
                  code:
                    type: integer
                  message:
                    type: string
                  content:
                    $ref: '#/components/schemas/pipelines_Target'
        '401':
          description: Target List get error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/pipelines_Error_401_Unauthorized'
  /pipelines/v0/pipelines/{pipeline_id}/targetlists/{targetlist_id}/targets/{target_id}/:
    get:
      x-badges:
        - name: Stable
          color: green
      summary: Get one target from target list
      security:
        - pipelines_SCAPIAuthToken: []
      operationId: getTargetListTarget
      tags:
        - pipelines_Targets
      parameters:
        - name: pipeline_id
          in: path
          description: ID of the Pipeline
          required: true
          schema:
            type: string
            format: uuid
        - name: targetlist_id
          in: path
          description: ID of the Target List
          required: true
          schema:
            type: string
            format: uuid
        - name: target_id
          in: path
          description: ID of the Target
          required: true
          schema:
            type: string
            format: uuid
      responses:
        '200':
          description: Target from Target List
          content:
            application/json:
              schema:
                type: object
                properties:
                  code:
                    type: integer
                  message:
                    type: string
                  content:
                    $ref: '#/components/schemas/pipelines_Target'
        '401':
          description: Target List device delete error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/pipelines_Error_401_Unauthorized'
    put:
      x-badges:
        - name: Stable
          color: green
      summary: Update a target in the target list
      security:
        - pipelines_SCAPIAuthToken: []
      operationId: updateTargetListTarget
      tags:
        - pipelines_Targets
      parameters:
        - name: pipeline_id
          in: path
          description: ID of the Pipeline
          required: true
          schema:
            type: string
            format: uuid
        - name: targetlist_id
          in: path
          description: ID of the Target List
          required: true
          schema:
            type: string
            format: uuid
        - name: target_id
          in: path
          description: ID of the Target
          required: true
          schema:
            type: string
            format: uuid
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/pipelines_Target_PUT'
      responses:
        '200':
          description: Updated Target from Target List
          content:
            application/json:
              schema:
                type: object
                properties:
                  code:
                    type: integer
                  message:
                    type: string
                  content:
                    $ref: '#/components/schemas/pipelines_Target'
        '401':
          description: Target List device delete error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/pipelines_Error_401_Unauthorized'
    delete:
      x-badges:
        - name: Stable
          color: green
      summary: Delete a Target or Device from a Target List
      security:
        - pipelines_SCAPIAuthToken: []
      operationId: deleteTargetListTarget
      tags:
        - pipelines_Targets
      parameters:
        - name: pipeline_id
          in: path
          description: ID of the Pipeline
          required: true
          schema:
            type: string
            format: uuid
        - name: targetlist_id
          in: path
          description: ID of the Target List
          required: true
          schema:
            type: string
            format: uuid
        - name: target_id
          in: path
          description: ID of the Target
          required: true
          schema:
            type: string
            format: uuid
      responses:
        '200':
          description: Deleted Target from Target List
          content:
            application/json:
              schema:
                type: object
                properties:
                  code:
                    type: integer
                  message:
                    type: string
                  content:
                    $ref: '#/components/schemas/pipelines_Target'
        '401':
          description: Target List device delete error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/pipelines_Error_401_Unauthorized'
  /pipelines/v0/pipelines/{pipeline_id}/targetlists/{targetlist_id}/targets-bulk/:
    post:
      x-badges:
        - name: Stable
          color: green
      summary: Bulk add targets to a target list
      description: >-
        Adds multiple targets to a target list. Creates target records if they
        don't exist, then links them to the target list. Existing targets in the
        list are left unchanged (skipped). Behaves the same as legacy /targets/
        API. device_name should be provided for proper target run creation.
        device_alias can be provided as a direct property and will be stored in
        device_meta.
      security:
        - pipelines_SCAPIAuthToken: []
      operationId: bulkAddTargetListTargets
      tags:
        - pipelines_Targets
      parameters:
        - name: pipeline_id
          in: path
          description: ID of the Pipeline
          required: true
          schema:
            type: string
            format: uuid
        - name: targetlist_id
          in: path
          description: ID of the Target List
          required: true
          schema:
            type: string
            format: uuid
      requestBody:
        required: true
        description: Array of device IDs (strings) or device objects with metadata
        content:
          application/json:
            schema:
              oneOf:
                - type: array
                  items:
                    type: string
                    description: Device ID
                  example:
                    - device_id: 18d21907-a3b3-491b-9237-d835de82a3ef
                      device_name: ESPR-LAB-AAA03
                      device_alias: Actineon Edge 10A
                    - device_id: 550e8400-e29b-41d4-a716-446655440002
                      device_name: ESPR-LAB-AAA04
                      device_alias: Actineon Edge 10B
                - type: array
                  items:
                    type: object
                    required:
                      - device_id
                    properties:
                      device_id:
                        type: string
                        description: Device ID (UUID)
                      device_name:
                        type: string
                        description: >-
                          Device name (should be provided for proper target run
                          creation)
                      device_alias:
                        type: string
                        description: Device alias (optional, stored in device_meta)
                      device_meta:
                        type: object
                        description: Device metadata (optional)
                      args:
                        type: object
                        description: Custom arguments (optional)
                      is_active:
                        type: boolean
                        description: Active status (optional, defaults to true)
      responses:
        '200':
          description: Bulk add completed successfully
          content:
            application/json:
              schema:
                type: object
                properties:
                  code:
                    type: integer
                    example: 200
                  message:
                    type: string
                    example: >-
                      Bulk add completed. 2 target(s) created, 5 target(s) added
                      to list, 1 target(s) skipped.
                  content:
                    type: object
                    properties:
                      created_count:
                        type: integer
                        description: Number of new target records created
                        example: 2
                      added_count:
                        type: integer
                        description: Number of targets successfully added to the list
                        example: 5
                      skipped_count:
                        type: integer
                        description: Number of targets that were already in the list
                        example: 1
                      errors:
                        type: array
                        items:
                          type: object
                        description: List of any errors encountered
                        example: []
        '400':
          description: Bad request - invalid input
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/pipelines_Error_400_Bad_Data'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/pipelines_Error_401_Unauthorized'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/pipelines_Error_500_Internal_Server_Error'
  /pipelines/v0/pipelines/{pipeline_id}/targetlists/{targetlist_id}/devicegroups/:
    get:
      x-badges:
        - name: Stable
          color: green
      summary: Get all Device Groups in the Target List
      security:
        - pipelines_SCAPIAuthToken: []
      operationId: getTargetListDeviceGroups
      tags:
        - pipelines_Device Groups
      parameters:
        - name: pipeline_id
          in: path
          description: ID of the Pipeline
          required: true
          schema:
            type: string
        - name: targetlist_id
          in: path
          description: ID of the Target List
          required: true
          schema:
            type: string
      responses:
        '200':
          description: All Device Groups in Target List
          content:
            application/json:
              schema:
                type: object
                properties:
                  code:
                    type: integer
                  message:
                    type: string
                  content:
                    type: object
                    properties:
                      count:
                        type: integer
                      previous:
                        type: string
                      next:
                        type: string
                      results:
                        type: array
                        items:
                          $ref: '#/components/schemas/pipelines_TargetListDeviceGroup'
        '401':
          description: Target List device group get error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/pipelines_Error_401_Unauthorized'
    post:
      x-badges:
        - name: Stable
          color: green
      summary: Add a Device Group to the Target List
      security:
        - pipelines_SCAPIAuthToken: []
      operationId: addTargetListDeviceGroups
      tags:
        - pipelines_Device Groups
      parameters:
        - name: pipeline_id
          in: path
          description: ID of the Pipeline
          required: true
          schema:
            type: string
        - name: targetlist_id
          in: path
          description: ID of the Target List
          required: true
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/pipelines_TargetListDeviceGroups_POST'
      responses:
        '200':
          description: Added Device group
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/pipelines_TargetListDeviceGroup'
        '401':
          description: Target List Device Group add error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/pipelines_Error_401_Unauthorized'
  /pipelines/v0/pipelines/{pipeline_id}/targetlists/{targetlist_id}/devicegroups/{devicegroup_id}/:
    delete:
      x-badges:
        - name: Stable
          color: green
      summary: Delete Device Group from a Target List
      security:
        - pipelines_SCAPIAuthToken: []
      operationId: deleteTargetListDeviceGroup
      tags:
        - pipelines_Device Groups
      parameters:
        - name: pipeline_id
          in: path
          description: ID of the Pipeline
          required: true
          schema:
            type: string
            format: uuid
        - name: targetlist_id
          in: path
          description: ID of the Target List
          required: true
          schema:
            type: string
            format: uuid
        - name: devicegroup_id
          in: path
          description: ID of the Device Group
          required: true
          schema:
            type: string
            format: uuid
      responses:
        '200':
          description: Deleted Device Group from Target List
          content:
            application/json:
              schema:
                type: object
                properties:
                  code:
                    type: integer
                  message:
                    type: string
                  content:
                    type: array
                    items:
                      type: string
                      format: uuid
        '401':
          description: Target List device delete error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/pipelines_Error_401_Unauthorized'
  /pipelines/v0/pipelines/{pipeline_id}/targetlists/{targetlist_id}/devicegroups/{device_group_id}/devices/:
    get:
      x-badges:
        - name: Stable
          color: green
      summary: Get all Devices in the device group
      security:
        - pipelines_SCAPIAuthToken: []
      operationId: getDeviceGroupDevices
      tags:
        - pipelines_Device Groups
      parameters:
        - name: pipeline_id
          in: path
          description: ID of the Pipeline
          required: true
          schema:
            type: string
            format: uuid
        - name: targetlist_id
          in: path
          description: ID of the Target List
          required: true
          schema:
            type: string
            format: uuid
        - name: device_group_id
          in: path
          description: ID of the Device Group
          required: true
          schema:
            type: string
            format: uuid
      responses:
        '200':
          description: All Devices in Device group
          content:
            application/json:
              schema:
                type: object
                properties:
                  code:
                    type: integer
                  message:
                    type: string
                  content:
                    type: object
                    properties:
                      count:
                        type: integer
                      previous:
                        type: string
                      next:
                        type: string
                      results:
                        type: array
                        items:
                          $ref: '#/components/schemas/pipelines_Device'
        '401':
          description: Operation List get error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/pipelines_Error_401_Unauthorized'
  /pipelines/v0/operationlists/{operationlist_id}/operations/:
    get:
      x-badges:
        - name: Stable
          color: green
      summary: Get all Operations in the Operation List
      security:
        - pipelines_SCAPIAuthToken: []
      operationId: getOperationListOperations
      tags:
        - pipelines_Operations
      parameters:
        - name: operationlist_id
          in: path
          description: ID of the Operation List
          required: true
          schema:
            type: string
        - name: operation_type
          in: query
          description: Operation Type to filter on as defined in Operation_POST model
          required: false
          schema:
            type: string
      responses:
        '200':
          description: All Operations in Operation List
          content:
            application/json:
              schema:
                type: object
                properties:
                  code:
                    type: integer
                  message:
                    type: string
                  content:
                    type: object
                    properties:
                      count:
                        type: integer
                      previous:
                        type: string
                      next:
                        type: string
                      results:
                        type: array
                        items:
                          $ref: '#/components/schemas/pipelines_Operation'
        '401':
          description: Operation List get error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/pipelines_Error_401_Unauthorized'
    post:
      x-badges:
        - name: Stable
          color: green
      summary: Create an Operation for Operation List
      security:
        - pipelines_SCAPIAuthToken: []
      operationId: addOperationListOperations
      tags:
        - pipelines_Operations
      parameters:
        - name: operationlist_id
          in: path
          description: ID of the Operation List
          required: true
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/pipelines_Operation_POST'
      responses:
        '200':
          description: Created operation
          content:
            application/json:
              schema:
                type: object
                properties:
                  code:
                    type: integer
                  message:
                    type: string
                  content:
                    $ref: '#/components/schemas/pipelines_Operation'
        '401':
          description: Operation create error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/pipelines_Error_401_Unauthorized'
  /pipelines/v0/operationlists/{operationlist_id}/operations/{operation_id}/:
    get:
      x-badges:
        - name: Stable
          color: green
      summary: Get an Operation from the operation list
      security:
        - pipelines_SCAPIAuthToken: []
      operationId: getOperationListOperation
      tags:
        - pipelines_Operations
      parameters:
        - name: operationlist_id
          in: path
          description: ID of the Operation list
          required: true
          schema:
            type: string
        - name: operation_id
          in: path
          description: ID of the Operation
          required: true
          schema:
            type: string
      responses:
        '200':
          description: Get operation from operation list
          content:
            application/json:
              schema:
                type: object
                properties:
                  code:
                    type: integer
                  message:
                    type: string
                  content:
                    $ref: '#/components/schemas/pipelines_Operation'
        '401':
          description: Operation get error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/pipelines_Error_401_Unauthorized'
    put:
      x-badges:
        - name: Stable
          color: green
      summary: Update an Operation
      operationId: updateOperationListOperation
      tags:
        - pipelines_Operations
      security:
        - pipelines_SCAPIAuthToken: []
      parameters:
        - name: operationlist_id
          in: path
          description: ID of the Operation List
          required: true
          schema:
            type: string
        - name: operation_id
          in: path
          description: ID of the Operation
          required: true
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/pipelines_Operation'
      responses:
        '200':
          description: Updated Operation Information
          content:
            application/json:
              schema:
                type: object
                properties:
                  code:
                    type: integer
                  message:
                    type: string
                  content:
                    $ref: '#/components/schemas/pipelines_Operation'
        '400':
          description: Operation update error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/pipelines_Error_400_Bad_Data'
        '401':
          description: Operation update error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/pipelines_Error_401_Unauthorized'
    delete:
      x-badges:
        - name: Stable
          color: green
      summary: Delete an Operation list operation
      security:
        - pipelines_SCAPIAuthToken: []
      operationId: deleteOperationListOperation
      tags:
        - pipelines_Operations
      parameters:
        - name: operationlist_id
          in: path
          description: ID of the Operation List
          required: true
          schema:
            type: string
        - name: operation_id
          in: path
          description: ID of the Operation
          required: true
          schema:
            type: string
      responses:
        '200':
          description: Delete operation
          content:
            application/json:
              schema:
                type: object
                properties:
                  code:
                    type: integer
                  message:
                    type: string
                  content:
                    $ref: '#/components/schemas/pipelines_Operation'
        '401':
          description: Operation delete error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/pipelines_Error_401_Unauthorized'
  /pipelines/v0/runs/:
    get:
      x-badges:
        - name: Stable
          color: green
      summary: Get all Runs for the Pipelines in the Enterprise
      security:
        - pipelines_SCAPIAuthToken: []
      operationId: getAllPipelineRuns
      tags:
        - pipelines_Pipeline Runs
      parameters:
        - in: query
          name: status
          description: Filter by pipeline run status
          schema:
            type: string
            enum:
              - pending
              - queued
              - processing
              - running
              - waiting
              - complete
              - success
              - failure
              - cancelled
              - invalid
              - timeout
        - in: query
          name: pipeline_name
          description: Filter by pipeline name
          schema:
            type: string
        - in: query
          name: ordering
          description: Sorting pipelines runs based on the field name
          schema:
            type: string
            enum:
              - run_number
              - '-run_number'
              - status
              - '-status'
              - pipeline__name
              - '-pipeline__name'
              - started_at
              - '-started_at'
              - ended_at
              - '-ended_at'
      responses:
        '200':
          description: All Runs for the Pipelines in the Enterprise
          content:
            application/json:
              schema:
                type: object
                properties:
                  code:
                    type: integer
                  message:
                    type: string
                  content:
                    type: object
                    properties:
                      count:
                        type: integer
                      previous:
                        type: string
                      next:
                        type: string
                      results:
                        type: array
                        items:
                          $ref: '#/components/schemas/pipelines_PipelineRun'
        '401':
          description: Pipeline run get error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/pipelines_Error_401_Unauthorized'
  /pipelines/v0/pipelines/{pipeline_id}/runs/:
    get:
      x-badges:
        - name: Stable
          color: green
      summary: Get all Runs for the Pipeline
      security:
        - pipelines_SCAPIAuthToken: []
      operationId: getPipelineRuns
      tags:
        - pipelines_Pipeline Runs
      parameters:
        - name: pipeline_id
          in: path
          description: ID of the Pipeline
          required: true
          schema:
            type: string
        - in: query
          name: status
          description: Filter by pipeline run status
          schema:
            type: string
            enum:
              - pending
              - queued
              - processing
              - running
              - waiting
              - complete
              - success
              - failure
              - cancelled
              - invalid
              - timeout
        - in: query
          name: ordering
          description: Sorting pipelines runs based on the field name
          schema:
            type: string
            enum:
              - run_number
              - '-run_number'
              - status
              - '-status'
              - started_at
              - '-started_at'
              - ended_at
              - '-ended_at'
      responses:
        '200':
          description: All Runs for the Pipeline
          content:
            application/json:
              schema:
                type: object
                properties:
                  code:
                    type: integer
                  message:
                    type: string
                  content:
                    type: object
                    properties:
                      count:
                        type: integer
                      previous:
                        type: string
                      next:
                        type: string
                      results:
                        type: array
                        items:
                          $ref: '#/components/schemas/pipelines_PipelineRun'
        '401':
          description: Pipeline run get error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/pipelines_Error_401_Unauthorized'
    post:
      x-badges:
        - name: Stable
          color: green
      summary: Create a Pipeline Run
      security:
        - pipelines_SCAPIAuthToken: []
      operationId: createPipelineRun
      tags:
        - pipelines_Pipeline Runs
      parameters:
        - name: pipeline_id
          in: path
          description: ID of the Pipeline
          required: true
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/pipelines_PipelineRun_POST'
      responses:
        '200':
          description: Created Pipeline Run
          content:
            application/json:
              schema:
                type: object
                properties:
                  code:
                    type: integer
                  message:
                    type: string
                  content:
                    $ref: '#/components/schemas/pipelines_PipelineRun'
        '401':
          description: Pipeline run create error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/pipelines_Error_401_Unauthorized'
  /pipelines/v0/pipelines/{pipeline_id}/runs/{pipeline_run_id}/:
    get:
      x-badges:
        - name: Stable
          color: green
      summary: Get Pipeline run by pipeline run id
      security:
        - pipelines_SCAPIAuthToken: []
      operationId: getPipelineRun
      tags:
        - pipelines_Pipeline Runs
      parameters:
        - name: pipeline_id
          in: path
          description: ID of the Pipeline
          required: true
          schema:
            type: string
        - name: pipeline_run_id
          in: path
          description: Run Id of pipeline run
          required: true
          schema:
            type: string
      responses:
        '200':
          description: Get Pipeline run
          content:
            application/json:
              schema:
                type: object
                properties:
                  code:
                    type: integer
                  message:
                    type: string
                  content:
                    $ref: '#/components/schemas/pipelines_PipelineRun'
        '401':
          description: Operation get error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/pipelines_Error_401_Unauthorized'
    put:
      x-badges:
        - name: Stable
          color: green
      summary: Update a Pipeline Run
      operationId: updatePipelineRun
      tags:
        - pipelines_Pipeline Runs
      security:
        - pipelines_SCAPIAuthToken: []
      parameters:
        - name: pipeline_id
          in: path
          description: ID of the Pipeline
          required: true
          schema:
            type: string
        - name: pipeline_run_id
          in: path
          description: Run id of pipeline run
          required: true
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              $ref: '#/components/schemas/pipelines_PipelineRun_PUT'
      responses:
        '200':
          description: Updated Pipeline run information
          content:
            application/json:
              schema:
                type: object
                properties:
                  code:
                    type: integer
                  message:
                    type: string
                  content:
                    $ref: '#/components/schemas/pipelines_PipelineRun'
        '400':
          description: Pipeline Run update error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/pipelines_Error_400_Bad_Data'
        '401':
          description: Pipeline Run update error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/pipelines_Error_401_Unauthorized'
    delete:
      x-badges:
        - name: Stable
          color: green
      summary: Delete a Pipeline Run
      operationId: deletePipelineRun
      tags:
        - pipelines_Pipeline Runs
      security:
        - pipelines_SCAPIAuthToken: []
      parameters:
        - name: pipeline_id
          in: path
          description: ID of the Pipeline
          required: true
          schema:
            type: string
        - name: pipeline_run_id
          in: path
          description: Run id of pipeline run
          required: true
          schema:
            type: string
      responses:
        '200':
          description: Deleted Pipeline run information
          content:
            application/json:
              schema:
                type: object
                properties:
                  code:
                    type: integer
                  message:
                    type: string
                  content:
                    $ref: '#/components/schemas/pipelines_PipelineRun'
        '400':
          description: Pipeline Run update error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/pipelines_Error_400_Bad_Data'
        '401':
          description: Pipeline Run update error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/pipelines_Error_401_Unauthorized'
  /pipelines/v0/runs/{pipeline_run_id}/stageruns/:
    get:
      x-badges:
        - name: Stable
          color: green
      summary: Get all Stage Runs for the Pipeline Run
      security:
        - pipelines_SCAPIAuthToken: []
      operationId: getPipelineRunStageRuns
      tags:
        - pipelines_Stage Runs
      parameters:
        - name: pipeline_run_id
          in: path
          description: ID of the Pipeline Run
          required: true
          schema:
            type: string
        - name: status
          in: query
          description: Status of stage run
          required: false
          schema:
            type: string
            enum:
              - pending
              - queued
              - processing
              - running
              - complete
              - success
              - failure
              - cancelled
              - invalid
              - timeout
      responses:
        '200':
          description: All Stage Runs for the Pipeline Run
          content:
            application/json:
              schema:
                type: object
                properties:
                  code:
                    type: integer
                  message:
                    type: string
                  content:
                    type: object
                    properties:
                      count:
                        type: integer
                      previous:
                        type: string
                      next:
                        type: string
                      results:
                        type: array
                        items:
                          $ref: '#/components/schemas/pipelines_StageRun'
        '401':
          description: Stage run get error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/pipelines_Error_401_Unauthorized'
  /pipelines/v0/runs/{pipeline_run_id}/stageruns/{stage_run_id}/:
    get:
      x-badges:
        - name: Stable
          color: green
      summary: Get Pipeline Stage run by stage run Id
      security:
        - pipelines_SCAPIAuthToken: []
      operationId: getPipelineRunStageRun
      tags:
        - pipelines_Stage Runs
      parameters:
        - name: pipeline_run_id
          in: path
          description: ID of the Pipeline Run
          required: true
          schema:
            type: string
        - name: stage_run_id
          in: path
          description: ID of pipeline stage run
          required: true
          schema:
            type: string
      responses:
        '200':
          description: Get pipeline run stage run
          content:
            application/json:
              schema:
                type: object
                properties:
                  code:
                    type: integer
                  message:
                    type: string
                  content:
                    $ref: '#/components/schemas/pipelines_StageRun'
        '401':
          description: Operation get error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/pipelines_Error_401_Unauthorized'
    put:
      x-badges:
        - name: Stable
          color: green
      summary: Update a Pipeline Stage Run
      operationId: updatePipelineRunStageRun
      tags:
        - pipelines_Stage Runs
      security:
        - pipelines_SCAPIAuthToken: []
      parameters:
        - name: pipeline_run_id
          in: path
          description: ID of the Pipeline Run
          required: true
          schema:
            type: string
        - name: stage_run_id
          in: path
          description: id of pipeline stage run
          required: true
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                status:
                  type: string
                  enum:
                    - pending
                    - queued
                    - processing
                    - running
                    - complete
                    - success
                    - failure
                    - cancelled
                    - invalid
                    - timeout
      responses:
        '200':
          description: Updated Pipeline Stage run information
          content:
            application/json:
              schema:
                type: object
                properties:
                  code:
                    type: integer
                  message:
                    type: string
                  content:
                    $ref: '#/components/schemas/pipelines_StageRun'
        '400':
          description: Pipeline Stage Run update error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/pipelines_Error_400_Bad_Data'
        '401':
          description: Pipeline Stage Run update error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/pipelines_Error_401_Unauthorized'
  /pipelines/v0/stageruns/{stage_run_id}/operations/:
    get:
      x-badges:
        - name: Stable
          color: green
      summary: Get all Operations for the Stage Run
      security:
        - pipelines_SCAPIAuthToken: []
      operationId: getPipelineStageRunOperations
      tags:
        - pipelines_Stage Runs
      parameters:
        - name: stage_run_id
          in: path
          description: Stage run Id
          required: true
          schema:
            type: string
      responses:
        '200':
          description: All Operations for the Stage Run
          content:
            application/json:
              schema:
                type: object
                properties:
                  code:
                    type: integer
                  message:
                    type: string
                  content:
                    type: object
                    properties:
                      count:
                        type: integer
                      previous:
                        type: string
                      next:
                        type: string
                      results:
                        type: array
                        items:
                          $ref: '#/components/schemas/pipelines_StageRunOperation'
        '401':
          description: Stage run operation get error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/pipelines_Error_401_Unauthorized'
  /pipelines/v0/stageruns/{stage_run_id}/operations/{stage_run_operation_id}/:
    get:
      x-badges:
        - name: Stable
          color: green
      summary: Get single Operation for the Stage Run
      security:
        - pipelines_SCAPIAuthToken: []
      operationId: getPipelineStageRunOperation
      tags:
        - pipelines_Stage Runs
      parameters:
        - name: stage_run_id
          in: path
          description: Stage run Id
          required: true
          schema:
            type: string
        - name: stage_run_operation_id
          in: path
          description: Stage run operation Id
          required: true
          schema:
            type: string
      responses:
        '200':
          description: Operation for the Stage Run
          content:
            application/json:
              schema:
                type: object
                properties:
                  code:
                    type: integer
                  message:
                    type: string
                  content:
                    $ref: '#/components/schemas/pipelines_StageRunOperation'
        '401':
          description: Stage run operation get error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/pipelines_Error_401_Unauthorized'
  /pipelines/v0/stageruns/{stage_run_id}/targetruns/:
    get:
      x-badges:
        - name: Stable
          color: green
      summary: Get all Target Runs for the Stage Run
      security:
        - pipelines_SCAPIAuthToken: []
      operationId: getPipelineStageTargetRuns
      tags:
        - pipelines_Target Runs
      parameters:
        - name: stage_run_id
          in: path
          description: Stage run Id
          required: true
          schema:
            type: string
        - name: status
          in: query
          description: Status of target run
          schema:
            type: string
            enum:
              - pending
              - queued
              - processing
              - dispatched
              - running
              - complete
              - success
              - failure
              - cancelled
              - invalid
              - timeout
        - name: stage_run_operation_id
          in: query
          description: Stage run Operation Id to filter on
          schema:
            type: string
            format: uuid
        - name: ordering
          in: query
          description: Sorting target runs based on status field
          schema:
            type: string
            enum:
              - status
              - '-status'
      responses:
        '200':
          description: All Target runs for the Stage Run
          content:
            application/json:
              schema:
                type: object
                properties:
                  code:
                    type: integer
                  message:
                    type: string
                  content:
                    type: object
                    properties:
                      count:
                        type: integer
                      previous:
                        type: string
                      next:
                        type: string
                      results:
                        type: array
                        items:
                          $ref: '#/components/schemas/pipelines_TargetRun'
        '401':
          description: Target run get error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/pipelines_Error_401_Unauthorized'
    post:
      x-badges:
        - name: Stable
          color: green
      summary: Create a Target Runs for Stage Run
      security:
        - pipelines_SCAPIAuthToken: []
      operationId: createPipelineStageTargetRuns
      tags:
        - pipelines_Target Runs
      parameters:
        - name: stage_run_id
          in: path
          description: Stage run Id
          required: true
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/pipelines_TargetRun_POST'
      responses:
        '200':
          description: Created Target Runs
          content:
            application/json:
              schema:
                type: object
                properties:
                  code:
                    type: integer
                  message:
                    type: string
                  content:
                    type: array
                    items:
                      $ref: '#/components/schemas/pipelines_TargetRun'
        '401':
          description: Target Run create error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/pipelines_Error_401_Unauthorized'
  /pipelines/v0/stageruns/{stage_run_id}/targetruns/{target_run_id}/:
    get:
      x-badges:
        - name: Stable
          color: green
      summary: Get Target Run by Target Run ID
      security:
        - pipelines_SCAPIAuthToken: []
      operationId: getPipelineStageTargetRun
      tags:
        - pipelines_Target Runs
      parameters:
        - name: stage_run_id
          in: path
          description: Stage run Id
          required: true
          schema:
            type: string
        - name: target_run_id
          in: path
          description: Id of the Target Run
          required: true
          schema:
            type: string
      responses:
        '200':
          description: Get target run
          content:
            application/json:
              schema:
                type: object
                properties:
                  code:
                    type: integer
                  message:
                    type: string
                  content:
                    $ref: '#/components/schemas/pipelines_TargetRun'
        '401':
          description: Operation get error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/pipelines_Error_401_Unauthorized'
    put:
      x-badges:
        - name: Stable
          color: green
      summary: Update a Target Run
      operationId: updatePipelineStageTargetRun
      tags:
        - pipelines_Target Runs
      security:
        - pipelines_SCAPIAuthToken: []
      parameters:
        - name: stage_run_id
          in: path
          description: Stage run Id
          required: true
          schema:
            type: string
        - name: target_run_id
          in: path
          description: Id of the target run
          required: true
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/pipelines_TargetRun_PUT'
      responses:
        '200':
          description: Updated Target Run run information
          content:
            application/json:
              schema:
                type: object
                properties:
                  code:
                    type: integer
                  message:
                    type: string
                  content:
                    $ref: '#/components/schemas/pipelines_TargetRun'
        '400':
          description: Target Run update error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/pipelines_Error_400_Bad_Data'
        '401':
          description: Target Run update error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/pipelines_Error_401_Unauthorized'
  /pipelines/v0/stageruns/{stage_run_id}/targetruns/{target_run_id}/command/:
    get:
      x-badges:
        - name: Stable
          color: green
      summary: Get status of the command running for Target run
      security:
        - pipelines_SCAPIAuthToken: []
      operationId: getTargetRunCommandStatus
      tags:
        - pipelines_Target Runs
      parameters:
        - name: stage_run_id
          in: path
          description: ID of the stage run
          required: true
          schema:
            type: string
        - name: target_run_id
          in: path
          description: Id of the target run
          required: true
          schema:
            type: string
      responses:
        '200':
          description: Command processor request status
          content:
            application/json:
              schema:
                type: object
                properties:
                  code:
                    type: integer
                  message:
                    type: string
                  content:
                    $ref: '#/components/schemas/pipelines_CommandResponse'
        '401':
          description: Command request create error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/pipelines_Error_401_Unauthorized'
    post:
      x-badges:
        - name: Stable
          color: green
      summary: Create an command processor request for Target Run
      security:
        - pipelines_SCAPIAuthToken: []
      operationId: createTargetRunCommand
      tags:
        - pipelines_Target Runs
      parameters:
        - name: stage_run_id
          in: path
          description: ID of the stage run
          required: true
          schema:
            type: string
        - name: target_run_id
          in: path
          description: Id of the target run
          required: true
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/pipelines_AndroidCommandRequest'
      responses:
        '200':
          description: Created command processor request
          content:
            application/json:
              schema:
                type: object
                properties:
                  code:
                    type: integer
                  message:
                    type: string
                  content:
                    $ref: '#/components/schemas/pipelines_CommandResponse'
        '401':
          description: Command request create error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/pipelines_Error_401_Unauthorized'
  /pipelines/v0/stageruns/{stage_run_id}/targetruns/{target_run_id}/command/{command_id}/:
    put:
      x-badges:
        - name: Stable
          color: green
      summary: Update target run command information.
      security:
        - pipelines_SCAPIAuthToken: []
      operationId: putTargetRunCommandStatus
      tags:
        - pipelines_Target Runs
      parameters:
        - name: stage_run_id
          in: path
          description: ID of the stage run
          required: true
          schema:
            type: string
        - name: target_run_id
          in: path
          description: Id of the target run
          required: true
          schema:
            type: string
        - name: command_id
          in: path
          description: Id of the command
          required: true
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/pipelines_CommandRequest_PUT'
      responses:
        '200':
          description: Command processor request status
          content:
            application/json:
              schema:
                type: object
                properties:
                  code:
                    type: integer
                  message:
                    type: string
                  content:
                    $ref: '#/components/schemas/pipelines_CommandResponse'
        '400':
          description: Target run command update error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/pipelines_Error_400_Bad_Data'
  /sys/health:
    get:
      x-badges:
        - name: Stable
          color: green
      summary: Health check endpoint
      security:
        - pipelines_SCAPIAuthToken: []
      operationId: getServiceHealth
      tags:
        - pipelines_System
      responses:
        '200':
          description: Pipelines health service response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/pipelines_Health'
        default:
          description: Unexpected error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/pipelines_Error'
  /device/v0/devices/:
    get:
      x-badges:
        - name: Deprecated
          color: red
      security:
        - device_apiKey: []
      summary: Get all devices in the tenant
      description: >
        Retrieves a paginated list of all devices enrolled in the tenant across
        every supported platform.


        Returns Android, Apple, Linux, and Windows devices in a single unified
        list, with extensive filtering by platform, OS version, group, blueprint
        assignment, connectivity, and more.


        **About Get All Devices**


        This is the multi-platform device list, returning an AndroidDevice,
        AppleDevice, LinuxDevice, or WindowsDevice object depending on each
        device's platform. It's the standard starting point for fleet-wide
        device inventory, auditing, and for finding device IDs to use in
        commands, operations, and Converge actions.


        **Key Fields / Query Parameters**


        platform — filters by ANDROID, APPLE, LINUX, or WINDOWS


        group_multi — filters by one or more group IDs, including their
        subgroups


        assigned_blueprint_id / current_blueprint_id — filters by the blueprint
        a device is assigned to versus the one it's currently converged to,
        useful for finding devices that haven't yet converged to a newly
        assigned blueprint


        search — free-text search that covers name, serial, IMEI, and model
        across platforms, plus platform-specific fields such as udid for Apple
        devices


        state — filters by device enrollment state


        **Common Use Cases**


        Building a fleet inventory view across all platforms


        Finding every device that hasn't yet converged to a newly assigned
        blueprint by comparing assigned_blueprint_id and current_blueprint_id


        Scoping a bulk operation to a specific group before issuing a Converge
        or command request


        **Best Practices**


        Use group_multi or platform filters to scope results before paging
        through very large fleets


        Compare assigned_blueprint_id against current_blueprint_version_id_net
        to catch devices that are out of sync with their intended configuration


        Paginate with limit and offset rather than fetching the full fleet in
        one call for enterprises with large device counts


        **Workflow**


        Call this endpoint with the filters that scope the device set you need


        Page through results using limit and offset


        Use the returned device id values as targets for commands, operations,
        or Converge actions
      operationId: getDeviceList
      tags:
        - device_Device
      parameters:
        - in: query
          name: limit
          schema:
            type: integer
        - in: query
          name: offset
          schema:
            type: integer
        - in: query
          name: ordering
          description: Field to order the results by. Prefix with '-' to reverse the order.
          schema:
            type: string
            enum:
              - alias
              - created_at
              - last_seen
              - model
              - os_version
              - name
              - onboarded_on
              - serial
              - provisioned_on
              - battery_level
              - dpc_version
              - eea_version
              - is_gms
              - security_state
              - wifi_ssid
              - platform
              - template_name
        - in: query
          name: serial
          schema:
            type: string
        - in: query
          name: udid
          schema:
            type: string
        - in: query
          name: android_version
          schema:
            type: string
        - in: query
          name: ios_version
          schema:
            type: string
        - in: query
          name: ipados_version
          schema:
            type: string
        - in: query
          name: tvos_version
          schema:
            type: string
        - in: query
          name: windows_version
          schema:
            type: string
        - in: query
          name: state
          schema:
            type: integer
        - in: query
          name: battery_level_gte
          schema:
            type: string
        - in: query
          name: battery_level_lte
          schema:
            type: string
        - in: query
          name: is_gms
          schema:
            type: boolean
        - in: query
          name: active_connection
          schema:
            type: string
        - in: query
          name: group_multi
          description: >-
            Filter by multiple group ID. Fetch the devices from groups matching
            with the IDs and its subgroup.
          schema:
            type: string
            format: uuid
        - in: query
          name: group_multi_immediate
          description: >-
            Filter by multiple group IDs. Fetch the devices from groups matching
            with the IDs. Excludes devices in any subgroups.
          schema:
            type: string
            format: uuid
        - in: query
          name: assigned_blueprint_id
          schema:
            type: string
            format: uuid
        - in: query
          name: current_blueprint_id
          schema:
            type: string
            format: uuid
        - in: query
          name: current_blueprint_version_id
          schema:
            type: string
            format: uuid
        - in: query
          name: current_blueprint_version_id_net
          schema:
            type: string
            format: uuid
        - in: query
          name: platform
          schema:
            type: string
            enum:
              - ANDROID
              - APPLE
              - LINUX
              - WINDOWS
        - in: query
          name: os
          schema:
            type: string
            enum:
              - iOS
              - iPadOS
              - tvOS
              - Android
              - Linux
              - Windows
        - in: query
          name: device_source
          description: a csv list of device sources [ABM, NON_ABM]
          schema:
            type: string
        - in: query
          name: tags
          description: a csv list of tag UUID's
          schema:
            type: string
        - in: query
          description: >-
            Search devices by multiOS -> name, serial, imei, model. Apple ->
            udid. Android -> iccid, phone number, brand, wifi, manufacturer,
            hardware
          name: search
          schema:
            type: string
        - in: query
          name: foundation_device_model_id
          schema:
            type: string
            format: uuid
        - in: query
          name: android_version_exact
          schema:
            type: string
        - in: query
          name: foundation_major_version
          schema:
            type: integer
        - in: query
          name: foundation_minor_version
          schema:
            type: integer
        - in: query
          name: foundation_build_number
          schema:
            type: integer
        - in: query
          name: airwave_tenant_model_id
          schema:
            type: string
        - in: query
          name: airwave_build_id
          schema:
            type: string
        - in: query
          name: airwave_build_number
          schema:
            type: integer
        - in: query
          name: is_seamless
          schema:
            type: boolean
        - in: query
          name: global_device_id
          schema:
            type: string
      responses:
        '200':
          description: Device information for the Tenant
          content:
            application/json:
              schema:
                type: object
                properties:
                  code:
                    type: integer
                  message:
                    type: string
                  content:
                    type: object
                    properties:
                      count:
                        type: integer
                      previous:
                        type: string
                      next:
                        type: string
                      results:
                        type: array
                        items:
                          oneOf:
                            - $ref: '#/components/schemas/device_AndroidDevice'
                            - $ref: '#/components/schemas/device_AppleDevice'
                            - $ref: '#/components/schemas/device_LinuxDevice'
                            - $ref: '#/components/schemas/device_WindowsDevice'
        '401':
          description: Authorization information is missing or invalid.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/device_Error_401_Unauthorized'
        '500':
          description: Internal Server Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/device_Error_500_Internal_Server_Error'
  /device/v0/devices/{id}/:
    get:
      x-badges:
        - name: Stable
          color: green
      security:
        - device_apiKey: []
      parameters:
        - name: id
          in: path
          description: ID of the device
          required: true
          schema:
            type: string
            format: uuid
      summary: Get details of a Device
      description: >
        Retrieves the full detail record for a single device by its ID.


        Returns the same platform-specific device object (Apple, Android, Linux,
        or Windows) used in the device list, but scoped to one device, including
        hardware identifiers, OS version, connectivity, and current blueprint
        assignment.


        **About Get Device Detail**


        This is the single-device counterpart to GET /device/v0/devices/, useful
        once you already have a device id and need its full current record
        rather than a filtered list. The response shape depends on the device's
        platform, so integrations should handle each of the possible device
        object types.


        **Common Use Cases**


        Looking up a device's full configuration and status before issuing a
        command or Converge action


        Verifying a device's current blueprint and OS version during
        troubleshooting


        **Best Practices**


        Confirm the device id is correct before relying on a 404 to mean the
        device doesn't exist, since it could also indicate the ID belongs to a
        different tenant


        Use GET /device/v0/devices/{id}/devicestate for a lighter-weight check
        when you only need current state rather than the full device record


        **Workflow**


        Obtain the device id from the device list or from a prior command or
        operation response


        Call this endpoint to retrieve the full device record


        Use the device's platform and current_blueprint_version_id to decide on
        next steps
      operationId: getDeviceRequest
      tags:
        - device_Device
      responses:
        '200':
          description: Details of the device
          content:
            application/json:
              schema:
                type: object
                properties:
                  code:
                    type: integer
                  message:
                    type: string
                  content:
                    oneOf:
                      - $ref: '#/components/schemas/device_AppleDevice'
                      - $ref: '#/components/schemas/device_AndroidDevice'
                      - $ref: '#/components/schemas/device_LinuxDevice'
                      - $ref: '#/components/schemas/device_WindowsDevice'
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/device_Error_400_Bad_Data'
        '401':
          description: Authorization information is missing or invalid.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/device_Error_401_Unauthorized'
        '404':
          description: Not found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/device_Error_404_Not_Found'
        '500':
          description: Internal Server Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/device_Error_500_Internal_Server_Error'
    delete:
      x-badges:
        - name: Stable
          color: green
      summary: Delete a device. Currently supported by iOS, Linux and Windows devices.
      operationId: deleteDeviceRequest
      tags:
        - device_Device
      security:
        - device_apiKey: []
      parameters:
        - name: id
          in: path
          description: ID of the device
          required: true
          schema:
            type: string
      responses:
        '200':
          description: Details of the device
          content:
            application/json:
              schema:
                type: object
                properties:
                  code:
                    type: integer
                  message:
                    type: string
                  content:
                    oneOf:
                      - $ref: '#/components/schemas/device_AppleDevice'
                      - $ref: '#/components/schemas/device_LinuxDevice'
                      - $ref: '#/components/schemas/device_WindowsDevice'
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/device_Error_400_Bad_Data'
        '401':
          description: Authorization information is missing or invalid.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/device_Error_401_Unauthorized'
        '404':
          description: Device not found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/device_Error_404_Not_Found'
        '500':
          description: Internal Server Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/device_Error_500_Internal_Server_Error'
  /device/v0/devices/{id}/devicestate:
    get:
      x-badges:
        - name: Stable
          color: green
      summary: Get details of Current Device State
      description: >
        Retrieves the current settings and state snapshot for a single device.


        Returns the DeviceSettings object representing the device's live
        configuration state, distinct from the broader device record returned by
        the main device detail endpoint.


        **About Get Device State**


        While GET /device/v0/devices/{id}/ returns a device's overall record
        (hardware, OS, blueprint assignment, and so on), this endpoint returns
        its current settings state specifically. It's a lighter-weight check
        when the only thing you need is the device's live configuration snapshot
        rather than its full profile.


        **Common Use Cases**


        Checking a device's current settings state without pulling its full
        device record


        Confirming a configuration change has actually taken effect on the
        device


        **Best Practices**


        Use this endpoint instead of the full device detail endpoint when
        polling repeatedly for state changes, to reduce response size


        Compare the returned state against the blueprint version a device was
        converged to, to confirm the Converge action applied as expected


        **Workflow**


        Obtain the device id


        Call this endpoint to retrieve its current state


        Compare against the expected blueprint or command outcome to confirm the
        change took effect
      operationId: getDeviceStateRequest
      tags:
        - device_Device
      security:
        - device_apiKey: []
      parameters:
        - name: id
          in: path
          description: ID of the device
          required: true
          schema:
            type: string
            format: uuid
      responses:
        '200':
          description: Details of the current device state
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/device_DeviceSettings'
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/device_Error_400_Bad_Data'
        '401':
          description: Authorization information is missing or invalid.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/device_Error_401_Unauthorized'
        '404':
          description: Not found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/device_Error_404_Not_Found'
        '500':
          description: Internal Server Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/device_Error_500_Internal_Server_Error'
  /v2/devices/{id}/devicestate:
    put:
      x-badges:
        - name: Stable
          color: green
      summary: Receive device state report and publish to Kafka for drift detection
      description: >-
        Accepts a device state report and forwards it (as-is) to Kafka topic
        `esper.device.device.state` after enriching with `tenant_id` and
        `device_id`.
      operationId: updateDeviceState
      tags:
        - device_Device
      security:
        - device_apiKey: []
      parameters:
        - name: id
          in: path
          description: ID of the device
          required: true
          schema:
            type: string
            format: uuid
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - device_settings
              properties:
                event_ts:
                  type: number
                  description: Event timestamp in milliseconds since epoch
                device_settings:
                  type: object
                  description: >-
                    Partial settings payload containing only changed keys
                    (sparse object)
                  additionalProperties: true
              additionalProperties: true
      responses:
        '201':
          description: Created
          content:
            application/json:
              schema:
                type: object
                properties:
                  content:
                    type: object
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/device_Error_400_Bad_Data'
        '401':
          description: Authorization information is missing or invalid.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/device_Error_401_Unauthorized'
        '500':
          description: Internal Server Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/device_Error_500_Internal_Server_Error'
  /v2/devices/:
    get:
      x-badges:
        - name: Stable
          color: green
      security:
        - device_apiKey: []
      summary: Get all devices in the tenant
      description: >
        Retrieves a paginated list of all devices enrolled in the tenant, across
        all platforms, using the V2 device schema.


        Returns richer device records than the v0 equivalent, with expanded
        filter support including managed_by, policy_multi, template_multi,
        is_locked_down, extended search coverage, and esper_agent_version_name
        for Esper agent version filtering.


        **About List All Devices (V2)**


        This is the current recommended device list endpoint. Compared to
        /api/device/v0/devices/, V2 adds several filters valuable for fleet
        management at scale: managed_by distinguishes blueprint-managed from
        template-managed devices; policy_multi and template_multi allow
        multi-value policy/template filtering; is_locked_down targets
        locked-down devices; and the search field covers more Android-specific
        identifiers including WiFi MAC address, SIM operator, network operator,
        and IP address. Results are returned as device objects.


        **Key Query Parameters**


        managed_by — Filter by management mode: BLUEPRINT or TEMPLATE


        policy_multi — CSV list of policy names to filter by


        template_multi — CSV list of template names to filter by


        is_locked_down — Filter to locked-down devices only


        esper_agent_version_name — Filter by Esper agent (DPC) version name


        foundation_version — Full Foundry OS version string (e.g.,
        os_version.major.minor.build or eea_version)


        search — Extended Android search: name, serial, IMEI, model, ICCID,
        phone, brand, WiFi, manufacturer, WiFi MAC, SIM operator, network
        operator, IP address


        All v0 filters are also available: platform, os, group_multi,
        group_multi_immediate, assigned_blueprint_id, current_blueprint_id,
        current_blueprint_version_id_net, state, battery_level_gte/lte, tags,
        device_source, udid, serial


        **Common Use Cases**


        Identifying all devices not yet on the latest blueprint version for
        targeted update campaigns


        Filtering by managed_by=TEMPLATE to locate devices still on legacy
        template management


        Querying all locked-down devices by group for compliance auditing


        **Best Practices**


        Prefer this endpoint over /api/device/v0/devices/ for all new
        integrations


        Use platform as a CSV list (e.g., ANDROID,APPLE) to query multiple
        platforms in one call


        For Foundry OS fleet management, use foundation_version or the granular
        foundation_major_version, foundation_minor_version,
        foundation_build_number filters


        **Workflow**


        Choose filters appropriate to the use case (group, platform, blueprint
        version, policy, etc.)


        Call with limit and offset for pagination


        Iterate results, using next for subsequent pages; branch on the platform
        field to handle per-platform schema differences
      tags:
        - device_Device
      parameters:
        - in: query
          name: limit
          schema:
            type: integer
            default: 10
            maximum: 1000
        - in: query
          name: offset
          schema:
            type: integer
        - in: query
          name: cursor
          description: >
            Opaque cursor token for cursor-based pagination.

            - Use `start` to begin from the first page

            - Use the `next_cursor` value from previous response for subsequent
            pages

            - Use the `prev_cursor` value from previous response to navigate
            backward

            - When provided, offset parameter is ignored
          schema:
            type: string
            example: start
        - in: query
          name: ordering
          description: Field to order the results by. Prefix with '-' to reverse the order.
          schema:
            type: string
            enum:
              - alias
              - created_at
              - last_seen
              - model
              - os_version
              - name
              - serial
              - provisioned_on
              - battery_level
              - dpc_version
              - eea_version
              - is_gms
              - security_state
              - wifi_ssid
              - platform
              - template_name
              - policy_name
              - state
        - in: query
          name: serial
          schema:
            type: string
        - in: query
          name: udid
          schema:
            type: string
        - in: query
          name: android_version
          schema:
            type: string
        - in: query
          name: ios_version
          schema:
            type: string
        - in: query
          name: ipados_version
          schema:
            type: string
        - in: query
          name: tvos_version
          schema:
            type: string
        - in: query
          name: windows_version
          schema:
            type: string
        - in: query
          name: state
          schema:
            type: string
        - in: query
          name: battery_level_gte
          schema:
            type: string
        - in: query
          name: battery_level_lte
          schema:
            type: string
        - in: query
          name: is_gms
          schema:
            type: boolean
        - in: query
          name: active_connection
          schema:
            type: string
        - in: query
          name: group_multi
          description: >-
            Filter by multiple group ID. Fetch the devices from groups matching
            with the IDs and its subgroup.
          schema:
            type: string
            format: uuid
        - in: query
          name: group_multi_immediate
          description: >-
            Filter by multiple group IDs. Fetch the devices from groups matching
            with the IDs. Excludes devices in any subgroups.
          schema:
            type: string
            format: uuid
        - in: query
          name: assigned_blueprint_id
          schema:
            type: string
            format: uuid
        - in: query
          name: current_blueprint_id
          schema:
            type: string
            format: uuid
        - in: query
          name: current_blueprint_version_id
          schema:
            type: string
            format: uuid
        - in: query
          name: current_blueprint_version_id_net
          schema:
            type: string
            format: uuid
        - in: query
          name: platform
          description: a csv list of platforms [ANDROID, APPLE, LINUX, WINDOWS]
          schema:
            type: string
        - in: query
          name: os
          schema:
            type: string
            enum:
              - iOS
              - iPadOS
              - tvOS
              - Android
              - Linux
              - Windows
        - in: query
          name: device_source
          description: a csv list of device sources [ABM, NON_ABM]
          schema:
            type: string
        - in: query
          name: managed_by
          schema:
            type: string
            enum:
              - BLUEPRINT
              - TEMPLATE
        - in: query
          name: template_multi
          description: a csv list of template names
          schema:
            type: string
        - in: query
          name: policy_multi
          description: a csv list of policy names
          schema:
            type: string
        - in: query
          description: >-
            Search devices by multiOS -> Name, Serial, IMEI, Model, WiFi SSID,
            Apple UDID, ICCID1, ICCID2, Brand, Manufacturer, Hardware, WiFi MAC
            Address, SIM Operator, Network Operator and IP Address.
          name: search
          schema:
            type: string
        - in: query
          name: foundation_device_model_id
          schema:
            type: string
            format: uuid
        - in: query
          name: android_version_exact
          schema:
            type: string
        - in: query
          name: foundation_major_version
          schema:
            type: integer
        - in: query
          name: foundation_minor_version
          schema:
            type: integer
        - in: query
          name: foundation_build_number
          schema:
            type: integer
        - in: query
          name: airwave_tenant_model_id
          schema:
            type: string
        - in: query
          name: airwave_build_id
          schema:
            type: string
        - in: query
          name: airwave_build_number
          schema:
            type: integer
        - in: query
          name: foundation_version
          description: >-
            Filter by one or more full foundation version strings
            (os_version.major.minor.build or eea_version). Multiple values can
            be passed as a comma-separated list (e.g.
            ?foundation_version=1.0-arm64-20210617-RELEASE,1.0-sb30-20210302-DEBUG),
            consistent with other multi-value filters.
          schema:
            type: string
        - in: query
          name: esper_agent_version_name
          description: Filter devices by Esper agent version name (DPC version)
          schema:
            type: string
        - in: query
          name: tags
          description: a csv list of tag ids
          schema:
            type: string
        - in: query
          name: is_locked_down
          schema:
            type: boolean
        - in: query
          name: global_device_id
          schema:
            type: string
        - in: query
          name: ungrouped_only
          description: >-
            When true, returns only devices that are not associated with any
            group
          schema:
            type: boolean
        - in: query
          name: fields
          description: >
            Sparse fieldset: comma-separated list of top-level response field
            names to return (e.g. `fields=id,name,created_at`).

            - `id` is always included in the response regardless of whether it
            is requested.

            - Only top-level fields are supported; nested sub-fields (e.g.
            within `hardware_info`) cannot be selected individually.

            - Requesting an unknown field name returns a 400 error.

            - Omit this parameter to receive the full device object.
          schema:
            type: string
            example: id,name,created_at
      responses:
        '200':
          description: >
            Device information for the Tenant.

            Response format depends on pagination type used:

            - **Offset-based**: Returns `count`, `prev`, `next` (URLs),
            `results`

            - **Cursor-based**: Returns `results`, `next_cursor`, `prev_cursor`
          content:
            application/json:
              schema:
                type: object
                properties:
                  content:
                    oneOf:
                      - $ref: '#/components/schemas/device_OffsetPaginatedDeviceList'
                      - $ref: '#/components/schemas/device_CursorPaginatedDeviceList'
        '400':
          description: Bad Request.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/device_Error_400_Bad_Data'
        '401':
          description: Authorization information is missing or invalid.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/device_Error_401_Unauthorized'
        '500':
          description: Internal Server Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/device_Error_500_Internal_Server_Error'
  /v2/devices/{id}:
    get:
      x-badges:
        - name: Stable
          color: green
      security:
        - device_apiKey: []
      summary: Retrieve detailed device information.
      description: >
        Retrieves comprehensive details for a single enrolled device by UUID,
        using the V2 device schema.


        Returns a V2 platform-typed device record with richer fields than the v0
        equivalent, for all supported Esper-managed platforms.


        **About Get Device Details (V2)**


        This is the recommended endpoint for single-device lookups in new
        integrations. The V2 device schema provides additional fields compared
        to the v0 schema and aligns with the richer data model returned by
        /api/v2/devices/. Like the list endpoint, the response is polymorphic —
        the exact fields depend on the device platform. 


        **Key Fields**


        id (path) — Esper device UUID (required)


        **Common Use Cases**


        Fetching full device context before constructing a pipeline or operation


        Retrieving V2-specific fields like Foundry OS version, Esper agent
        version, or lock-down state


        Integrating device data into external ITSM, asset management, or
        monitoring systems


        **Best Practices**


        Prefer this over /api/device/v0/devices/{id}/ for all new integrations


        Inspect the platform field to determine which V2 schema variant applies
        before parsing


        Use the heartbeat endpoints for lightweight connectivity checks rather
        than polling this endpoint
      tags:
        - device_Device
      parameters:
        - name: id
          in: path
          description: ID of the device
          required: true
          schema:
            type: string
            format: uuid
      responses:
        '200':
          description: Detailed information of the device
          content:
            application/json:
              schema:
                type: object
                properties:
                  code:
                    type: integer
                  message:
                    type: string
                  content:
                    oneOf:
                      - $ref: '#/components/schemas/device_AppleDeviceV2'
                      - $ref: '#/components/schemas/device_AndroidDeviceV2'
                      - $ref: '#/components/schemas/device_LinuxDeviceV2'
                      - $ref: '#/components/schemas/device_WindowsDeviceV2'
        '400':
          description: Bad Request.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/device_Error_400_Bad_Data'
        '401':
          description: Authorization information is missing or invalid.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/device_Error_401_Unauthorized'
        '404':
          description: Device not found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/device_Error_404_Not_Found'
        '500':
          description: Internal Server Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/device_Error_500_Internal_Server_Error'
  /device/v0/heartbeat/{id}/:
    get:
      x-badges:
        - name: Stable
          color: green
      summary: Get heartbeat of a device which contains last seen information
      description: >
        Retrieves the last-seen heartbeat record for a single device, including
        its most recent check-in timestamp.


        Returns the device UUID, the last-seen timestamp, and a legacy status
        flag indicating whether the device was seen within the last 30 minutes
        (1) or not (0).


        **About Get Device Heartbeat (v0)**


        The heartbeat endpoint provides a lightweight alternative to a full
        device fetch when only connectivity recency is needed. The status field
        is a legacy binary indicator (1 = seen in the last 30 minutes, 0 = not
        seen) and should not be used as the sole signal for device availability
        in new integrations — use the timestamp directly for more precise
        evaluation. For bulk heartbeat queries across all devices within a time
        window, use /api/v2/heartbeat/.


        **Key Fields**


        device_id — UUID of the device


        timestamp — ISO 8601 datetime of the device's last check-in


        status — Legacy field: 1 if last seen within 30 minutes, 0 otherwise


        **Common Use Cases**


        Confirming a specific device is online before triggering a remote
        operation


        Displaying last-seen timestamps in a device monitoring dashboard


        Lightweight polling loop to detect when a device comes back online


        **Best Practices**


        Use timestamp rather than status for precision — status is a legacy
        30-minute binary bucket and is not suitable for finer-grained
        availability logic


        For checking connectivity across many devices in a time window, use
        /api/v2/heartbeat/ instead


        Avoid polling this endpoint at high frequency; prefer event-driven or
        scheduled checks
      operationId: getDeviceHeartbeat
      tags:
        - device_Device Heartbeat
      security:
        - device_apiKey: []
      parameters:
        - name: id
          in: path
          description: ID of the device
          required: true
          schema:
            type: string
            format: uuid
      responses:
        '200':
          description: Last seen details of the device
          content:
            application/json:
              schema:
                type: object
                properties:
                  code:
                    type: integer
                  message:
                    type: string
                  content:
                    $ref: '#/components/schemas/device_EsperDeviceHeartbeat'
        '401':
          description: Authorization information is missing or invalid.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/device_Error_401_Unauthorized'
        '404':
          description: Not found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/device_Error_404_Not_Found'
        '500':
          description: Internal Server Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/device_Error_500_Internal_Server_Error'
  /v2/heartbeat/:
    get:
      x-badges:
        - name: Stable
          color: green
      summary: Get list of heartbeat for all devices
      description: >
        Retrieves heartbeat records for all devices whose last-seen timestamp
        falls within a specified date-time range.


        Requires last_seen_gt and last_seen_lt query parameters to define the
        time window, and optionally filters by platform. Returns a paginated
        list of EsperDeviceHeartbeat records, each containing device UUID,
        last-seen timestamp, and a legacy status flag.


        **About List Device Heartbeats (V2)**


        This endpoint enables bulk connectivity queries across the entire device
        fleet, useful for fleet health monitoring, SLA reporting, and
        identifying devices that have gone silent over a defined period. The
        required time window filters mean queries are always bounded, preventing
        inadvertent large data pulls. The platform filter can be used to narrow
        results to a specific OS family. As with the single-device heartbeat
        endpoint, the status field is a legacy 30-minute binary indicator; use
        timestamp values directly for precision analysis.


        **Key Query Parameters**


        last_seen_gt (required) — Start of the time window in ISO 8601 format
        (e.g., 2024-01-01T00:00:00Z)


        last_seen_lt (required) — End of the time window in ISO 8601 format


        platform — Optional platform filter: ANDROID, APPLE, LINUX, or WINDOWS


        limit / offset — Pagination controls


        **Common Use Cases**


        Generating daily fleet health reports showing which devices checked in
        during the past 24 hours


        Identifying devices that have gone silent (not seen within a defined
        window) for incident response


        Producing SLA-aligned uptime evidence for specific device cohorts


        **Best Practices**


        Keep the time window reasonably narrow for large fleets to limit result
        set size and response latency


        Use platform to scope queries when platform-specific reporting is needed


        Use timestamp from each result record for precise analysis; do not rely
        on the legacy status field for business logic


        **Workflow**


        Define the time window using last_seen_gt and last_seen_lt (both
        required)


        Optionally add platform to narrow results


        Paginate through results; devices appearing in the result set were seen
        within the window
      operationId: getDeviceHeartbeatList
      tags:
        - device_Device Heartbeat
      security:
        - device_apiKey: []
      parameters:
        - name: last_seen_gt
          in: query
          description: >-
            Specify the starting date and time for device lookup in the format
            (2023-08-29T00:00:00Z).
          required: true
          schema:
            type: string
            format: date-time
            example: '2023-08-29T00:00:00Z'
        - name: last_seen_lt
          in: query
          description: >-
            Specify the end date and time for device lookup in the format
            (2023-08-30T00:00:00Z).
          required: true
          schema:
            type: string
            format: date-time
            example: '2023-08-30T00:00:00Z'
        - name: platform
          in: query
          description: platform of the device
          schema:
            type: string
            enum:
              - ANDROID
              - APPLE
              - LINUX
              - WINDOWS
        - in: query
          name: limit
          schema:
            type: integer
        - in: query
          name: offset
          schema:
            type: integer
      responses:
        '200':
          description: Last seen details of the device
          content:
            application/json:
              schema:
                type: object
                properties:
                  code:
                    type: integer
                  message:
                    type: string
                  content:
                    $ref: '#/components/schemas/device_DeviceLastSeen'
        '400':
          description: Device create error - Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/device_Error_400_Bad_Data'
        '401':
          description: Authorization information is missing or invalid.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/device_Error_401_Unauthorized'
        '500':
          description: Internal Server Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/device_Error_500_Internal_Server_Error'
  /v2/devices/{deviceId}/device-apps/:
    get:
      x-badges:
        - name: Stable
          color: green
      security:
        - device_apiKey: []
      summary: Get all apps for a device in the tenant
      description: >
        Retrieves a paginated list of every app installed on a specific device.


        Returns each app's DeviceAppsResponse record, filterable by app type
        such as VPP, tenant-uploaded iOS or Windows apps, Esper iOS apps, or
        webclips.


        **About Get Device Apps**


        This is the v2 device-scoped app inventory, showing exactly what's
        installed on one device across its supported app types. It complements
        the tenant-wide app catalogs (Tenant Apps, Tenant Esper Apps, VPP) by
        showing installation state on a specific device rather than what's
        available to install.


        **Key Fields / Query Parameters**


        app type — filters by one or more app types, comma-separated, for
        example VPP, TENANT_IOS, or WEBCLIP


        **Common Use Cases**


        Auditing exactly which apps are installed on a specific device


        Confirming an app installed through a command or Converge action
        actually landed on the target device


        Filtering by app type to check only VPP-licensed apps or only webclips
        on a device


        **Best Practices**


        Filter by app type when you only care about one category, rather than
        paging through every installed app


        Cross-reference results against the Tenant Apps or Tenant Esper Apps
        catalog to confirm a device has the expected version installed


        **Workflow**


        Obtain the deviceId


        Call this endpoint, optionally filtering by app type


        Compare the results against the expected app list from a blueprint or
        command
      tags:
        - device_Device Apps
      parameters:
        - name: deviceId
          in: path
          description: ID of the device
          required: true
          schema:
            type: string
        - name: app type
          in: query
          description: >-
            App Type to filter list by, supports multiple values separated by
            comma
          schema:
            type: string
            enum:
              - VPP
              - TENANT_IOS
              - ESPER_IOS
              - WEBCLIP
              - ESPER_WINDOWS
              - TENANT_WINDOWS
              - TENANT_WINDOWS_EXE
              - TENANT_WINDOWS_UWP
        - in: query
          name: limit
          schema:
            type: integer
        - in: query
          name: offset
          schema:
            type: integer
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                type: object
                properties:
                  results:
                    type: array
                    items:
                      $ref: '#/components/schemas/device_DeviceAppsResponse'
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/device_Error_400_Bad_Data'
        '401':
          description: Authorization information is missing or invalid.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/device_Error_401_Unauthorized'
        '500':
          description: Internal Server Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/device_Error_500_Internal_Server_Error'
  /v2/device-apps:
    get:
      x-badges:
        - name: Stable
          color: green
      security:
        - device_apiKey: []
      summary: Get list of devices with an app by app_id or app_version_id.
      description: >
        iOS/iPadOS/tvOS/Windows only


        Retrieves a list of device IDs that have a specific app or app version
        associated, identified by app_id or app_version_id.


        Both app_id and app_version_id are required query parameters; the
        endpoint returns a paginated list of device UUIDs matching the
        association.


        **About List Devices by App**


        This endpoint inverts the typical device→apps query: given an app (or
        specific version), it returns the set of devices associated with it.
        This is useful for determining deployment coverage of a specific app
        version across a fleet. The response contains device UUIDs only — full
        device details require a subsequent call to GET /api/v2/devices/{id}.
        This endpoint is associated with the iOS and Windows Device Apps tag
        context; Android app associations are not covered.


        **Key Query Parameters**


        app_id (required) — Esper UUID of the application


        app_version_id (required) — Esper UUID of the specific app version


        **Common Use Cases**


        Determining which devices have a specific app version deployed for
        targeted update campaigns


        Auditing app version coverage across iOS or Windows device fleets


        Building a list of affected devices before pushing an app update or
        removal


        **Best Practices**


        Both app_id and app_version_id are required — the endpoint will return a
        400 if either is omitted


        Use the returned device_id values to query GET /api/v2/devices/{id} for
        full device context


        Paginate using prev/next for large result sets


        **Workflow**


        Obtain the app_id and app_version_id from the application management
        endpoints


        Call with both required parameters


        Use the returned device_id list to drive subsequent operations or
        lookups
      tags:
        - device_Device Apps
      parameters:
        - in: query
          name: app_id
          required: false
          description: >-
            ID of the app. Either app_id or app_version_id must be provided.
            Mandatory when app_version_id_not is provided.
          schema:
            type: string
            format: uuid
        - in: query
          name: app_version_id
          required: false
          description: >-
            ID of the app version to match. Either app_id or app_version_id must
            be provided. Cannot be used together with app_version_id_not.
          schema:
            type: string
            format: uuid
        - in: query
          name: app_version_id_not
          required: false
          description: >-
            ID of the app version to exclude. Returns devices whose
            app_version_id is not equal to this value. Requires app_id and
            cannot be used together with app_version_id.
          schema:
            type: string
            format: uuid
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                type: object
                properties:
                  count:
                    type: integer
                  prev:
                    type: string
                  next:
                    type: string
                  results:
                    type: array
                    items:
                      type: object
                      properties:
                        device_id:
                          type: string
                          format: uuid
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/device_Error_400_Bad_Data'
        '401':
          description: Authorization information is missing or invalid.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/device_Error_401_Unauthorized'
        '500':
          description: Internal Server Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/device_Error_500_Internal_Server_Error'
  /v2/devices/{deviceId}/google-accounts/policy/:
    get:
      x-badges:
        - name: Stable
          color: green
      summary: Get the Google EMM Policy details for a specific device.
      tags:
        - device_Device Enrollment in EMM
      parameters:
        - name: deviceId
          in: path
          description: ID of the device for which to retrieve the Google EMM policy
          required: true
          schema:
            type: string
            format: uuid
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/device_GoogleEMMDevice'
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/device_Error_400_Bad_Data'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/device_Error_401_Unauthorized'
        '404':
          description: Not found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/device_Error_404_Not_Found'
        '500':
          description: Internal Server Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/device_Error_500_Internal_Server_Error'
    put:
      x-badges:
        - name: Stable
          color: green
      summary: Update the Google EMM Policy details for a specific device.
      tags:
        - device_Device Enrollment in EMM
      parameters:
        - name: deviceId
          in: path
          description: >-
            The unique identifier of the device for which Google account details
            need to be updated.
          required: true
          schema:
            type: string
            format: uuid
        - name: is_provisioning
          in: query
          description: >-
            Flag indicating if provisioning is enabled (true or false). Default
            is false.
          required: false
          schema:
            type: string
            default: 'false'
        - name: is_converging
          in: query
          description: >-
            Flag indicating if convergence is enabled (true or false). Default
            is false.
          required: false
          schema:
            type: string
            default: 'false'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/device_GoogleEMMDevicePolicyRequest'
      responses:
        '200':
          description: >-
            Successfully updated the Google EMM policy details for the specified
            device.
          content:
            application/json:
              schema:
                type: object
                properties:
                  content:
                    $ref: '#/components/schemas/device_GoogleEMMDevice'
        '400':
          description: Bad request due to invalid input.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/device_Error_400_Bad_Data'
        '401':
          description: Unauthorized access.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/device_Error_401_Unauthorized'
        '404':
          description: Device not found for the provided deviceId.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/device_Error_404_Not_Found'
        '500':
          description: Internal server error occurred while processing the request.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/device_Error_500_Internal_Server_Error'
  /v2/devices/{deviceId}/google-accounts/emm-managed/:
    get:
      x-badges:
        - name: Stable
          color: green
      summary: Get the List of Google EMM Managed Devices for a user's devices.
      tags:
        - device_Device Enrollment in EMM
      parameters:
        - name: deviceId
          in: path
          description: ID of the device for which to retrieve the Google EMM policy
          required: true
          schema:
            type: string
            format: uuid
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/device_DevicesListResponse'
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/device_Error_400_Bad_Data'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/device_Error_401_Unauthorized'
        '404':
          description: Not found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/device_Error_404_Not_Found'
        '500':
          description: Internal Server Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/device_Error_500_Internal_Server_Error'
  /v2/devices/{deviceId}/google-accounts/:
    get:
      x-badges:
        - name: Stable
          color: green
      summary: >-
        Return the Google account details of the EMM enrollment stored in the
        database for the specified device.
      tags:
        - device_Device Enrollment in EMM
      parameters:
        - name: deviceId
          in: path
          description: ID of the device for which to retrieve the EMM enrollment status
          required: true
          schema:
            type: string
            format: uuid
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                type: object
                properties:
                  content:
                    type: object
                    properties:
                      count:
                        type: integer
                      previous:
                        type: string
                      next:
                        type: string
                      results:
                        type: array
                        items:
                          $ref: '#/components/schemas/device_GoogleAccount'
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/device_Error_400_Bad_Data'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/device_Error_401_Unauthorized'
        '500':
          description: Internal Server Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/device_Error_500_Internal_Server_Error'
    put:
      x-badges:
        - name: Stable
          color: green
      summary: >-
        Update the Google account details of the EMM enrollment stored in the
        database for a specific device.
      tags:
        - device_Device Enrollment in EMM
      parameters:
        - name: deviceId
          in: path
          description: >-
            The unique identifier of the device for which Google account details
            need to be updated.
          required: true
          schema:
            type: string
            format: uuid
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/device_GoogleAccountUpdateRequestBody'
      responses:
        '200':
          description: Successfully updated the Google account details.
          content:
            application/json:
              schema:
                type: object
                properties:
                  content:
                    $ref: >-
                      #/components/schemas/device_GoogleAccountUpdateResponseBody
        '400':
          description: Bad request due to invalid input.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/device_Error_400_Bad_Data'
        '401':
          description: Unauthorized access.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/device_Error_401_Unauthorized'
        '404':
          description: Device not found for the provided deviceId.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/device_Error_404_Not_Found'
        '500':
          description: Internal server error occurred while processing the request.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/device_Error_500_Internal_Server_Error'
    post:
      x-badges:
        - name: Stable
          color: green
      summary: >-
        Create a Google user and, if request body is not provided, generate a
        Google auth token for a specific device on the Google EMM side.
      tags:
        - device_Device Enrollment in EMM
      parameters:
        - name: deviceId
          in: path
          description: >-
            The unique identifier of the device for which Google account details
            need to be updated.
          required: true
          schema:
            type: string
            format: uuid
      requestBody:
        required: false
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/device_GoogleAccount'
      responses:
        '200':
          description: Successfully updated the Google account details.
          content:
            application/json:
              schema:
                type: object
                properties:
                  content:
                    $ref: '#/components/schemas/device_GoogleAccount'
        '401':
          description: Unauthorized access.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/device_Error_401_Unauthorized'
        '404':
          description: Device not found for the provided deviceId.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/device_Error_404_Not_Found'
        '409':
          description: Conflict
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/device_Error_409_Conflict'
        '500':
          description: Internal server error occurred while processing the request.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/device_Error_500_Internal_Server_Error'
    delete:
      x-badges:
        - name: Stable
          color: green
      summary: Unenrolls device from Google EMM and deletes the Google account details.
      description: >
        Unenrolls a device from Google EMM and deletes its stored Google account
        details.


        Permanently removes the GoogleAccount record associated with the device,
        unenrolling it from Android Enterprise (Google EMM) management for that
        device.


        **About Unenroll Device from Google EMM**

        ⚠️ Android only. This endpoint applies to devices enrolled in Android
        Enterprise through Google EMM (managed Google Play). Deleting the
        account record unenrolls the device from Google EMM and removes its
        stored Google account details, which affects the device's ability to
        install and manage EMM-distributed apps until it is re-enrolled.


        **Common Use Cases**


        Unenrolling a device from Google EMM before decommissioning or
        reassigning it


        Clearing a corrupted or stale Google account record so the device can be
        re-enrolled cleanly


        **Best Practices**


        Confirm the device no longer needs EMM-managed app access before
        unenrolling, since this removes its Google account details entirely


        Re-enrollment requires creating a new Google account record through POST
        /v2/devices/{deviceId}/google-accounts/ rather than restoring the
        deleted one


        **Workflow**


        Confirm the device's current EMM enrollment with GET
        /v2/devices/{deviceId}/google-accounts/


        DELETE the Google account record to unenroll the device


        Re-enroll with a new POST request if the device needs EMM access again
        later
      tags:
        - device_Device Enrollment in EMM
      parameters:
        - name: deviceId
          in: path
          description: >-
            The unique identifier of the device for which Google account details
            need to be updated.
          required: true
          schema:
            type: string
            format: uuid
      responses:
        '200':
          description: Successfully unenrolled and deleted the Google account details.
          content:
            application/json:
              schema:
                type: object
                properties:
                  content:
                    $ref: '#/components/schemas/device_GoogleAccount'
        '401':
          description: Unauthorized access.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/device_Error_401_Unauthorized'
        '404':
          description: Device not found for the provided deviceId.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/device_Error_404_Not_Found'
        '500':
          description: Internal server error occurred while processing the request.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/device_Error_500_Internal_Server_Error'
  /v0/operations/:
    get:
      x-badges:
        - name: Stable
          color: green
      summary: Get all Operations in the Tenant
      description: >
        Retrieves a paginated list of all Dispatch operations created within the
        tenant.


        Use this endpoint to see every large-scale fleet operation issued
        through the Operations API, including Converge actions and group-level
        app installs and uninstalls, along with each operation's aggregate
        progress. Supports filtering by state, operation type, and group.


        **About Operations (Dispatch Commands)**


        Operations, also called Dispatch commands, are designed for large fleet
        actions that need to be issued once and tracked as a single unit rather
        than as many individual device commands. Currently supported operation
        types are CONVERGE and group-level app INSTALL and UNINSTALL (immediate
        only). Each operation moves through a lifecycle from Created through
        Dispatching, Dispatched, and Processing to a final Success or Failure,
        and this endpoint surfaces that lifecycle across every operation in the
        tenant.


        **Key Fields / Query Parameters**


        state — filters by operation state using integer codes, for example 10
        for Created, 50 for Dispatched, 80 for Success, and 90 for Failure


        operation_type — filters by type, for example CONVERGE, INSTALL, or
        UNINSTALL


        group_multi — filters to operations targeting one or more group IDs and
        their subgroups


        ordering — orders results by created_at, state, or updated_at; prefix
        with a minus sign to reverse order


        **Common Use Cases**


        Auditing every Converge operation issued across the tenant over a time
        period


        Finding all operations currently stuck in a Dispatching or Processing
        state, which usually points to device connectivity issues


        Filtering operations by group to review fleet actions scoped to a
        specific store or region


        **Best Practices**


        Filter by operation_type and state together to narrow large result sets
        before paging through them


        Investigate operations that remain in Dispatched or Processing for an
        extended period, since this usually indicates devices are not picking up
        the command due to network issues


        Use group_multi rather than fetching all operations and filtering
        client-side when working with group-scoped fleets


        **Workflow**


        Call this endpoint with the desired state or operation_type filters


        Identify the operation of interest and note its id


        Call GET /v0/operations/{operationId}/ for the full status and aggregate
        device counts


        Drill into GET /v0/operations/{operationsId}/devices/ if the operation
        shows failures
      operationId: getOperationsList
      tags:
        - device_Operations
      security:
        - device_apiKey: []
      parameters:
        - in: query
          name: limit
          schema:
            type: integer
        - in: query
          name: offset
          schema:
            type: integer
        - in: query
          name: state
          schema:
            type: integer
          description: >
            Following are the Operation States and their corresponding integer
            values

            ```

            OPERATION_CREATED      = 10

            OPERATION_RESOLVING    = 20

            OPERATION_RESOLVED     = 30

            OPERATION_DISPATCHING  = 40

            OPERATION_DISPATCHED   = 50

            OPERATION_PROCESSING   = 60

            OPERATION_COMPLETED    = 70

            OPERATION_SUCCESS      = 80

            OPERATION_FAILURE      = 90

            OPERATION_SCHEDULED    = 100

            OPERATION_CANCELLED    = 110

            OPERATION_TIMEOUT      = 120

            ```
        - in: query
          name: ordering
          description: Field to order the results by. Prefix with '-' to reverse the order.
          schema:
            type: string
            enum:
              - created_at
              - state
              - updated_at
        - in: query
          name: operation_type
          description: >-
            Filter operations by type (e.g., INSTALL, UNINSTALL, CONVERGE,
            INSTALL_APP, UNINSTALL_APP, REBOOT)
          schema:
            type: string
        - in: query
          name: group_multi
          description: >-
            Filter by multiple group ID. Fetch the devices from groups matching
            with the IDs and its subgroup.
          schema:
            type: string
            format: uuid
      x-scope:
        - read:operation
      responses:
        '200':
          description: Operations information for the Tenant
          content:
            application/json:
              schema:
                type: object
                properties:
                  content:
                    type: object
                    properties:
                      count:
                        type: integer
                      previous:
                        type: string
                      next:
                        type: string
                      results:
                        type: array
                        items:
                          $ref: '#/components/schemas/device_OperationWithStats'
    post:
      x-badges:
        - name: Stable
          color: green
      summary: Create a new Operation
      description: >
        Creates a new Dispatch operation to run a large fleet action, such as
        Converge, across a set of devices or groups in a single request.


        Operations are built for scale — a single call can target device_ids
        directly or resolve a device_request query (for example matching on
        group_multi or state) into as many as tens of thousands of devices. The
        operation is queued immediately in the Created state and resolves
        asynchronously as Esper identifies the applicable devices and dispatches
        the command.


        **About Create Operation**


        Currently, operation_type supports CONVERGE and group-level app INSTALL
        and UNINSTALL, and INSTALL/UNINSTALL are immediate only. Unlike the
        Command Request API, which issues one command per device or group call,
        Operations are designed specifically for very large fleet actions and
        report a single aggregate status alongside individual per-device
        results. A created operation does not affect devices immediately; it
        queues the action, then resolves the target devices, then dispatches the
        command to each of them.


        **Key Fields / Request Body**


        operation_type — the action to run, currently CONVERGE, INSTALL, or
        UNINSTALL


        schedule_type — IMMEDIATE to run right away or WINDOW to run within a
        scheduled window


        operation_device_query — the device targeting payload; accepts a
        device_ids list or a device_request object with filters such as
        group_multi or state


        arguments — operation-specific arguments, for example
        converge_with_provision for a Converge operation


        **Common Use Cases**


        Converging tens of thousands of devices onto an updated blueprint in a
        single request


        Installing or uninstalling an app across every device in one or more
        groups


        Re-driving a Converge operation for a targeted list of devices that
        failed a previous attempt


        **Best Practices**


        Batch very large device lists in operation_device_query rather than
        issuing many smaller operations, since Operations are built to scale to
        tens of thousands of devices per request


        Capture the id returned in the response immediately, since it is
        required for every subsequent status check


        Confirm devices are online and provisioned before including them in a
        Converge operation to avoid indefinite Dispatched or Processing states


        **Workflow**


        Determine the device_ids or device_request filters that define the
        target fleet


        POST to this endpoint with the operation_type and operation_device_query


        Capture the returned id as the Operation ID


        Poll GET /v0/operations/{operationId}/ until the operation reaches
        Success or Failure
      operationId: createOperation
      tags:
        - device_Operations
      security:
        - device_apiKey: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/device_Operations_POST'
            examples:
              devices:
                $ref: '#/components/examples/device_example_devices'
              filters:
                $ref: '#/components/examples/device_example_filters'
      x-scope:
        - create:operation:CONVERGE
      responses:
        '201':
          description: Operation information for the Tenant
          content:
            application/json:
              schema:
                type: object
                properties:
                  content:
                    $ref: '#/components/schemas/device_OperationWithStats'
  /v0/operations/{operationId}/:
    get:
      x-badges:
        - name: Stable
          color: green
      summary: Get specific Operation details (Operation Status)
      description: >
        Retrieves the full status and aggregate device counts for a single
        Dispatch operation.


        Use this endpoint to check whether a Converge, install, or uninstall
        operation has resolved, how many devices it reached, and how many
        succeeded or failed. The operation_stats object gives the aggregate
        breakdown, while operation_activity gives a timestamped history of the
        operation's state transitions.


        **About Operation Status**


        An Operation moves through Created, Query Initiated, Query Resolved,
        Dispatching, Dispatched, Processing, and finally Success or Failure. The
        operation is only marked Success once every applicable device has
        executed the command successfully; a single device failure marks the
        whole operation Failure. Operations can remain indefinitely in
        Dispatched or Processing if devices are not picking up the command,
        which is usually a sign of network connectivity issues rather than a
        problem with the operation itself.


        **Common Use Cases**


        Polling an operation after creation to confirm it reached Success


        Checking operation_stats to see how many of a large batch of devices
        failed a Converge action


        Reviewing operation_activity to see how long an operation spent in each
        lifecycle state


        **Best Practices**


        Treat a Failure state as meaning at least one device failed, not that
        the entire batch failed; check operation_stats.failed_device_count for
        the real scope


        If an operation is stuck in Dispatched or Processing, check the affected
        devices' connectivity rather than re-issuing the operation immediately


        Use the state query parameter on GET /v0/operations/ to find other
        operations in the same state if you suspect a systemic issue


        **Workflow**


        Create the operation with POST /v0/operations/ and capture the returned
        id


        Poll this endpoint until state reaches a terminal value


        If state is Failure, call GET /v0/operations/{operationsId}/devices/ to
        identify which devices failed


        Re-drive the operation for the failed devices once their connectivity is
        confirmed
      operationId: getOperation
      security:
        - device_apiKey: []
      tags:
        - device_Operations
      parameters:
        - name: operationId
          in: path
          description: ID of the Operation
          required: true
          schema:
            type: string
            format: uuid
      x-scope:
        - read:operation
      responses:
        '200':
          description: Operation information for the Tenant
          content:
            application/json:
              schema:
                type: object
                properties:
                  content:
                    $ref: '#/components/schemas/device_OperationWithStats'
    put:
      x-badges:
        - name: Stable
          color: green
      summary: Update the operation (Support status update as of now)
      description: >
        Updates the status of an existing Dispatch operation. Supports CANCEL
        only. 


        Use this endpoint to manually override an operation's state, most
        commonly to cancel an operation that has not yet dispatched or to force
        a stuck operation into a terminal state. This does not change the state
        of the individual devices within the operation.


        **About Update Operation**


        This endpoint currently supports status updates only, as noted in its
        own description. It is most useful for cancelling an operation that is
        still queued or resolving, since operations already in Dispatching or
        Dispatched may have already reached some devices before a cancellation
        can take effect. Because this updates the operation-level record,
        individual DeviceOperation states are not automatically changed and may
        need to be reconciled separately.


        **Key Fields / Request Body**


        state — the new operation state, CANCELLED


        reason — free text explaining the state change


        **Common Use Cases**


        Cancelling an operation that was created in error before it reaches the
        dispatch stage


        Forcing an operation that has been stuck in Dispatched or Processing for
        an extended period into a terminal state


        **Best Practices**


        Check the operation's current state with GET
        /v0/operations/{operationId}/ before attempting to cancel it, since only
        operations that have not yet dispatched can be reliably cancelled


        Always include a reason so the override is auditable alongside the
        operation's activity history


        **Workflow**


        Call GET /v0/operations/{operationId}/ to confirm the operation is still
        in a cancellable state


        PUT the new state and reason to this endpoint


        Re-check the operation to confirm the update took effect
      tags:
        - device_Operations
      security:
        - device_apiKey: []
      parameters:
        - name: operationId
          in: path
          required: true
          description: The ID of the operation to update (Put created operationId here)
          schema:
            type: string
            example: 5743470f-7dcc-4a92-8a4b-f41b1cea69ed
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                state:
                  type: string
                  enum:
                    - FAILED
                    - CANCELLED
                    - TIMEOUT
                    - SCHEDULED
                  description: The new status of the operation
              required:
                - status
            examples:
              example-1:
                summary: Update status to CANCELLED
                value:
                  state: CANCELLED
                  reason: User requested
      x-scope:
        - update:operation
      responses:
        '200':
          description: Operation status updated successfully
          content:
            application/json:
              schema:
                type: object
                properties:
                  operationId:
                    type: string
                    description: The ID of the updated operation
                  status:
                    type: string
                    description: The updated status of the operation
              example:
                operationId: '12345'
                status: SUCCEEDED
  /v0/operations/{operationsId}/devices/:
    get:
      x-badges:
        - name: Stable
          color: green
      summary: Get all DeviceOperations for a specific Operation
      description: >
        Retrieves the per-device breakdown of a single Dispatch operation,
        showing where every targeted device stands in the operation's lifecycle.


        Use this endpoint after checking an operation's aggregate status to see
        exactly which devices succeeded, failed, or are still processing.
        Supports filtering by device operation state and ordering, which makes
        it the primary tool for isolating the devices that failed a Converge,
        install, or uninstall action.


        **About Device Operations for an Operation**


        When a Dispatch operation targets many devices, Esper tracks each
        device's progress as a separate DeviceOperation record nested under the
        parent Operation. This endpoint lists all of those records for a given
        operationsId, each carrying its own state and activity history distinct
        from the operation's overall state. It is the standard way to move from
        "this operation had failures" to "these are the specific devices that
        failed."


        **Key Fields / Query Parameters**


        state — filters by device operation state using integer codes; common
        values are 10 for Created, 30 for Dispatched, 40 for Processing, 50 for
        Success, and 60 for Failure


        ordering — orders results by created_at, state, or updated_at; prefix
        with a minus sign to reverse order


        **Common Use Cases**


        Listing every device that failed a fleet-wide Converge operation by
        filtering state to the failure code


        Monitoring how many devices in a large install or uninstall operation
        are still processing


        Building a per-device progress view for a dispatch operation shown in
        the Activity Feed


        **Best Practices**


        Filter by state rather than paging through the full device list when you
        only need failures


        Combine with ordering by created_at to review the most recently updated
        devices first


        For a single device's status within the operation, use GET
        /v0/operations/{operationsId}/devices/{deviceId}/ instead of filtering
        this list


        **Workflow**


        Create or identify the operation using the Operations endpoints


        Call this endpoint with the operationsId to retrieve the full device
        breakdown


        Filter by state to isolate failed or still-processing devices


        Re-drive the operation for any failed devices once their connectivity is
        confirmed
      operationId: getDeviceOperations
      tags:
        - device_DeviceOperations
      security:
        - device_apiKey: []
      parameters:
        - in: query
          name: limit
          schema:
            type: integer
        - in: query
          name: offset
          schema:
            type: integer
        - name: operationsId
          in: path
          description: ID of the Operation
          required: true
          schema:
            type: string
            format: uuid
          example: 5743470f-7dcc-4a92-8a4b-f41b1cea69ed
        - in: query
          name: state
          schema:
            type: integer
          description: >
            Following are the Device Operation States and their corresponding
            integer values

            ```

            DEVICE_OPERATION_CREATED     = 10

            DEVICE_OPERATION_INITIATED   = 20

            DEVICE_OPERATION_DISPATCHED  = 30

            DEVICE_OPERATION_PROCESSING  = 40

            DEVICE_OPERATION_SUCCESS     = 50

            DEVICE_OPERATION_FAILURE     = 60

            DEVICE_OPERATION_CANCELLED   = 70

            DEVICE_OPERATION_TIMEOUT     = 80

            DEVICE_OPERATION_COMPLETED   = 90

            ```
        - in: query
          name: ordering
          description: Field to order the results by. Prefix with '-' to reverse the order.
          schema:
            type: string
            enum:
              - created_at
              - state
              - updated_at
      x-scope:
        - read:operation:devices
      responses:
        '200':
          description: Device Operation information for the Operation
          content:
            application/json:
              schema:
                type: object
                properties:
                  content:
                    type: object
                    properties:
                      count:
                        type: integer
                      previous:
                        type: string
                      next:
                        type: string
                      results:
                        type: array
                        items:
                          $ref: '#/components/schemas/device_DeviceOperationWithStats'
  /v0/devices/{deviceId}/operations/:
    get:
      x-badges:
        - name: Stable
          color: green
      summary: Get a Operations for a device
      description: >
        Retrieves the Dispatch operations that have targeted a specific device,
        giving a device-centric view of Converge, install, and uninstall
        activity.


        Use this endpoint when you already have a device_id and want to see
        which fleet-wide dispatch operations it was included in, rather than
        starting from the operation and looking up its devices. Returns the same
        OperationWithStats objects used elsewhere in the Operations API, each
        including the operation's type, current state, and aggregate device
        counts.


        **About Operations for a Device**


        Operations, also called Dispatch commands, are Esper's mechanism for
        issuing large fleet actions such as Converge and group-level app
        installs and uninstalls to many devices in a single request. Every
        operation that includes this device appears in this list, regardless of
        when it was created or how many other devices it targeted. This is the
        reverse lookup of GET /v0/operations/{operationsId}/devices/, which
        starts from the operation instead of the device.


        **Common Use Cases**


        Auditing every dispatch operation a device has participated in


        Troubleshooting a device that appears out of sync by checking whether a
        recent Converge operation reached it


        Confirming whether a device was included in a bulk install or uninstall
        operation


        **Best Practices**


        Cross-reference the operation IDs returned here with GET
        /v0/operations/{operationId}/ for full operation-level context,
        including overall success and failure counts


        Check the most recent entries first when troubleshooting a device that
        just failed to Converge


        **Workflow**


        Identify the device_id from a device listing endpoint


        Call this endpoint with that device_id to list the operations that
        targeted it


        Use the returned operation id with GET
        /v0/operations/{operationsId}/devices/{deviceId}/ to see this device's
        specific status within that operation
      tags:
        - device_DeviceOperations
      security:
        - device_apiKey: []
      parameters:
        - name: deviceId
          in: path
          description: ID of the Device
          required: true
          schema:
            type: string
            format: uuid
          example: 17d384d3-29bd-4dd4-af64-d02b9d6d54ee
      x-scope:
        - read:device:operations
      responses:
        '200':
          description: Operations information for the Device
          content:
            application/json:
              schema:
                type: object
                properties:
                  count:
                    type: integer
                  previous:
                    type: string
                  next:
                    type: string
                  results:
                    type: array
                    items:
                      $ref: '#/components/schemas/device_OperationWithStats'
  /v0/operations/{operationsId}/devices/{deviceId}/:
    get:
      x-badges:
        - name: Stable
          color: green
      summary: >-
        Get a specific DeviceOperations for a specific Operation (Device
        Operation Status)
      description: >
        Retrieves the status of a single device's progress within a specific
        Dispatch operation.


        Use this endpoint to check exactly where one device stands inside a
        larger fleet operation, including its full state history from creation
        through to success or failure. This is the most granular status check
        available for Dispatch operations such as Converge, install, and
        uninstall.


        **About Device Operation Status**


        Every device targeted by an Operation gets its own DeviceOperation
        record, which moves independently through Created, Initiated,
        Dispatched, Processing, and a terminal state such as Success, Failure,
        Cancelled, or Timeout. The device_operation_activity array on the
        response captures a timestamped history of every state transition for
        that device, useful for diagnosing exactly when and where a device
        stalled or failed.


        **Common Use Cases**


        Diagnosing why one specific device failed a Converge operation while the
        rest of the fleet succeeded


        Confirming a device has reached Success before considering a bulk
        install or uninstall complete for that device


        Reviewing the timing between dispatch and completion for a single device


        **Best Practices**


        Check device_operation_activity for the full timeline rather than
        relying on the current state alone


        If a device is stuck in Dispatched or Processing, confirm its
        connectivity with GET /device/v0/heartbeat/{id}/ before assuming the
        operation failed


        Pair this with GET /v0/operations/{operationsId}/devices/ when you need
        to move from a fleet-wide failure list down to individual device detail


        **Workflow**


        Identify the operationsId and deviceId, typically from the device
        operation list endpoint


        Call this endpoint to retrieve the device's current state and activity
        history


        If the device shows a failure or timeout state, check its last-seen
        connectivity before retrying


        Include the device_id again in a new Operation if it needs to be
        re-dispatched
      operationId: getDeviceOperation
      tags:
        - device_DeviceOperations
      security:
        - device_apiKey: []
      parameters:
        - name: operationsId
          in: path
          description: ID of the Operation
          required: true
          schema:
            type: string
            format: uuid
            example: 5743470f-7dcc-4a92-8a4b-f41b1cea69ed
        - name: deviceId
          in: path
          description: ID of the Device
          required: true
          schema:
            type: string
            format: uuid
            example: 17d384d3-29bd-4dd4-af64-d02b9d6d54ee
      x-scope:
        - read:operation:devices
      responses:
        '200':
          description: Device Operation information for the Operation
          content:
            application/json:
              schema:
                type: object
                properties:
                  content:
                    $ref: '#/components/schemas/device_DeviceOperationWithStats'
    put:
      x-badges:
        - name: Stable
          color: green
      summary: Update a specific DeviceOperation for a specific Operation
      description: >
        Updates the recorded state of a single device's progress within a
        Dispatch operation.


        Used to request cancellation for an invidual device operation (instead
        of a larger fleetwide operation) by specifying the sate as
        CANCELLATION_REQUESTED. Cancellation is not guaranteed and depends the
        command's exact state. 


        **About Update Device Operation**


        Each DeviceOperation record represents one device's slice of a larger
        Operation. As the underlying dispatch command progresses on the device
        side, the owning service reports the new state back through this
        endpoint, which then rolls up into the parent operation's aggregate
        stats (resolved, dispatched, failed, and success counts). Because this
        directly affects the parent operation's reported outcome, updates here
        should come from the service that owns the operation's execution rather
        than from ad hoc calls.


        **Key Fields / Request Body**


        operation_type — the operation type this device operation belongs to,
        for example CONVERGE


        state — the new device operation state, for example SUCCESS


        service_id — Optional. identifies the internal service reporting the
        update, for example drift-service


        reason — free text explaining the state change


        **Common Use Cases**


        An internal service reporting that a device successfully completed its
        Converge action


        Marking a device's operation as failed after the underlying command
        times out on the device


        **Best Practices**


        Only update state from the service that actually owns execution of the
        underlying command for that device


        Always populate reason when reporting a failure so the cause is visible
        in the operation's activity history


        **Workflow**


        Identify the operationsId and deviceId for the device operation being
        updated


        Determine the device's actual outcome from the underlying command or
        drift check


        PUT the new state, service_id, and reason to this endpoint


        Confirm the update is reflected in the parent operation's aggregate
        stats via GET /v0/operations/{operationId}/
      operationId: updateDeviceOperation
      tags:
        - device_DeviceOperations
      security:
        - device_apiKey: []
      parameters:
        - name: operationsId
          in: path
          description: ID of the Operation
          required: true
          schema:
            type: string
            format: uuid
            example: 0aae03d2-32b4-4cab-b733-6919b84bb2ac
        - name: deviceId
          in: path
          description: ID of the Device
          required: true
          schema:
            type: string
            format: uuid
            example: 550e8400-e29b-41d4-a716-446655440000
      x-scope:
        - update:operation
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - state
              properties:
                operation_type:
                  type: string
                  example: CONVERGE
                  description: Optional; resolved from the database if not provided.
                  deprecated: true
                state:
                  type: string
                  example: SUCCESS
                service_id:
                  type: string
                  example: drift-service
                reason:
                  type: string
                  example: test
      responses:
        '200':
          description: Device Operation updated successfully
          content:
            application/json:
              schema:
                type: object
                properties:
                  content:
                    $ref: '#/components/schemas/device_DeviceOperationWithStats'
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/device_Error_400_Bad_Data'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/device_Error_401_Unauthorized'
        '404':
          description: Not found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/device_Error_404_Not_Found'
        '500':
          description: Internal Server Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/device_Error_500_Internal_Server_Error'
  /v2/foundationversions:
    get:
      x-badges:
        - name: Stable
          color: green
      summary: Get all distinct foundation versions
      description: >-
        Returns a list of distinct foundation versions present in the tenant's
        devices
      operationId: getFoundationVersionsList
      x-scope:
        - read:foundationversions
      tags:
        - device_Device
      parameters:
        - in: query
          name: limit
          schema:
            type: integer
            default: 10
          description: Number of results to return per page
        - in: query
          name: offset
          schema:
            type: integer
            default: 0
          description: The initial index from which to return the results
        - in: query
          name: search
          schema:
            type: string
          description: >-
            Filter foundation versions by partial string match
            (case-insensitive)
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                type: object
                properties:
                  count:
                    type: integer
                    description: Total number of distinct foundation versions
                  prev:
                    type: string
                    description: URL to the previous page of results
                  next:
                    type: string
                    description: URL to the next page of results
                  results:
                    type: array
                    items:
                      type: object
                      properties:
                        foundation_version:
                          type: string
                          description: The foundation version string
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/device_Error_400_Bad_Data'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/device_Error_401_Unauthorized'
        '500':
          description: Internal Server Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/device_Error_500_Internal_Server_Error'
  /v2/rv-activity-feed/:
    get:
      x-badges:
        - name: Stable
          color: green
      summary: Get RemoteViewer Activity Feed for the tenant
      description: >
        Retrieves a paginated, filterable feed of Remote Viewer sessions across
        the tenant.


        Each entry represents one Remote Viewer session, including the device it
        targeted, its current state, video quality, duration, and who initiated
        it. Supports filtering by state, video quality, device name, and the
        user who created the session.


        **About Remote Viewer Activity Feed**


        Remote Viewer sessions move through INITIATED, ACKNOWLEDGED, ACTIVE, and
        a terminal TERMINATED or FAILED state. This feed gives a tenant-wide,
        auditable view of who has remotely viewed which devices, how long each
        session lasted, and whether it completed successfully, spanning the
        multi-OS Remote Viewer feature rather than any single platform.


        **Key Fields / Query Parameters**


        states — filters by one or more session states, comma-separated


        created_by — filters sessions by the user who initiated them


        device_name — searches sessions by device name


        ordering — orders results, defaults to -created_at (most recent first)


        **Common Use Cases**


        Auditing who accessed a given device through Remote Viewer and when


        Reviewing failed or unusually long Remote Viewer sessions across the
        fleet


        Investigating support activity on a specific device by filtering on
        device_name


        **Best Practices**


        Filter by states to separate completed sessions from ones that failed or
        never became active


        Use created_by when auditing an individual support agent's Remote Viewer
        activity


        **Workflow**


        Call this endpoint with the filters relevant to your audit or
        investigation


        Review session state and duration for each result


        Use the session_id to correlate with support tickets or other internal
        records if needed
      tags:
        - device_MultiOS Remote Viewer
      parameters:
        - in: query
          name: limit
          schema:
            type: integer
        - in: query
          name: offset
          schema:
            type: integer
        - in: query
          name: states
          schema:
            type: string
            enum:
              - INITIATED
              - ACKNOWLEDGED
              - ACTIVE
              - TERMINATED
              - FAILED
            description: List API supports comma separated states.
        - in: query
          name: video_qualities
          schema:
            type: string
            enum:
              - STANDARD
              - DATA_SAVER
            description: >-
              To allow filtering sessions list by comma separated video
              qualities
        - in: query
          name: reason
          schema:
            type: string
            description: To allow searching sessions list by reason
        - in: query
          name: created_by
          schema:
            type: string
            description: To allow filtering sessions list by created by
        - in: query
          name: device_name
          schema:
            type: string
            description: To allow searching sessions list by device name
        - in: query
          name: ordering
          schema:
            type: string
            default: '-created_at'
            enum:
              - created_at
              - updated_at
              - device_name
              - duration
              - state
              - reason
              - video_quality
              - created_by
            description: >-
              To allow ordering sessions list by created_at, updated_at,
              device_name, duration, state, reason, video_quality and
              created_by.
        - in: query
          name: duration_lt
          schema:
            type: string
            format: duration
            description: >-
              Duration less than filter. The time duration (in ISO 8601 duration
              format) of only a valid elapsed session, i.e., sessions that have
              moved from ACTIVE state (where session start-time can be captured)
              to TERMINATED or FAILED state (where the session end-time can be
              captured).
            example: duration_lt=PT10M30S
        - in: query
          name: duration_lte
          schema:
            type: string
            format: duration
            description: >-
              Duration less than or equal to filter. The time duration (in ISO
              8601 duration format) of only a valid elapsed session, i.e.,
              sessions that have moved from ACTIVE state (where session
              start-time can be captured) to TERMINATED or FAILED state (where
              the session end-time can be captured).
            example: duration_lte=PT10M30S
        - in: query
          name: duration_gt
          schema:
            type: string
            format: duration
            description: >-
              Duration greater than filter. The time duration (in ISO 8601
              duration format) of only a valid elapsed session, i.e., sessions
              that have moved from ACTIVE state (where session start-time can be
              captured) to TERMINATED or FAILED state (where the session
              end-time can be captured).
            example: duration_gt=PT10M30S
        - in: query
          name: duration_gte
          schema:
            type: string
            format: duration
            description: >-
              Duration greater than or equal to filter. The time duration (in
              ISO 8601 duration format) of only a valid elapsed session, i.e.,
              sessions that have moved from ACTIVE state (where session
              start-time can be captured) to TERMINATED or FAILED state (where
              the session end-time can be captured).
            example: duration_gte=PT10M30S
        - in: query
          name: created_at_lt
          schema:
            type: string
            format: date-time
            description: >-
              Created at less than filter. Datetime format must be in
              "YY-MM-DDTHH:mm:ss.fffffffffZ".
            example: created_at_lt=2023-10-01T12:00:00Z
        - in: query
          name: created_at_gt
          schema:
            type: string
            format: date-time
            description: >-
              Created at greater than filter. Datetime format must be in
              "YY-MM-DDTHH:mm:ss.fffffffffZ".
            example: created_at_gt=2023-10-01T12:00:00Z
        - in: query
          name: created_at_lte
          schema:
            type: string
            format: date-time
            description: >-
              Created at less than or equal to filter. Datetime format must be
              in "YY-MM-DDTHH:mm:ss.fffffffffZ".
            example: created_at_lte=2023-10-01T12:00:00Z
        - in: query
          name: created_at_gte
          schema:
            type: string
            format: date-time
            description: >-
              Created at greater than or equal to filter. Datetime format must
              be in "YY-MM-DDTHH:mm:ss.fffffffffZ".
            example: created_at_gte=2023-10-01T12:00:00Z
        - in: query
          name: updated_at_lt
          schema:
            type: string
            format: date-time
            description: >-
              Updated at less than filter. Datetime format must be in
              "YY-MM-DDTHH:mm:ss.fffffffffZ".
            example: updated_at_lt=2023-10-01T12:00:00Z
        - in: query
          name: updated_at_gt
          schema:
            type: string
            format: date-time
            description: >-
              Updated at greater than filter. Datetime format must be in
              "YY-MM-DDTHH:mm:ss.fffffffffZ".
            example: updated_at_gt=2023-10-01T12:00:00Z
        - in: query
          name: updated_at_lte
          schema:
            type: string
            format: date-time
            description: >-
              Updated at less than or equal to filter. Datetime format must be
              in "YY-MM-DDTHH:mm:ss.fffffffffZ".
            example: updated_at_lte=2023-10-01T12:00:00Z
        - in: query
          name: updated_at_gte
          schema:
            type: string
            format: date-time
            description: >-
              Updated at greater than or equal to filter. Datetime format must
              be in "YY-MM-DDTHH:mm:ss.fffffffffZ".
            example: updated_at_gte=2023-10-01T12:00:00Z
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                type: object
                properties:
                  content:
                    type: object
                    properties:
                      count:
                        type: integer
                      previous:
                        type: string
                      next:
                        type: string
                      results:
                        type: array
                        items:
                          $ref: >-
                            #/components/schemas/device_RemoteViewerSessionsListForTenantResponse
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/device_Error_400_Bad_Data'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/device_Error_401_Unauthorized'
        '500':
          description: Internal Server Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/device_Error_500_Internal_Server_Error'
  /apps/v0/vpp:
    get:
      x-badges:
        - name: Stable
          color: green
      security:
        - apps_management_apiKey: []
      summary: Get VPP License List
      description: API to get a list of VPP licenses with the given VPP token
      tags:
        - apps_management_VPP License Management
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                type: object
                properties:
                  code:
                    type: integer
                    description: response code
                    default: 200
                  message:
                    type: string
                    description: response message
                  content:
                    type: object
                    properties:
                      count:
                        type: integer
                        description: number of results returned
                      prev:
                        type: string
                        description: URL for previous page of results
                      next:
                        type: string
                        description: URL for next page of results
                      results:
                        type: array
                        items:
                          oneOf:
                            - $ref: '#/components/schemas/apps_management_VPPLicense'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/apps_management_Error_401_Unauthorized'
        '500':
          description: Internal Server Error
          content:
            application/json:
              schema:
                $ref: >-
                  #/components/schemas/apps_management_Error_500_Internal_Server_Error
  /apps/v0/vpp/{appId}:
    get:
      x-badges:
        - name: Stable
          color: green
      security:
        - apps_management_apiKey: []
      parameters:
        - in: path
          name: appId
          schema:
            type: integer
          required: true
      summary: Get VPP License Info about an App
      description: API to get information about the VPP license for a given app
      tags:
        - apps_management_VPP License Management
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                type: object
                properties:
                  code:
                    type: integer
                    description: response code
                    default: 200
                  message:
                    type: string
                    description: response message
                  content:
                    $ref: '#/components/schemas/apps_management_VPPLicense'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/apps_management_Error_401_Unauthorized'
        '500':
          description: Internal Server Error
          content:
            application/json:
              schema:
                $ref: >-
                  #/components/schemas/apps_management_Error_500_Internal_Server_Error
  /v2/itunesapps:
    get:
      x-badges:
        - name: Stable
          color: green
      security:
        - apps_management_apiKey: []
      parameters:
        - name: app_id
          in: query
          schema:
            type: string
            format: uuid
        - name: version_id
          in: query
          schema:
            type: string
            format: uuid
        - name: apple_app_id
          in: query
          schema:
            type: string
        - name: country_code
          in: query
          description: >-
            ISO country code for App Store region (e.g., "us", "gb", "de").
            Defaults to "us".
          schema:
            type: string
            pattern: ^[a-zA-Z]{2}$
            example: us
      summary: Get iOS App Info (v2)
      description: >-
        API to get information about iOS apps based on their app IDs or Apple
        app IDs.
      tags:
        - apps_management_VPP App Management
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                type: object
                properties:
                  content:
                    type: object
                    properties:
                      count:
                        type: integer
                        description: number of results returned
                      prev:
                        type: string
                        description: URL for previous page of results
                      next:
                        type: string
                        description: URL for next page of results
                      results:
                        type: array
                        items:
                          oneOf:
                            - $ref: >-
                                #/components/schemas/apps_management_ItunesAppInfoV2
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/apps_management_Error_400_Bad_Data'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/apps_management_Error_401_Unauthorized'
        '500':
          description: Internal Server Error
          content:
            application/json:
              schema:
                $ref: >-
                  #/components/schemas/apps_management_Error_500_Internal_Server_Error
  /v2/itunesapps/{appleAppId}/preferred-region:
    put:
      x-badges:
        - name: Stable
          color: green
      security:
        - apps_management_apiKey: []
      parameters:
        - in: path
          required: true
          name: appleAppId
          schema:
            type: string
          description: The Apple App Store ID of the VPP app (e.g., "361309726")
      summary: Set Preferred Region for VPP App
      description: >
        ⚠️ Apple devices only. This endpoint applies exclusively to iOS devices
        managed via VPP (Volume Purchase Program).


        Sets the preferred App Store region for a specific VPP app, overriding
        the default storefront used when Esper fetches app metadata and updates
        for that app.Each VPP app can be assigned to one of the preferred
        regions configured at the tenant level. Assigning the correct region is
        important for update reliability — devices in a region that doesn't
        match the app's assigned storefront may fail to receive app updates.


        **About VPP App Preferred Region**


        Apple's App Store is region-segmented; the same app may exist under
        different storefronts with different availability, pricing tiers, and
        update cadences. When managing VPP apps across a multi-region fleet,
        Esper needs to know which App Store storefront to use for each app. This
        endpoint sets that per-app region preference. The available regions to
        select from are those already configured at the tenant level via POST
        /v2/preferred-regions (up to five). In the Console, this setting is
        accessible when adding or editing an app under Apps > VPP Apps.


        **Key Fields**


        appleAppId (path, required) — the Apple numeric App Store ID for the VPP
        app (e.g., 361309726)


        preferred_region (required) — ISO 3166-1 alpha-2 country code
        (uppercase) for the desired App Store storefront (e.g., "US", "GB",
        "AU"); must be one of the regions already added to the tenant's
        preferred region list


        **Common Use Cases**


        Assigning each VPP app to the App Store storefront matching the primary
        device region where it is deployed

        Correcting a region mismatch when devices in a specific country are
        failing to receive app updates

        Reconfiguring app storefronts after an organizational expansion into a
        new country

        Best Practices


        Only assign a region that is already in the tenant's configured
        preferred region list — the available options are set via POST
        /v2/preferred-regions

        Match the app's region to the physical operating region of the devices
        it is assigned to, not the billing region of the VPP token

        Audit per-app region assignments when expanding into new countries to
        prevent silent update failures

        Workflow


        Confirm the desired country is in the tenant's preferred region list via
        GET /v2/preferred-regions

        PUT to /v2/itunesapps/{appleAppId}/preferred-region with {
        "preferred_region": "US" } (or the appropriate code)

        Verify the response message confirms success; subsequently, device
        updates for that app will use the assigned storefront
      tags:
        - apps_management_VPP App Management
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/apps_management_SetPreferredRegionRequest'
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                type: object
                properties:
                  content:
                    type: object
                    properties:
                      message:
                        type: string
                        example: Preferred region updated successfully
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/apps_management_Error_400_Bad_Data'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/apps_management_Error_401_Unauthorized'
        '404':
          description: Not Found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/apps_management_Error_404_Not_Found'
        '500':
          description: Internal Server Error
          content:
            application/json:
              schema:
                $ref: >-
                  #/components/schemas/apps_management_Error_500_Internal_Server_Error
  /v2/itunesapps/{appId}/refresh-version:
    post:
      x-badges:
        - name: Stable
          color: green
      security:
        - apps_management_apiKey: []
      parameters:
        - in: path
          required: true
          name: appId
          schema:
            type: string
            format: uuid
          description: The internal Esper app id (UUID) of the VPP app
      summary: Force refresh of VPP app version metadata
      description: |
        Synchronously re-fetches the latest iTunes metadata for a single VPP
        app under the caller's tenant and persists it. Same write path as the
        daily VPP version cron, scoped to one (tenant, app_id). Returns
        the refreshed app details so the UI can render without a follow-up GET.
      tags:
        - apps_management_VPP App Management
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                type: object
                properties:
                  content:
                    $ref: '#/components/schemas/apps_management_ItunesAppInfoV2'
        '400':
          description: Bad Request (invalid app_id or missing headers)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/apps_management_Error_400_Bad_Data'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/apps_management_Error_401_Unauthorized'
        '404':
          description: >-
            Not Found (no vpp_app_ids row for the tenant + app_id, or app not
            found in iTunes)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/apps_management_Error_404_Not_Found'
        '500':
          description: Internal Server Error
          content:
            application/json:
              schema:
                $ref: >-
                  #/components/schemas/apps_management_Error_500_Internal_Server_Error
  /v2/tenant-apps:
    post:
      x-badges:
        - name: Stable
          color: green
      security:
        - apps_management_apiKey: []
      summary: Upload tenant app for a tenant
      description: >
        Uploads a new iOS or Windows app file to the tenant's app catalog.


        Accepts a multipart file upload along with a platform value and returns
        the newly created app and version identifiers.


        **About Upload Tenant App**


        ⚠️ iOS and Windows only. This is how enterprise apps for iOS and Windows
        devices get into Esper for later assignment to blueprints or
        installation via commands. If the appId already exists for a re-uploaded
        app, this call creates a new version under that app rather than a
        duplicate app record; confirm which behavior applies for your platform
        before assuming either outcome.


        **Key Fields / Request Body**


        platform — the target platform, APPLE or WINDOWS, required


        file — the app binary to upload, required


        **Common Use Cases**


        Publishing a new iOS or Windows enterprise app for the first time


        Uploading a new build of an already-published app as a new version


        **Best Practices**


        Capture both the id and version_id from the upload response immediately,
        since later calls may need either one


        Confirm the platform value matches the actual file type before
        uploading, since this determines how the app is validated and
        distributed


        **Workflow**


        Prepare the app file and confirm its target platform


        POST the file as multipart form data to this endpoint


        Capture the returned id and version_id


        Reference the app in a blueprint version or install command to
        distribute it to devices
      tags:
        - apps_management_Tenant Apps
      requestBody:
        required: true
        content:
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/apps_management_AppUploadRequestBody'
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                type: object
                properties:
                  content:
                    $ref: >-
                      #/components/schemas/apps_management_TenantAppUploadResponse
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/apps_management_Error_400_Bad_Data'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/apps_management_Error_401_Unauthorized'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/apps_management_Error_403_Forbidden'
        '500':
          description: Internal Server Error
          content:
            application/json:
              schema:
                $ref: >-
                  #/components/schemas/apps_management_Error_500_Internal_Server_Error
    get:
      x-badges:
        - name: Stable
          color: green
      security:
        - apps_management_apiKey: []
      parameters:
        - in: query
          name: limit
          schema:
            type: number
        - in: query
          name: offset
          schema:
            type: number
        - in: query
          name: platform
          schema:
            type: string
            enum:
              - APPLE
              - WINDOWS
        - in: query
          name: package_name
          schema:
            type: string
        - in: query
          name: app_name
          schema:
            type: string
      summary: Get tenant apps for a tenant
      description: >
        Retrieves a paginated list of all tenant-uploaded apps for iOS and
        Windows devices.


        Returns each app's TenantAppResponse record, filterable by platform,
        package name, and app name.


        **About Get Tenant Apps**


        ⚠️ iOS and Windows only. Tenant Apps are enterprise apps uploaded
        directly to Esper for distribution to iOS or Windows devices. This is
        the tenant-wide catalog view, separate from Tenant Esper Apps
        (Esper-provided apps) and from Android enterprise apps, which live in
        the older Application V1 API.


        **Key Fields / Query Parameters**


        platform — filters by APPLE or WINDOWS


        package_name — filters by exact package name


        app_name — filters by app name


        **Common Use Cases**


        Browsing the full catalog of uploaded iOS and Windows apps before
        assigning one to a blueprint


        Finding an app's id to look up its available versions


        **Best Practices**


        Filter by platform when working with a single-OS fleet to avoid paging
        through apps for the other platform


        Use package_name to find a specific app quickly rather than searching by
        app_name alone, since app_name is not guaranteed to be unique


        **Workflow**


        Call this endpoint with the desired filters


        Identify the appId for the app you need


        Call GET /v2/tenant-apps/{appId}/versions to see its available versions
      tags:
        - apps_management_Tenant Apps
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                type: object
                properties:
                  content:
                    type: object
                    properties:
                      count:
                        type: integer
                        description: number of results returned
                      prev:
                        type: string
                        description: URL for previous page of results
                      next:
                        type: string
                        description: URL for next page of results
                      results:
                        type: array
                        items:
                          oneOf:
                            - $ref: >-
                                #/components/schemas/apps_management_TenantAppResponse
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/apps_management_Error_400_Bad_Data'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/apps_management_Error_401_Unauthorized'
        '500':
          description: Internal Server Error
          content:
            application/json:
              schema:
                $ref: >-
                  #/components/schemas/apps_management_Error_500_Internal_Server_Error
  /v2/tenant-apps/{appId}:
    get:
      x-badges:
        - name: Stable
          color: green
      security:
        - apps_management_apiKey: []
      parameters:
        - in: path
          required: true
          name: appId
          schema:
            type: string
            format: uuid
      summary: Get tenant app by ID
      description: >
        Retrieves a single tenant app's detail record by its ID.


        Returns the TenantAppResponse object for the given appId, including its
        platform, package name, and audit timestamps.


        **About Get Tenant App**


        ⚠️ iOS and Windows only. This is the single-app counterpart to the
        tenant apps list, useful once you already have an appId and need its
        current record.


        **Common Use Cases**


        Confirming an app's platform and package name before referencing it in a
        blueprint


        Checking when an app record was last updated


        **Best Practices**


        Use GET /v2/tenant-apps/{appId}/versions immediately after this call if
        you need the app's installable versions, since this endpoint does not
        return version detail


        **Workflow**


        Obtain the appId from the tenant apps list or from the upload response


        Call this endpoint to retrieve its detail record
      tags:
        - apps_management_Tenant Apps
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                type: object
                properties:
                  content:
                    $ref: '#/components/schemas/apps_management_TenantAppResponse'
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/apps_management_Error_400_Bad_Data'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/apps_management_Error_401_Unauthorized'
        '404':
          description: Not Found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/apps_management_Error_404_Not_Found'
        '500':
          description: Internal Server Error
          content:
            application/json:
              schema:
                $ref: >-
                  #/components/schemas/apps_management_Error_500_Internal_Server_Error
  /v2/tenant-apps/{appId}/versions:
    get:
      x-badges:
        - name: Stable
          color: green
      security:
        - apps_management_apiKey: []
      parameters:
        - in: path
          required: true
          name: appId
          schema:
            type: string
            format: uuid
        - in: query
          name: limit
          schema:
            type: number
        - in: query
          name: offset
          schema:
            type: number
        - in: query
          name: app_name
          schema:
            type: string
        - in: query
          name: app_type
          schema:
            type: string
          description: >-
            Filter by app type. When TENANT_WINDOWS_EXE, response items include
            is_active.
        - in: query
          name: is_active
          schema:
            type: boolean
          description: >-
            Filter by active status. Only supported when
            app_type=TENANT_WINDOWS_EXE. Returns 400 if used with any other
            app_type.
        - in: query
          name: legacy_format
          schema:
            type: boolean
            default: true
          description: >-
            If false, returns version_code instead of build_number. Defaults to
            true for backward compatibility.
      summary: Get tenant app versions by app ID
      description: >
        Retrieves a paginated list of every version uploaded for a specific
        tenant app.


        Returns each version's TenantAppVersionResponse record. The
        legacy_format parameter controls whether version identification is
        returned as the legacy build_number or the newer version_code.


        **About Get Tenant App Versions**


        ⚠️ iOS and Windows only. Every time a new build of a tenant app is
        uploaded, it becomes a new version under the same appId. This endpoint
        lists all of them, which is the standard way to find the version_id
        needed to install a specific build or to reference in a blueprint.


        **Key Fields / Query Parameters**


        legacy_format — when true (the default), returns build_number for
        backward compatibility; set to false to receive version_code instead


        app_name — filters by app name


        **Common Use Cases**


        Finding the latest version of an app before assigning it to a blueprint


        Auditing the upload history of a tenant app


        **Best Practices**


        Set legacy_format to false in new integrations to work with version_code
        directly, rather than relying on the legacy build_number field


        Sort or filter results to confirm you're referencing the intended
        version before using it in a blueprint or install command


        **Workflow**


        Call this endpoint with the appId


        Identify the versionId of the version you need


        Call GET /v2/tenant-apps/{appId}/versions/{versionId} for that version's
        full detail
      tags:
        - apps_management_Tenant Apps
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                type: object
                properties:
                  content:
                    type: object
                    properties:
                      count:
                        type: integer
                        description: number of results returned
                      prev:
                        type: string
                        description: URL for previous page of results
                      next:
                        type: string
                        description: URL for next page of results
                      results:
                        type: array
                        items:
                          oneOf:
                            - $ref: >-
                                #/components/schemas/apps_management_TenantAppVersionResponse
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/apps_management_Error_400_Bad_Data'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/apps_management_Error_401_Unauthorized'
        '500':
          description: Internal Server Error
          content:
            application/json:
              schema:
                $ref: >-
                  #/components/schemas/apps_management_Error_500_Internal_Server_Error
  /v2/tenant-apps/{appId}/versions/{versionId}:
    get:
      x-badges:
        - name: Stable
          color: green
      security:
        - apps_management_apiKey: []
      parameters:
        - in: path
          required: true
          name: appId
          schema:
            type: string
            format: uuid
        - in: path
          required: true
          name: versionId
          schema:
            type: string
            format: uuid
        - in: query
          name: legacy_format
          schema:
            type: boolean
            default: true
          description: >-
            If false, returns version_code instead of build_number. Defaults to
            true for backward compatibility.
      summary: Get tenant app version by ID
      description: >
        Retrieves the full detail record for a single tenant app version.


        Returns the TenantAppVersionDetailResponse for the given appId and
        versionId, with the same legacy_format option for choosing between
        build_number and version_code.


        **About Get Tenant App Version**


        ⚠️ iOS and Windows only. This is the detail view behind a single entry
        in the app's version list, useful once you already have both the appId
        and versionId.


        **Common Use Cases**


        Confirming a specific version's detail before referencing it in a
        blueprint or install command


        Auditing a specific build's metadata


        **Best Practices**


        Set legacy_format to false to receive version_code if your integration
        doesn't depend on the legacy build_number field


        **Workflow**


        Obtain the appId and versionId from the versions list


        Call this endpoint for the full version detail
      tags:
        - apps_management_Tenant Apps
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                type: object
                properties:
                  content:
                    $ref: >-
                      #/components/schemas/apps_management_TenantAppVersionDetailResponse
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/apps_management_Error_400_Bad_Data'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/apps_management_Error_401_Unauthorized'
        '404':
          description: Not Found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/apps_management_Error_404_Not_Found'
        '500':
          description: Internal Server Error
          content:
            application/json:
              schema:
                $ref: >-
                  #/components/schemas/apps_management_Error_500_Internal_Server_Error
    put:
      x-badges:
        - name: Stable
          color: green
      security:
        - apps_management_apiKey: []
      parameters:
        - in: path
          required: true
          name: appId
          schema:
            type: string
        - in: path
          required: true
          name: versionId
          schema:
            type: string
            format: uuid
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              minProperties: 1
              description: >
                At least one field must be provided. All fields are optional

                (omitted = leave unchanged). `version_name` and `exe_config`

                are only accepted for EXE app versions; rejected with 400
                otherwise.
              properties:
                description:
                  type: string
                version_name:
                  type: string
                  maxLength: 64
                  description: Version name. Only valid for EXE app versions.
                exe_config:
                  description: >-
                    EXE configuration. Only valid for TENANT_WINDOWS_EXE app
                    versions; rejected with 400 otherwise.
                  allOf:
                    - $ref: >-
                        #/components/schemas/apps_management_WindowsExeConfigRequest
      summary: Update tenant app version by ID
      description: >
        Updates the description field on a specific tenant app version.


        This is a narrow update endpoint; the only writable field is
        description, so it's used for annotating a version rather than changing
        its binary or platform.


        **About Update Tenant App Version**


        ⚠️ iOS and Windows only. Because the app binary itself is immutable once
        uploaded, this endpoint only supports updating the version's
        description. To change the actual app content, upload a new version
        through POST /v2/tenant-apps instead.


        **Key Fields / Request Body**


        description — the only writable field on this endpoint


        **Common Use Cases**


        Adding release notes or context to an already-uploaded version


        Correcting a typo in a version's description after upload


        **Best Practices**


        Do not expect this endpoint to change anything beyond description,
        including platform or the app binary


        **Workflow**


        Obtain the appId and versionId for the version you want to annotate


        PUT the updated description to this endpoint


        Confirm the change with a follow-up GET on the version detail
      tags:
        - apps_management_Tenant Apps
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                type: object
                properties:
                  content:
                    $ref: >-
                      #/components/schemas/apps_management_TenantAppVersionResponse
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/apps_management_Error_400_Bad_Data'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/apps_management_Error_401_Unauthorized'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/apps_management_Error_403_Forbidden'
        '404':
          description: Not Found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/apps_management_Error_404_Not_Found'
        '500':
          description: Internal Server Error
          content:
            application/json:
              schema:
                $ref: >-
                  #/components/schemas/apps_management_Error_500_Internal_Server_Error
    delete:
      x-badges:
        - name: Stable
          color: green
      security:
        - apps_management_apiKey: []
      parameters:
        - in: path
          required: true
          name: appId
          schema:
            type: string
            format: uuid
        - in: path
          required: true
          name: versionId
          schema:
            type: string
            format: uuid
      summary: Delete tenant app version by ID
      description: >
        Permanently deletes a single version of a tenant-uploaded iOS or Windows
        app.


        Removes the specified versionId from the app identified by appId. This
        deletes only that version's record, not the parent app or its other
        versions.


        **About Delete Tenant App Version**


        ⚠️ iOS and Windows only. Tenant Apps are enterprise apps uploaded
        directly for iOS or Windows devices, distinct from Android enterprise
        apps, which are managed through the separate Application V1 API.
        Deleting a version removes it from the catalog, so it can no longer be
        installed on new devices, though devices that already have it installed
        are not automatically affected.


        **Common Use Cases**


        Removing an outdated or broken app version from the catalog


        Cleaning up test or pre-release versions after a stable version has been
        published


        **Best Practices**


        Confirm no active blueprints or pending install commands reference the
        version before deleting it


        Delete older versions only after confirming devices have moved to a
        newer version, if version continuity matters for your fleet


        **Workflow**


        Call GET /v2/tenant-apps/{appId}/versions to confirm the versionId you
        intend to delete


        DELETE the version using its appId and versionId


        Confirm the deletion with a follow-up GET on the versions list
      tags:
        - apps_management_Tenant Apps
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                type: object
                properties:
                  content:
                    $ref: >-
                      #/components/schemas/apps_management_TenantAppVersionResponse
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/apps_management_Error_400_Bad_Data'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/apps_management_Error_401_Unauthorized'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/apps_management_Error_403_Forbidden'
        '404':
          description: Not Found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/apps_management_Error_404_Not_Found'
        '500':
          description: Internal Server Error
          content:
            application/json:
              schema:
                $ref: >-
                  #/components/schemas/apps_management_Error_500_Internal_Server_Error
  /v2/tenant-apps/{appId}/versions/{versionId}/artifacts:
    post:
      x-badges:
        - name: Stable
          color: green
      security:
        - apps_management_apiKey: []
      parameters:
        - in: path
          required: true
          name: appId
          schema:
            type: string
            format: uuid
        - in: path
          required: true
          name: versionId
          schema:
            type: string
            format: uuid
      summary: Add an artifact to a UWP app version
      description: |
        Uploads a per-version artifact (a UWP framework dependency or signing
        certificate) for a TENANT_WINDOWS_UWP app version.
      tags:
        - apps_management_Tenant Apps
      requestBody:
        required: true
        content:
          multipart/form-data:
            schema:
              type: object
              required:
                - artifact_type
                - file
              properties:
                artifact_type:
                  type: string
                  enum:
                    - UWP_DEPENDENCY
                    - UWP_CERTIFICATE
                  description: The kind of artifact being uploaded.
                file:
                  type: string
                  format: binary
                  description: |
                    The artifact file. For UWP_DEPENDENCY a .msix/.appx package;
                    for UWP_CERTIFICATE a .cer signing certificate.
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                type: object
                properties:
                  content:
                    $ref: >-
                      #/components/schemas/apps_management_ArtifactMutationResponse
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/apps_management_Error_400_Bad_Data'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/apps_management_Error_401_Unauthorized'
        '404':
          description: Not Found (the app version does not exist)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/apps_management_Error_404_Not_Found'
        '500':
          description: Internal Server Error
          content:
            application/json:
              schema:
                $ref: >-
                  #/components/schemas/apps_management_Error_500_Internal_Server_Error
  /v2/tenant-apps/{appId}/versions/{versionId}/artifacts/{artifactId}:
    delete:
      x-badges:
        - name: Stable
          color: green
      security:
        - apps_management_apiKey: []
      parameters:
        - in: path
          required: true
          name: appId
          schema:
            type: string
            format: uuid
        - in: path
          required: true
          name: versionId
          schema:
            type: string
            format: uuid
        - in: path
          required: true
          name: artifactId
          schema:
            type: string
            format: uuid
          description: The id of the artifact to delete.
      summary: Delete an artifact from a UWP app version
      description: |
        Deletes a per-version artifact (dependency or certificate) by its id,
        removing both its stored file and its record.
      tags:
        - apps_management_Tenant Apps
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                type: object
                properties:
                  content:
                    $ref: >-
                      #/components/schemas/apps_management_ArtifactMutationResponse
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/apps_management_Error_400_Bad_Data'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/apps_management_Error_401_Unauthorized'
        '404':
          description: Not Found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/apps_management_Error_404_Not_Found'
        '500':
          description: Internal Server Error
          content:
            application/json:
              schema:
                $ref: >-
                  #/components/schemas/apps_management_Error_500_Internal_Server_Error
  /v2/appleappstore/:
    get:
      x-badges:
        - name: Stable
          color: green
      security:
        - apps_management_apiKey: []
      parameters:
        - name: title
          in: query
          required: true
          schema:
            type: string
      summary: Search Apple App Store
      description: >
        ⚠️ Apple devices only. This endpoint searches Apple's App Store for apps
        available for deployment to Apple-managed devices.


        Searches the Apple App Store by app title (required), returning matching
        app records with metadata including icon, bundle ID, file size, App
        Store URL, minimum OS version, release date, and seller name.


        **About Search Apple App Store**


        This endpoint proxies a title-based search against Apple's App Store,
        enabling integrators to discover apps by name before adding them to
        Esper for deployment. Unlike GET /api/v2/itunesapps, which retrieves
        metadata for apps already in Esper's system, this endpoint queries the
        App Store directly and does not require the app to already exist in the
        tenant library. Results include the bundle_id needed to identify the app
        in subsequent VPP or deployment workflows. This is a discovery tool —
        app installation and deployment are handled through VPP licensing and
        blueprint or operation endpoints.


        **Key Query Parameters / Fields**


        title (required) — App title search string


        name (response) — App name as listed in the App Store


        bundle_id (response) — Bundle identifier (e.g., com.apple.mobilesafari);
        use this in VPP and deployment workflows


        icon (response) — URL for the app's icon


        app_store_url (response) — Direct link to the app's App Store listing


        minimum_os (response) — Minimum iOS version required


        file_size_in_bytes (response) — App binary size in bytes


        release_date (response) — App release date in ISO 8601 format


        seller_name (response) — App developer or publisher name


        **Common Use Cases**


        Searching for an app by name to retrieve its bundle_id before
        configuring a VPP install or blueprint

        Verifying minimum OS version compatibility before targeting a specific
        iOS device group

        Confirming app availability and publisher identity before adding it to
        the tenant's VPP library


        **Best Practices**


        Use specific, well-formed title strings — broad or partial searches may
        return large result sets; use the bundle_id from results to uniquely
        identify the target app


        Verify minimum_os against the OS versions in your device fleet before
        targeting an app for deployment


        This endpoint is for discovery only — use VPP licensing endpoints and
        blueprint or operation endpoints to configure and deploy the app
      tags:
        - apps_management_Apple App Store
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                type: object
                properties:
                  content:
                    type: object
                    properties:
                      count:
                        type: integer
                        description: number of results returned
                      prev:
                        type: string
                        description: URL for previous page of results
                      next:
                        type: string
                        description: URL for next page of results
                      results:
                        type: array
                        items:
                          $ref: >-
                            #/components/schemas/apps_management_AppleAppStoreApp
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/apps_management_Error_400_Bad_Data'
        '401':
          description: Unauthorized Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/apps_management_Error_401_Unauthorized'
        '500':
          description: Internal Server Error
          content:
            application/json:
              schema:
                $ref: >-
                  #/components/schemas/apps_management_Error_500_Internal_Server_Error
  /v2/apps:
    get:
      x-badges:
        - name: Stable
          color: green
      security:
        - apps_management_apiKey: []
      parameters:
        - in: query
          name: limit
          schema:
            type: number
        - in: query
          name: offset
          schema:
            type: number
        - in: query
          name: search
          schema:
            type: string
        - in: query
          name: ordering
          schema:
            type: string
            enum:
              - name
              - created_at
              - updated_at
        - in: query
          name: app_type
          schema:
            type: string
        - in: query
          name: legacy_format
          schema:
            type: boolean
            default: true
          description: >-
            If false, returns version_code instead of build_number. Defaults to
            true for backward compatibility.
      summary: Get unified list of iOS apps (IPAs and Webclips) for a tenant
      description: >
        ⚠️ Apple devices and Windows only. This endpoint returns Window or iOS
        app records only. Android apps use the Application V1 API
        (https://api.esper.io/openapi/esper_cloud_api_application-v1).Retrieves
        a unified, paginated list of all iOS and Windows apps in the tenant
        library, spanning MSI, IPA-based tenant apps, and webclips, in a single
        normalized view.


        **About List Windows or iOS Apps (Unified)**


        This endpoint provides a single list across iOS and Windows app types —
        TENANT_IOS, WEBCLIP, and TENANT_WINDOWS entries — surfaced as AppInfo
        records. Unlike the type-specific endpoints (GET /api/v2/tenant-apps and
        GET /api/v2/webclips), this unified view is useful when you need a
        single inventory sweep of all deployable iOS app entries regardless of
        type. The app_type filter can be used to scope results to a specific
        type. The AppInfo schema covers both IPA and webclip-specific fields —
        fields like url, is_full_screen, and is_removable are relevant for
        webclips, while file_size_in_kb, build_number/version_code, and
        min_sdk_version apply to IPA-based apps. The legacy_format parameter
        controls whether the response uses build_number (default) or
        version_code.


        **Key Query Parameters**


        app_type — Filter by app type (e.g., TENANT_IOS, WEBCLIP,
        TENANT_WINDOWS)


        search — Search by app name or label


        ordering — Sort by name, created_at, or updated_at


        legacy_format — true (default): build_number; false: version_code


        **Common Use Cases**


        Generating a complete inventory of all deployable iOS apps and webclips
        in the tenant


        Searching by name across both app types in a single call before
        blueprint configuration


        Auditing app library contents by type using the app_type filter


        **Best Practices**


        Use app_type to filter when only IPAs or only webclips are needed — the
        combined list can be large for tenants with many apps


        Use legacy_format=false in new integrations to consume version_code


        For type-specific detail (e.g., presigned download URL or webclip icon),
        follow up with the appropriate scoped endpoint
      tags:
        - apps_management_App List
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                type: object
                properties:
                  content:
                    type: object
                    properties:
                      count:
                        type: integer
                        description: number of results returned
                      prev:
                        type: string
                        description: URL for previous page of results
                      next:
                        type: string
                        description: URL for next page of results
                      results:
                        type: array
                        items:
                          oneOf:
                            - $ref: '#/components/schemas/apps_management_AppInfo'
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/apps_management_Error_400_Bad_Data'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/apps_management_Error_401_Unauthorized'
        '500':
          description: Internal Server Error
          content:
            application/json:
              schema:
                $ref: >-
                  #/components/schemas/apps_management_Error_500_Internal_Server_Error
  /v2/webclips:
    post:
      x-badges:
        - name: Stable
          color: green
      security:
        - apps_management_apiKey: []
      summary: Create webclip for a tenant
      description: >
        ⚠️ iOS/iPadOS only. Webclips are home screen shortcuts for iOS and
        iPadOS managed devices.


        Creates a new webclip in the tenant library, making it available for
        deployment to iOS/iPadOS managed devices via blueprint or install
        operation.


        **About Create Webclip**


        A webclip is a home screen bookmark that opens a specified URL in a
        browser or within a target app, appearing as an app icon on the device.
        In Esper, webclips are managed as a distinct app type (WEBCLIP) within
        the iOS app system. The request uses multipart/form-data and requires
        label, esper_name, url, target_bundle_id, target_bundle_name,
        is_full_screen, and is_removable. An optional icon binary can be
        uploaded to set a custom home screen icon. The target_bundle_id and
        target_bundle_name identify the iOS app that will handle the URL (e.g.,
        Safari). A 409 response indicates a webclip with a conflicting
        identifier already exists.


        **Key Fields**


        label (required) — Display name shown on the device home screen


        esper_name (required) — Internal name for the webclip in Esper (used for
        lookup and management)


        url (required) — The URL the webclip opens


        target_bundle_id (required) — Bundle ID of the app that handles the URL
        (e.g., com.apple.mobilesafari)


        target_bundle_name (required) — Display name of the target bundle (e.g.,
        Safari)


        is_full_screen (required) — Whether the webclip opens in full-screen
        mode


        is_removable (required) — Whether the user can remove the webclip from
        the home screen


        icon (optional) — Custom icon binary for the home screen shortcut


        **Common Use Cases**


        Creating a home screen shortcut to an internal web app or portal for
        field devices


        Adding a branded webclip with a custom icon that opens in full-screen
        kiosk-style mode


        Deploying a managed browser link that users cannot remove from the home
        screen


        **Best Practices**


        Set is_removable=false for compliance-critical or kiosk-mode webclips
        that should not be user-removable


        Use a descriptive esper_name that distinguishes webclips with similar
        labels — it is the primary lookup identifier in Esper


        After creation, capture the returned id (webclip UUID) for blueprint
        configuration or install operations


        **Workflow**


        Prepare the webclip details — URL, target bundle, label, and icon if
        needed


        Submit the multipart/form-data POST with all required fields


        Capture the returned webclip id for use in blueprint or operation
        configuration
      tags:
        - apps_management_Webclips
      requestBody:
        required: true
        content:
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/apps_management_WebclipCreateRequest'
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                type: object
                properties:
                  content:
                    $ref: '#/components/schemas/apps_management_Webclip'
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/apps_management_Error_400_Bad_Data'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/apps_management_Error_401_Unauthorized'
        '409':
          description: Conflict
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/apps_management_Error_409_Conflict'
        '500':
          description: Internal Server Error
          content:
            application/json:
              schema:
                $ref: >-
                  #/components/schemas/apps_management_Error_500_Internal_Server_Error
    get:
      x-badges:
        - name: Stable
          color: green
      security:
        - apps_management_apiKey: []
      parameters:
        - in: query
          name: limit
          schema:
            type: number
        - in: query
          name: offset
          schema:
            type: number
        - in: query
          name: label
          schema:
            type: string
        - in: query
          name: exact_esper_name
          schema:
            type: string
      summary: Get webclips for a tenant
      description: >
        ⚠️ Apple devices only.


        Retrieves a paginated list of all webclips in the tenant library, with
        optional filtering by label or internal Esper name.


        **About List Webclips**


        Returns Webclip records for all webclips uploaded to the tenant — the
        same resource created by POST /api/v2/webclips. Each record includes the
        webclip's UUID, label, URL, target bundle details, full-screen and
        removability flags, icon URL, and audit timestamps. The exact_esper_name
        filter performs an exact-match lookup on the internal esper_name field,
        useful for finding a specific webclip by its Esper identifier without
        paginating through the full list. For a unified view of webclips
        alongside IPA-based apps, use GET /api/v2/apps with app_type=WEBCLIP.


        **Key Query Parameters**


        label — Filter by webclip display label (partial match)


        exact_esper_name — Exact-match filter on the internal esper_name field


        **Common Use Cases**


        Looking up a specific webclip's UUID by its esper_name for use in
        blueprint or operation configuration


        Auditing all webclips in the tenant library before a deployment or
        cleanup operation


        Verifying webclip details (URL, target bundle, removability) before
        assigning to a blueprint


        **Best Practices**


        Use exact_esper_name when you know the internal name — it is more
        precise than label and avoids ambiguity with similarly labeled webclips


        Paginate with limit and offset for tenants with large webclip libraries
      tags:
        - apps_management_Webclips
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                type: object
                properties:
                  content:
                    type: object
                    properties:
                      count:
                        type: integer
                        description: number of results returned
                      prev:
                        type: string
                        description: URL for previous page of results
                      next:
                        type: string
                        description: URL for next page of results
                      results:
                        type: array
                        items:
                          oneOf:
                            - $ref: '#/components/schemas/apps_management_Webclip'
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/apps_management_Error_400_Bad_Data'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/apps_management_Error_401_Unauthorized'
        '500':
          description: Internal Server Error
          content:
            application/json:
              schema:
                $ref: >-
                  #/components/schemas/apps_management_Error_500_Internal_Server_Error
  /v2/webclips/{webclipId}:
    get:
      x-badges:
        - name: Stable
          color: green
      security:
        - apps_management_apiKey: []
      parameters:
        - in: path
          required: true
          name: webclipId
          schema:
            type: string
            format: uuid
      summary: Get webclip by id for a tenant
      description: >
        ⚠️ iOS/iPadOS only.


        Retrieves the full record for a specific webclip by its Esper UUID.

        Returns a single Webclip object with all fields including label, URL,
        target bundle ID and name, full-screen mode, removability, icon URL, and
        audit timestamps.


        **About Get Webclip**


        This endpoint fetches the complete detail record for a single webclip,
        identified by its Esper-assigned UUID. It is the direct lookup
        complement to GET /api/v2/webclips — use it when you already have the
        webclipId and need to confirm current configuration or retrieve specific
        field values before an update or deployment operation. The response is
        identical in structure to webclip records returned by the list endpoint.


        **Key Fields**


        webclipId (path) — Esper webclip UUID (required)


        label — Home screen display name


        url — URL the webclip opens


        target_bundle_id / target_bundle_name — iOS app handling the URL


        is_full_screen / is_removable — Behavioral flags


        icon_url — URL for the webclip's home screen icon (nullable)


        **Common Use Cases**


        Confirming webclip configuration details before including it in a
        blueprint


        Retrieving current url or target bundle values for audit or
        documentation purposes


        Pre-flight check before a DELETE to confirm the correct webclip is
        targeted


        **Best Practices**


        Use this as a pre-flight check before DELETE operations to confirm the
        correct webclipId is targeted


        If the webclipId is unknown, use GET /api/v2/webclips with
        exact_esper_name to look it up first
      tags:
        - apps_management_Webclips
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                type: object
                properties:
                  content:
                    $ref: '#/components/schemas/apps_management_Webclip'
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/apps_management_Error_400_Bad_Data'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/apps_management_Error_401_Unauthorized'
        '404':
          description: Not Found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/apps_management_Error_404_Not_Found'
        '500':
          description: Internal Server Error
          content:
            application/json:
              schema:
                $ref: >-
                  #/components/schemas/apps_management_Error_500_Internal_Server_Error
    delete:
      x-badges:
        - name: Stable
          color: green
      security:
        - apps_management_apiKey: []
      parameters:
        - in: path
          required: true
          name: webclipId
          schema:
            type: string
            format: uuid
      summary: Delete webclip for a tenant
      description: >
        ⚠️ Apple devices only.


        Deletes a specific webclip from the tenant library by its Esper UUID,
        returning the deleted webclip record.

        The deletion is permanent. A 409 response indicates the webclip cannot
        be deleted because it is currently referenced by an active blueprint or
        configuration.


        **About Delete Webclip**


        Deleting a webclip removes it from the tenant library and makes it
        unavailable for new deployments. The 200 response returns the complete
        Webclip record for the deleted entry — retain it for audit purposes. The
        409 Conflict response is significant: it indicates the webclip is still
        referenced in a blueprint or active configuration and must be removed
        from those references before deletion can proceed. Devices that already
        have the webclip installed are not immediately affected by deletion from
        the library — the webclip remains on those devices until actively
        removed via an operation or blueprint change.


        **Key Fields**


        webclipId (path) — Esper webclip UUID (required)


        Response — The deleted Webclip record


        **Common Use Cases**


        Removing an outdated or incorrect webclip from the tenant library

        Cleaning up test webclips created during development or blueprint
        configuration

        Decommissioning a webclip for a retired internal web application


        **Best Practices**


        If you receive a 409, use GET /api/v2/webclips/{webclipId} to confirm
        which blueprints and blueprint versions reference the webclip, then
        remove those references before retrying the delete


        Store the returned Webclip record from the 200 response for audit trail
        purposes


        Note that deletion removes the webclip from the console but does not
        uninstall it from devices where it is already deployed — use an
        uninstall operation for that
      tags:
        - apps_management_Webclips
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                type: object
                properties:
                  content:
                    $ref: '#/components/schemas/apps_management_Webclip'
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/apps_management_Error_400_Bad_Data'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/apps_management_Error_401_Unauthorized'
        '404':
          description: Not Found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/apps_management_Error_404_Not_Found'
        '409':
          description: Conflict
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/apps_management_Error_409_Conflict'
        '500':
          description: Internal Server Error
          content:
            application/json:
              schema:
                $ref: >-
                  #/components/schemas/apps_management_Error_500_Internal_Server_Error
  /v2/provisioning-profiles:
    post:
      x-badges:
        - name: Stable
          color: green
      security:
        - apps_management_apiKey: []
      summary: Upload provisioning profile for a tenant
      description: >
        ⚠️ Apple devices only.


        Upload a .mobileprovision file to register an iOS provisioning profile
        for use with Enterprise app distribution in Esper.

        The uploaded file is parsed and validated by Esper, which extracts the
        App ID, team identifier, profile type, expiration date, and
        entitlements. The resulting profile record is then available to attach
        to blueprints. App Store (VPP) apps distributed through Apple's App
        Store do not require provisioning profiles.


        **About Upload Provisioning Profile**

        iOS provisioning profiles are Apple-issued authorization files that
        enable Enterprise apps to run on iOS and iPadOS devices without going
        through the App Store. In Esper, provisioning profiles are uploaded
        here, then associated with specific blueprints via the blueprint's iOS
        app configuration. Each upload creates a new version under a profile
        record keyed by App ID; uploading a .mobileprovision file with the same
        App ID as an existing profile creates an additional version rather than
        overwriting it.


        **Key Fields / Request Body**


        file (required) — The .mobileprovision binary file to upload, sent as
        multipart/form-data


        id (response) — Esper's UUID for the parent provisioning profile record


        version_id (response) — UUID for this specific uploaded version


        app_identifier (response) — The app's bundle ID extracted from the file
        (e.g., com.example.app)


        profile_type (response) — One of development, ad-hoc, app-store, or
        enterprise


        expiration_date (response) — When Apple's authorization on this profile
        expires


        **Common Use Cases**


        Registering a new app profile before attaching it to a blueprint


        Adding an updated or renewed profile version for an app whose previous
        profile is nearing expiration


        Managing multiple profile versions for the same App ID across
        development and enterprise distribution types


        **Best Practices**


        Upload profiles before configuring blueprints — the profile must exist
        in Esper before it can be added to a blueprint's iOS tab


        Track expiration_date in the response and plan renewals before profiles
        expire, as expired profiles will block app installation on devices


        Uploading a file with the same App ID as an existing profile creates a
        new version; verify which version blueprints are using after uploading
        renewals


        **Workflow**


        Obtain the .mobileprovision file from the Apple Developer portal for the
        Enterprise app


        POST the file to this endpoint as multipart/form-data and capture the
        returned id and version_id


        Navigate to the target blueprint's Apps & Configuration > iOS tab and
        use Add Provisioning Profile to attach the uploaded profile


        Set the expiration date in the blueprint configuration, then save,
        publish, and converge to apply to devices
      tags:
        - apps_management_Provisioning Profiles
      requestBody:
        required: true
        content:
          multipart/form-data:
            schema:
              $ref: >-
                #/components/schemas/apps_management_ProvisioningProfileUploadRequest
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                type: object
                properties:
                  content:
                    $ref: >-
                      #/components/schemas/apps_management_ProvisioningProfileUploadResponse
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/apps_management_Error_400_Bad_Data'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/apps_management_Error_401_Unauthorized'
        '500':
          description: Internal Server Error
          content:
            application/json:
              schema:
                $ref: >-
                  #/components/schemas/apps_management_Error_500_Internal_Server_Error
    get:
      x-badges:
        - name: Stable
          color: green
      security:
        - apps_management_apiKey: []
      parameters:
        - in: query
          name: limit
          schema:
            type: number
            description: Maximum number of provisioning profiles to return
            default: 10
        - in: query
          name: offset
          schema:
            type: number
            description: Number of provisioning profiles to skip
            default: 0
        - in: query
          name: app_identifier
          schema:
            type: string
            description: Filter by bundle identifier of the associated app
        - in: query
          name: profile_type
          schema:
            type: string
            description: Filter by profile type
            enum:
              - development
              - ad-hoc
              - app-store
              - enterprise
        - in: query
          name: team_id
          schema:
            type: string
            description: Filter by Apple Developer Team identifier
        - in: query
          name: search
          schema:
            type: string
            description: Search in provisioning profile names and identifiers
      summary: Get provisioning profiles for a tenant
      description: >
        ⚠️ Apple devices only.


        Retrieve a paginated list of all iOS provisioning profiles registered
        for the tenant, including a signed download URL for each profile file.

        Returns profile metadata extracted from uploaded .mobileprovision files
        — App ID, team identifier, profile type, and expiration date — along
        with a signed download_url for retrieving the raw file. Results default
        to 10 per page and can be filtered by app_identifier, profile_type,
        team_id, or searched by name and identifier.


        **About List Provisioning Profiles**


        Provisioning profiles in Esper are uploaded per tenant and then attached
        to blueprints to authorize Enterprise iOS apps on managed devices. This
        endpoint provides the full tenant inventory of profiles, useful for
        auditing coverage, identifying profiles nearing expiration, and
        confirming which App IDs are registered. Each record represents a
        profile keyed by App ID; individual uploads of the same App ID create
        versioned records accessible via the versions sub-resource.


        **Key Fields / Query Parameters**


        limit — Max results per page; defaults to 10


        offset — Number of records to skip for pagination; defaults to 0


        app_identifier — Filter by bundle ID (e.g., com.example.app)


        profile_type — Filter by development, ad-hoc, app-store, or enterprise


        team_id — Filter by Apple Developer Team identifier


        search — Search within profile names and identifiers


        download_url (response) — Signed S3 URL for downloading the
        .mobileprovision file


        **Common Use Cases**


        Auditing which Enterprise app IDs have registered provisioning profiles
        in the tenant

        Identifying profiles approaching expiration before device-side
        installation failures occur

        Retrieving profile IDs needed to fetch version history or attach
        profiles to blueprints via the API


        **Best Practices**


        Filter by profile_type=enterprise to focus on profiles relevant to
        Enterprise app distribution


        Use app_identifier filtering when managing profiles for a specific app
        across multiple versions


        Paginate with limit and offset for tenants with large profile
        inventories; next and prev URLs are included in the response
      tags:
        - apps_management_Provisioning Profiles
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                type: object
                properties:
                  content:
                    type: object
                    properties:
                      count:
                        type: integer
                        description: Total number of provisioning profiles
                      prev:
                        type: string
                        description: URL for previous page of results
                      next:
                        type: string
                        description: URL for next page of results
                      results:
                        type: array
                        items:
                          $ref: >-
                            #/components/schemas/apps_management_ProvisioningProfileWithDownloadResponse
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/apps_management_Error_400_Bad_Data'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/apps_management_Error_401_Unauthorized'
        '500':
          description: Internal Server Error
          content:
            application/json:
              schema:
                $ref: >-
                  #/components/schemas/apps_management_Error_500_Internal_Server_Error
  /v2/provisioning-profiles/{id}:
    get:
      x-badges:
        - name: Stable
          color: green
      security:
        - apps_management_apiKey: []
      parameters:
        - in: path
          required: true
          name: id
          schema:
            type: string
            format: uuid
            description: Unique identifier for the provisioning profile
      summary: Get provisioning profile by ID
      description: >
        ⚠️ Apple devices only.


        Retrieve a single iOS provisioning profile record by its Esper-assigned
        UUID, including a signed download URL for the profile file.

        Returns the full metadata for the profile — App ID, team identifier,
        profile type, expiration date, and audit fields — along with a
        download_url for downloading the .mobileprovision file. Use this
        endpoint to confirm profile details before attaching to a blueprint or
        to retrieve the download link for the current profile file.


        **About Get Provisioning Profile by ID**


        Each provisioning profile in Esper is identified by a UUID assigned at
        upload time. The profile record represents the app identity (App ID)
        level of the hierarchy; individual uploads of the same App ID are
        tracked as versions under the profile and accessible via the /versions
        sub-resource. This endpoint returns the profile-level record, not a
        specific version.


        **Key Fields / Path Parameters**


        id (required) — Esper UUID of the provisioning profile (returned from
        upload or list endpoint)


        download_url (response) — Signed S3 URL for downloading the
        .mobileprovision file; time-limited


        app_identifier (response) — Bundle ID of the associated app


        profile_type (response) — One of development, ad-hoc, app-store, or
        enterprise


        expiration_date (response) — When the profile authorization expires


        **Common Use Cases**


        Confirming profile details (type, expiration, App ID) before associating
        with a blueprint

        Generating a fresh signed download URL for the profile file

        Validating that a specific profile ID exists and is accessible before
        referencing it in blueprint configuration


        **Best Practices**


        Use the list endpoint (GET /v2/provisioning-profiles) to find the id if
        it isn't already known


        The download_url is a time-limited signed URL; retrieve it fresh when an
        actual download is needed rather than caching it
      tags:
        - apps_management_Provisioning Profiles
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                type: object
                properties:
                  content:
                    $ref: >-
                      #/components/schemas/apps_management_ProvisioningProfileWithDownloadResponse
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/apps_management_Error_400_Bad_Data'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/apps_management_Error_401_Unauthorized'
        '404':
          description: Not Found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/apps_management_Error_404_Not_Found'
        '500':
          description: Internal Server Error
          content:
            application/json:
              schema:
                $ref: >-
                  #/components/schemas/apps_management_Error_500_Internal_Server_Error
  /v2/provisioning-profiles/{id}/versions:
    get:
      x-badges:
        - name: Stable
          color: green
      security:
        - apps_management_apiKey: []
      parameters:
        - in: path
          required: true
          name: id
          schema:
            type: string
            format: uuid
            description: Unique identifier for the provisioning profile
        - in: query
          name: limit
          schema:
            type: number
            description: Maximum number of provisioning profile versions to return
            default: 10
        - in: query
          name: offset
          schema:
            type: number
            description: Number of provisioning profile versions to skip
            default: 0
        - in: query
          name: search
          schema:
            type: string
            description: Search in provisioning profile version names
      summary: Get provisioning profile versions list
      description: >
        ⚠️ Apple devices only.


        Retrieve a paginated list of all uploaded versions of a specific iOS
        provisioning profile, ordered by expiration date descending.

        Each version corresponds to a separate .mobileprovision file upload made
        for the same App ID. Results include Apple-extracted metadata (UUID,
        expiration date, entitlements, platforms, developer certificates) and a
        signed download_url for the version file. Results default to 10 per page
        and support search by version name.


        **About List Provisioning Profile Versions**


        Esper allows multiple versions of a provisioning profile to exist under
        a single profile record (shared App ID), reflecting real-world scenarios
        where profiles are renewed or updated over time. This endpoint surfaces
        that version history in descending expiration order — most recent first
        — making it straightforward to identify which version is current and
        which are expired. Version IDs retrieved here are used when attaching a
        specific version to a blueprint or when deleting an obsolete version.


        **Key Fields / Query Parameters**


        id (path, required) — Esper UUID of the parent provisioning profile


        limit — Max results per page; defaults to 10


        offset — Records to skip for pagination; defaults to 0


        search — Search within version names


        expiration_date (response) — When this version expires; results are
        ordered by this field descending


        uuid (response) — Apple's own UUID for this profile version, distinct
        from Esper's internal id


        provisions_all_devices (response) — true for enterprise profiles that
        provision all devices without explicit device registration


        sha256_hash (response) — Hash of the file, used for duplicate detection
        on upload


        **Common Use Cases**


        Reviewing the version history of a profile to confirm which version is
        currently active in a blueprint


        Identifying expired versions to clean up via the delete endpoint


        Retrieving a specific version_id needed to fetch or delete an individual
        version


        **Best Practices**


        Versions are ordered by expiration_date descending; the first result is
        the most recently expiring (current) version


        Use sha256_hash to detect duplicate uploads before uploading a new
        version


        When renewing profiles, upload the new version first, update the
        blueprint to reference the new version, then delete the old version
      tags:
        - apps_management_Provisioning Profiles
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                type: object
                properties:
                  content:
                    type: object
                    properties:
                      count:
                        type: integer
                        description: Total number of provisioning profile versions
                      prev:
                        type: string
                        description: URL for previous page of results
                      next:
                        type: string
                        description: URL for next page of results
                      results:
                        type: array
                        items:
                          $ref: >-
                            #/components/schemas/apps_management_ProvisioningProfileVersionWithDownloadResponse
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/apps_management_Error_400_Bad_Data'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/apps_management_Error_401_Unauthorized'
        '404':
          description: Not Found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/apps_management_Error_404_Not_Found'
        '500':
          description: Internal Server Error
          content:
            application/json:
              schema:
                $ref: >-
                  #/components/schemas/apps_management_Error_500_Internal_Server_Error
  /v2/provisioning-profiles/{id}/versions/{versionId}:
    get:
      x-badges:
        - name: Stable
          color: green
      security:
        - apps_management_apiKey: []
      parameters:
        - in: path
          required: true
          name: id
          schema:
            type: string
            format: uuid
            description: Unique identifier for the provisioning profile
        - in: path
          required: true
          name: versionId
          schema:
            type: string
            format: uuid
            description: >-
              Unique identifier for the specific version of the provisioning
              profile
      summary: Get provisioning profile version by ID
      description: >
        ⚠️ Apple devices only.


        Retrieve a specific version of an iOS provisioning profile by both the
        parent profile UUID and the version UUID, including a signed download
        URL for that version's file.

        Returns the full version record: Apple-extracted fields (UUID,
        expiration date, entitlements, platforms, developer certificates,
        time_to_live), Esper audit fields, and a signed download_url for the
        .mobileprovision file. Use this when you need the complete details or
        download URL for a precise profile version rather than just the most
        recent one.


        **About Get Provisioning Profile Version by ID**


        Provisioning profile versions in Esper track individual .mobileprovision
        uploads associated with a given App ID. A profile can accumulate
        multiple versions over its lifetime as certificates are renewed or
        profile configurations change. This endpoint targets a single version by
        its versionId, making it useful for confirming the exact state of a
        version currently attached to a blueprint or for generating a fresh
        download link for a specific version.


        **Key Fields / Path Parameters**


        id (required) — Esper UUID of the parent provisioning profile


        versionId (required) — Esper UUID of the specific profile version


        uuid (response) — Apple's own UUID for this version, distinct from
        Esper's id


        expiration_date (response) — When this version's Apple authorization
        expires


        time_to_live (response) — Days remaining from creation date to
        expiration


        provisions_all_devices (response) — true for enterprise profiles
        covering all devices


        entitlements (response) — JSON object of app capabilities granted by
        this profile


        download_url (response) — Signed S3 URL for downloading this version's
        file; time-limited


        **Common Use Cases**


        Retrieving the full entitlements and certificate details for a specific
        profile version before attaching it to a blueprint


        Generating a fresh signed download URL for a known profile version


        Confirming expiration and time_to_live for a version currently in use by
        managed devices


        **Best Practices**


        Use the versions list endpoint (GET
        /v2/provisioning-profiles/{id}/versions) to discover valid versionId
        values


        The download_url is time-limited; fetch it fresh when a download is
        needed


        Check provisions_all_devices to confirm whether the version requires
        individual device registration or covers all devices (enterprise
        behavior)
      tags:
        - apps_management_Provisioning Profiles
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                type: object
                properties:
                  content:
                    $ref: >-
                      #/components/schemas/apps_management_ProvisioningProfileVersionWithDownloadResponse
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/apps_management_Error_400_Bad_Data'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/apps_management_Error_401_Unauthorized'
        '404':
          description: Not Found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/apps_management_Error_404_Not_Found'
        '500':
          description: Internal Server Error
          content:
            application/json:
              schema:
                $ref: >-
                  #/components/schemas/apps_management_Error_500_Internal_Server_Error
    delete:
      x-badges:
        - name: Stable
          color: green
      security:
        - apps_management_apiKey: []
      parameters:
        - in: path
          required: true
          name: id
          schema:
            type: string
            format: uuid
            description: Unique identifier for the provisioning profile
        - in: path
          required: true
          name: versionId
          schema:
            type: string
            format: uuid
            description: >-
              Unique identifier for the specific version of the provisioning
              profile to delete
      summary: Delete provisioning profile version by ID
      description: >
        ⚠️ Apple devices only.


        Delete a specific version of an iOS provisioning profile by profile UUID
        and version UUID, removing it from the tenant's profile inventory.

        On success, returns the deleted version record. A version that is
        currently referenced by a published blueprint cannot be deleted — remove
        the profile from the blueprint first before deleting the version.
        Deletion removes the version from Esper's records; the .mobileprovision
        file will no longer be accessible via Esper.


        **About Delete Provisioning Profile Version**


        Esper stores provisioning profiles as parent records with one or more
        versioned uploads underneath. Deletion operates at the version level,
        not the profile level — deleting all versions of a profile does not
        automatically remove the parent profile record. This granular control
        allows teams to retire expired versions while keeping the profile record
        intact for future uploads. The Console enforces a guard against deleting
        versions attached to published blueprints; the API similarly returns an
        error in that case.


        **Key Fields / Path Parameters**


        id (required) — Esper UUID of the parent provisioning profile


        versionId (required) — Esper UUID of the specific version to delete


        Response body contains the deleted version's full record (same schema as
        the GET version endpoint)


        **Common Use Cases**


        Removing an expired profile version to keep the tenant's profile
        inventory clean


        Deleting a version uploaded by mistake before it is attached to any
        blueprint


        Cycling out old versions after uploading a renewed profile and updating
        blueprints to reference the new version


        **Best Practices**


        Confirm the version is not referenced by any published blueprint before
        calling this endpoint; the API will reject the deletion if it is


        Use the versions list endpoint (GET
        /v2/provisioning-profiles/{id}/versions) to audit versions before
        deleting


        When rotating expired profiles, follow this order: upload renewal →
        update blueprint → delete expired version


        **Workflow**


        Use GET /v2/provisioning-profiles/{id}/versions to identify the
        versionId to remove


        Confirm the version is not attached to any published blueprint (detach
        it first if so)


        Call DELETE /v2/provisioning-profiles/{id}/versions/{versionId}


        Verify deletion by confirming the version no longer appears in the
        versions list
      tags:
        - apps_management_Provisioning Profiles
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                type: object
                properties:
                  content:
                    $ref: >-
                      #/components/schemas/apps_management_ProvisioningProfileVersionWithDownloadResponse
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/apps_management_Error_400_Bad_Data'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/apps_management_Error_401_Unauthorized'
        '404':
          description: Not Found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/apps_management_Error_404_Not_Found'
        '500':
          description: Internal Server Error
          content:
            application/json:
              schema:
                $ref: >-
                  #/components/schemas/apps_management_Error_500_Internal_Server_Error
  /v2/preferred-regions:
    post:
      x-badges:
        - name: Stable
          color: green
      security:
        - apps_management_apiKey: []
      summary: Set Preferred Regions for Tenant
      description: >
        ⚠️ Apple devices only.


        Creates or replaces the tenant's preferred App Store region list,
        setting up to five ISO 3166-1 alpha-2 country codes that represent the
        regions where your organization operates.Submitting an empty countries
        array clears all preferred region preferences for the tenant. The list
        set here defines the available region options when assigning a
        storefront to individual VPP apps via PUT
        /v2/itunesapps/{appleAppId}/preferred-region. In the Console, this
        configuration lives in Apple MDM Management settings.


        **About Preferred Regions**


        Multi-region organizations that distribute VPP apps across countries
        need to ensure each app's App Store storefront matches the operating
        region of its target devices. The preferred regions list is the
        tenant-level foundation for that configuration — it defines the pool of
        allowed storefronts (up to five) from which per-app regions are then
        selected. This is a replace-style operation: submitting a new list
        overwrites the previous one entirely rather than appending to it. Audit
        (GET /v2/preferred-regions) before updating to avoid accidentally
        removing an actively used region.


        **Key Fields**


        countries (required) — array of ISO 3166-1 alpha-2 country codes in
        uppercase (e.g., ["AU", "IN", "US"]); maximum five entries; submit an
        empty array ([]) to clear all preferred regions


        tenant_id (response) — UUID of the tenant whose preferred regions were
        updated


        countries (response) — the saved country code list


        created_by / updated_by — UUID of the user who created or last modified
        the list


        created_at / updated_at — timestamps of creation and last update


        **Common Use Cases**


        Initial setup of the preferred region list when onboarding iOS VPP
        management for a multi-country deployment


        Adding a new country to the allowed storefront pool when the
        organization expands to a new region


        Removing stale regions from the list by resubmitting a trimmed country
        array


        **Best Practices**


        Keep the list to only the countries where you actively deploy VPP apps —
        the five-region cap is a hard limit


        Before updating, call GET /v2/preferred-regions and check which regions
        are actively assigned to apps via GET /v2/itunesapps; removing a region
        that apps depend on will break their storefront assignments


        Use uppercase two-letter codes (e.g., "US", not "us") to match Apple's
        App Store country code format


        **Workflow**


        Call GET /v2/preferred-regions to retrieve the current list and confirm
        what, if anything, needs to change


        POST to /v2/preferred-regions with the complete desired countries array
        (this replaces the existing list)


        Assign individual app storefronts from the updated pool using PUT
        /v2/itunesapps/{appleAppId}/preferred-region
      tags:
        - apps_management_Preferred Regions
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/apps_management_SetPreferredRegionsRequest'
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                type: object
                properties:
                  content:
                    $ref: >-
                      #/components/schemas/apps_management_TenantPreferredRegions
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/apps_management_Error_400_Bad_Data'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/apps_management_Error_401_Unauthorized'
        '500':
          description: Internal Server Error
          content:
            application/json:
              schema:
                $ref: >-
                  #/components/schemas/apps_management_Error_500_Internal_Server_Error
    get:
      x-badges:
        - name: Stable
          color: green
      security:
        - apps_management_apiKey: []
      summary: Get Preferred Regions for Tenant
      description: >
        ⚠️ Apple devices only.


        Retrieves the tenant's current list of preferred App Store regions,
        returning an empty countries array if no regions have been configured.
        Use this endpoint to inspect the tenant's configured storefronts before
        assigning or updating per-app regions, and to verify that a desired
        country code is available before calling PUT
        /v2/itunesapps/{appleAppId}/preferred-region.


        **About Preferred Regions**


        The preferred regions list defines the pool of up to five App Store
        storefronts a tenant can use when assigning regions to individual VPP
        apps. This read endpoint surfaces the current state of that list —
        including the country codes, the user who last modified it, and
        timestamps. An empty countries array indicates no preferred regions have
        been set, meaning per-app region assignments cannot be made until
        regions are configured via POST /v2/preferred-regions. In the Console,
        this configuration is visible in Apple MDM Management settings.


        **Key Fields**


        tenant_id (response) — UUID of the tenant


        countries (response) — array of uppercase ISO 3166-1 alpha-2 country
        codes currently configured (e.g., ["AU", "IN", "US"]); empty array if
        none set


        created_by / updated_by — UUID of the user who created or last modified
        the list


        created_at / updated_at — timestamps of creation and last update


        **Common Use Cases**


        Verifying which App Store storefronts are currently available before
        assigning a region to a VPP app


        Auditing the tenant's region configuration as part of an iOS fleet
        compliance check


        Checking whether a preferred region list has been set up at all during
        initial iOS VPP onboarding


        **Best Practices**


        Call this endpoint before any PUT
        /v2/itunesapps/{appleAppId}/preferred-region operation to confirm the
        target country code is in the list


        Include this in onboarding checklists: an empty countries response means
        VPP region assignments are not yet possible


        Use the updated_at timestamp to detect whether the list has changed
        since your last sync


        **Workflow**


        GET /v2/preferred-regions to retrieve the current country list


        Confirm the desired storefront country code is present before assigning
        it to a VPP app


        If the list is empty or missing the needed country, configure it via
        POST /v2/preferred-regions first
      tags:
        - apps_management_Preferred Regions
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                type: object
                properties:
                  content:
                    $ref: >-
                      #/components/schemas/apps_management_TenantPreferredRegions
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/apps_management_Error_401_Unauthorized'
        '500':
          description: Internal Server Error
          content:
            application/json:
              schema:
                $ref: >-
                  #/components/schemas/apps_management_Error_500_Internal_Server_Error
  /v2/esper-apps/{appId}/versions/{versionId}:
    get:
      x-badges:
        - name: Stable
          color: green
      security:
        - apps_management_apiKey: []
      parameters:
        - in: path
          required: true
          name: appId
          schema:
            type: string
            format: uuid
        - in: path
          required: true
          name: versionId
          schema:
            type: string
            format: uuid
      summary: Get esper app version details by ID
      tags:
        - apps_management_Esper Apps
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                type: object
                properties:
                  content:
                    $ref: >-
                      #/components/schemas/apps_management_EsperAppVersionResponse
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/apps_management_Error_400_Bad_Data'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/apps_management_Error_401_Unauthorized'
        '404':
          description: Not Found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/apps_management_Error_404_Not_Found'
        '500':
          description: Internal Server Error
          content:
            application/json:
              schema:
                $ref: >-
                  #/components/schemas/apps_management_Error_500_Internal_Server_Error
  /v2/tenant-esper-apps:
    get:
      x-badges:
        - name: Stable
          color: green
      security:
        - apps_management_apiKey: []
      parameters:
        - in: query
          name: limit
          schema:
            type: number
        - in: query
          name: offset
          schema:
            type: number
        - in: query
          name: package_name
          schema:
            type: string
        - in: query
          name: ordering
          schema:
            type: string
            enum:
              - created_at (ascending)
              - '-created_at (descending)'
              - version_code (ascending)
              - '-version_code (descending)'
        - in: query
          name: architecture
          schema:
            type: string
            enum:
              - x86
              - x86_64
              - armeabi
              - arm64_v8a
              - armeabi_v7a
              - universal
        - in: query
          name: version_code
          schema:
            type: string
            description: Filter by version code
      summary: Get esper apps for a tenant
      description: >
        Retrieves a paginated list of Esper-provided apps available to the
        tenant.


        Returns each app's TenantEsperAppsItem record, filterable by package
        name, version code, and architecture.


        **About Get Esper Apps**


        Esper Apps are apps published by Esper itself, rather than uploaded by
        the tenant, and made available for installation on managed devices, such
        as Windows-side utility or agent apps. This catalog is separate from
        Tenant Apps (tenant-uploaded iOS and Windows apps) and from Android's
        Application V1 catalog.


        **Key Fields / Query Parameters**


        package_name — filters by package name


        architecture — filters by CPU architecture, for example x86_64,
        arm64_v8a, or universal


        version_code — filters by a specific version code


        ordering — orders by created_at or version_code, ascending or descending


        **Common Use Cases**


        Browsing available Esper-provided apps before assigning one to a device
        or blueprint


        Finding the correct architecture-specific build of an Esper app for a
        device


        **Best Practices**


        Filter by architecture to avoid selecting a build incompatible with the
        target device's hardware


        **Workflow**


        Call this endpoint with the filters relevant to the app you need


        Identify the correct version_code and architecture for your target
        devices


        Reference the app in a blueprint or command to install it
      tags:
        - apps_management_Tenant Esper Apps
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                type: object
                properties:
                  content:
                    type: object
                    properties:
                      count:
                        type: integer
                        description: number of results returned
                      prev:
                        type: string
                        description: URL for previous page of results
                      next:
                        type: string
                        description: URL for next page of results
                      results:
                        type: array
                        items:
                          oneOf:
                            - $ref: >-
                                #/components/schemas/apps_management_TenantEsperAppsItem
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/apps_management_Error_400_Bad_Data'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/apps_management_Error_401_Unauthorized'
        '500':
          description: Internal Server Error
          content:
            application/json:
              schema:
                $ref: >-
                  #/components/schemas/apps_management_Error_500_Internal_Server_Error
  /v2/oem-config-schema:
    get:
      x-badges:
        - name: Beta
          color: yellow
      security:
        - apps_management_apiKey: []
      summary: Get OEM Config Schema
      description: >
        Retrieve the OEM config schema for a given OEM type and package name.

        Returns the latest active schema by default. Specify `version_code` to
        retrieve a specific version.

        Set `include_schema=false` to receive metadata only (avoids the large
        `schema_json` payload).
      operationId: getOEMConfigSchema
      tags:
        - apps_management_OEM Config Schema
      parameters:
        - in: header
          required: true
          name: Authorization
          schema:
            type: string
          description: Bearer token for authentication
        - in: query
          required: true
          name: oem_type
          schema:
            type: string
            enum:
              - ZEBRA
              - HONEYWELL
              - DATALOGIC
              - SAMSUNG
              - SUNMI
          description: OEM manufacturer type
          example: ZEBRA
        - in: query
          required: true
          name: package_name
          schema:
            type: string
          description: OEM config package name (e.g. com.zebra.oemconfig.common)
          example: com.zebra.oemconfig.common
        - in: query
          required: false
          name: version_code
          schema:
            type: string
          description: >-
            Specific version code to retrieve. When omitted, returns the latest
            active schema.
          example: '10'
        - in: query
          required: false
          name: include_schema
          schema:
            type: boolean
            default: true
          description: >-
            Set to false to return metadata only, omitting the schema_json field
            (avoids large payload)
      responses:
        '200':
          description: Success
          headers:
            Cache-Control:
              schema:
                type: string
              description: >-
                When version_code is specified: public, max-age=3600 (response
                is immutable for that version). When version_code is omitted
                (latest lookup): not immutable — a newer upload can change the
                result; do not apply long-lived public caching.
          content:
            application/json:
              schema:
                type: object
                properties:
                  code:
                    type: integer
                    default: 200
                  message:
                    type: string
                  content:
                    $ref: '#/components/schemas/apps_management_OEMConfigSchema'
        '400':
          description: Bad Request — missing or invalid query parameters
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/apps_management_Error_400_Bad_Data'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/apps_management_Error_401_Unauthorized'
        '404':
          description: >-
            Not Found — no schema found for the given oem_type, package_name,
            and version_code
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/apps_management_Error_404_Not_Found'
        '500':
          description: Internal Server Error
          content:
            application/json:
              schema:
                $ref: >-
                  #/components/schemas/apps_management_Error_500_Internal_Server_Error
  /commands/v0/commands/:
    get:
      x-badges:
        - name: Stable
          color: green
      summary: List command requests
      description: >
        Returns a paginated list of command requests within the enterprise. Each
        record includes the command type, targeted devices or groups, schedule
        details, arguments, and current status. This endpoint provides
        visibility into commands that have been issued, whether they are queued,
        in progress, successful, or failed. Common use cases: Auditing commands
        sent across the enterprise Tracking scheduled vs immediate commands
        Reviewing historical command activity Troubleshooting command execution
        at scale Best Practices: Use pagination parameters to manage large
        datasets. Filter or search (if supported) to narrow results when
        investigating specific command IDs or timeframes. For device-level
        execution results, pair this endpoint with command status or event feed
        views.
      operationId: listCommandRequests
      tags:
        - commands_Command Request
      parameters:
        - in: query
          name: devices
          description: Filter by device IDs. Accepts comma separated values.
          schema:
            type: string
        - in: query
          name: groups
          description: Filter by group IDs. Accepts comma separated values.
          schema:
            type: string
        - in: query
          name: command
          description: Filter by command name
          schema:
            type: string
        - in: query
          name: schedule
          description: Filter by schedule type
          schema:
            type: string
            enum:
              - IMMEDIATE
              - WINDOW
              - RECURRING
        - in: query
          name: exclude_internal_commands
          description: Filter to exclude internal commands
          schema:
            type: boolean
            default: false
        - in: query
          name: limit
          schema:
            type: number
        - in: query
          name: offset
          schema:
            type: number
      security:
        - commands_apiKey: []
      responses:
        '200':
          description: Command request list for the Tenant
          content:
            application/json:
              schema:
                type: object
                properties:
                  code:
                    type: integer
                  message:
                    type: string
                  content:
                    type: object
                    properties:
                      count:
                        type: integer
                      previous:
                        type: string
                      next:
                        type: string
                      results:
                        type: array
                        items:
                          $ref: '#/components/schemas/commands_CommandRequest'
        '401':
          description: Authorization information is missing or invalid.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/commands_Error_401_Unauthorized'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/commands_Error_500_Internal_Server_Error'
    post:
      x-badges:
        - name: Stable
          color: green
      summary: Create a command request
      description: >
        Issues a device or group-level command using the stable command API.
        This endpoint supports multi-OS environments and scheduling options, and
        should be used for all new command integrations. Common use cases:
        Installing or uninstalling apps, pushing certificates, modifying device
        settings, sending notifications, enforcing policies, and other device
        actions supported by Esper. Best Practices: Ensure the command is
        supported for the device’s OS before sending. Decide whether to target
        specific devices (DEVICE) or a device group (GROUP). Determine whether
        the command should run IMMEDIATE or use scheduling options (if supported
        by the command). Validate command_args carefully—payload structure
        differs by command. Understand the command lifecycle (queued →
        acknowledged → in progress → success/failure). Monitor execution and
        final state in the Event Feed after issuing the request. Important:
        Response bodies can vary depending on the command. For detailed examples
        and command-specific payload guidance, refer to the API Commands help
        documentation:
        https://help.esper.io/hc/en-us/articles/29710806069393-Creating-API-Commands



        You can send the command immediately or [schedule
        command](https://help.esper.io/hc/en-us/articles/16693582666769-Scheduling-API-Commands)
        for supported devices.



        Scheduled commands are currently compatible with Android devices.
      operationId: createCommandRequest
      tags:
        - commands_Command Request
      security:
        - commands_apiKey: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/commands_CommandRequest_POST'
      responses:
        '201':
          description: Command request successfully created.
          content:
            application/json:
              schema:
                type: object
                properties:
                  code:
                    type: integer
                  message:
                    type: string
                  content:
                    $ref: '#/components/schemas/commands_CommandRequest'
        '400':
          description: Bad request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/commands_Error_400_Bad_Data'
        '401':
          description: Authorization information is missing or invalid.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/commands_Error_401_Unauthorized'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/commands_Error_500_Internal_Server_Error'
  /commands/v0/commands/{id}/:
    get:
      x-badges:
        - name: Stable
          color: green
      summary: Get a command request
      description: >
        Retrieves a single command request by its ID.


        Returns the full CommandRequest object, including the command type, its
        targeted devices or groups, the schedule used, and the arguments that
        were sent when the command was created.


        **About Get Command Request**

        A command request represents the original call made to POST
        /commands/v0/commands/; it captures what was asked for (the command, its
        targets, and its schedule), while the actual execution outcome per
        device is tracked separately by Command Status records. Use this
        endpoint to re-inspect exactly what was requested, for example when
        auditing or troubleshooting a command that didn't behave as expected.


        **Common Use Cases**


        Reviewing the original arguments and targets of a command after it was
        issued


        Confirming whether a command was scheduled or issued immediately


        **Best Practices**


        Pair this with GET /commands/v0/commands/{id}/stats/ to see the
        aggregate execution outcome alongside the original request details


        Use the id returned from POST /commands/v0/commands/ rather than a
        device-level command status id, since these are different identifiers


        **Workflow**


        Capture the id returned when the command request was created


        Call this endpoint to retrieve the full request detail


        Call the stats endpoint for the same id to see aggregate execution
        status
      operationId: getCommandRequest
      tags:
        - commands_Command Request
      security:
        - commands_apiKey: []
      parameters:
        - name: id
          in: path
          description: ID of the command request object
          required: true
          schema:
            type: string
      responses:
        '200':
          description: Command request information
          content:
            application/json:
              schema:
                type: object
                properties:
                  code:
                    type: integer
                  message:
                    type: string
                  content:
                    $ref: '#/components/schemas/commands_CommandRequest'
        '401':
          description: Authorization information is missing or invalid.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/commands_Error_401_Unauthorized'
        '404':
          description: Not Found.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/commands_Error_404_Not_Found'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/commands_Error_500_Internal_Server_Error'
  /commands/v0/commands/{id}/stats/:
    get:
      x-badges:
        - name: Stable
          color: green
      summary: Get stats of a command request
      description: >
        Retrieves an aggregated count of devices in each status for a given
        command request.


        Instead of listing every individual device status, this endpoint rolls
        the command's execution up into a count per state, for example how many
        devices are still queued versus how many succeeded or failed.


        **About Command Request Stats**

        When a command request targets many devices or a group, tracking each
        device's status individually can be unwieldy. This endpoint returns the
        CommandRequestStats object, an array of state and total pairs, giving a
        quick read on how a command is progressing across its full target set
        without paging through every device status record.


        **Common Use Cases**


        Building a progress summary for a command that was issued to a large
        group


        Quickly checking whether a command has finished executing across all
        targeted devices


        Determining whether any devices have failed a command without listing
        them individually first


        **Best Practices**


        Use this endpoint for a high-level progress check, then fall back to GET
        /commands/v0/status/ with a request filter if you need the specific
        devices behind a given count


        Poll this endpoint rather than the full status list when you only need
        aggregate numbers, to reduce response size


        **Workflow**


        Issue the command with POST /commands/v0/commands/ and capture the
        returned id


        Poll this endpoint to track aggregate progress by state


        If failures appear, filter GET /commands/v0/status/ by request and state
        to identify the specific devices
      operationId: getCommandRequestStats
      tags:
        - commands_Command Request
      security:
        - commands_apiKey: []
      parameters:
        - name: id
          in: path
          description: ID of the command request object
          required: true
          schema:
            type: string
      responses:
        '200':
          description: Aggregrated status information for a command request.
          content:
            application/json:
              schema:
                type: object
                properties:
                  code:
                    type: integer
                  message:
                    type: string
                  content:
                    $ref: '#/components/schemas/commands_CommandRequestStats'
        '401':
          description: Authorization information is missing or invalid.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/commands_Error_401_Unauthorized'
        '404':
          description: Not Found.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/commands_Error_404_Not_Found'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/commands_Error_500_Internal_Server_Error'
  /commands/v0/status/:
    get:
      x-badges:
        - name: Stable
          color: green
      summary: Get status list for command request
      description: >
        Retrieves a paginated, filterable list of individual command status
        records across the tenant.


        Each record represents one command's execution on one device, including
        its current state and the reason for that state. Filter by request,
        device, or state to narrow the list to the commands you're
        investigating.


        **About List Command Status**

        While a command request can target many devices at once, each device
        gets its own CommandStatus record tracking its individual progress
        through the command lifecycle, moving through Command Queued, Command
        Initiated, Command Acknowledged, Command In Progress, and a terminal
        state such as Command Success, Command Failure, Command TimeOut, or
        Command Cancelled. This endpoint is the primary way to see exactly which
        devices succeeded or failed within a given command request.


        **Key Fields / Query Parameters**


        request — filters by one or more command request IDs, accepts
        comma-separated values


        device — filters by one or more device IDs, accepts comma-separated
        values


        state — filters by command state, for example Command Failure or Command
        Queued


        exclude_internal_commands — excludes internally generated commands from
        the results when set to true


        **Common Use Cases**


        Listing every device that failed a specific command request


        Checking whether a specific device has picked up a command it was sent


        Auditing all command activity for a device over time by filtering on
        device alone


        **Best Practices**


        Combine request and state filters to jump straight to the failed devices
        within a large command request


        Use exclude_internal_commands to keep results focused on customer-issued
        commands when auditing


        **Workflow**


        Identify the request id from the command request, or the device id you
        want to investigate


        Call this endpoint with the appropriate filters


        Use the returned command status id with GET /commands/v0/status/{id}/
        for full detail on a specific record
      operationId: getCommandRequestStatuses
      tags:
        - commands_Command Status
      security:
        - commands_apiKey: []
      parameters:
        - in: query
          name: request
          description: >-
            Filter status result by command request IDs. Accepts comma separated
            values.
          schema:
            type: string
        - in: query
          name: device
          description: Filter status result by device IDs. Accepts comma separated values.
          schema:
            type: string
        - in: query
          name: state
          description: Filter by command state
          schema:
            type: string
            enum:
              - Command Queued
              - Command Initiated
              - Command Acknowledged
              - Command In Progress
              - Command TimeOut
              - Command Success
              - Command Failure
              - Command Scheduled
              - Command Cancelled
        - in: query
          name: exclude_internal_commands
          description: Filter to exclude internal commands
          schema:
            type: boolean
            default: false
        - in: query
          name: limit
          schema:
            type: number
        - in: query
          name: offset
          schema:
            type: number
      responses:
        '200':
          description: Status list for a command request
          content:
            application/json:
              schema:
                type: object
                properties:
                  code:
                    type: integer
                  message:
                    type: string
                  content:
                    type: object
                    properties:
                      count:
                        type: integer
                      previous:
                        type: string
                      next:
                        type: string
                      results:
                        type: array
                        items:
                          $ref: '#/components/schemas/commands_CommandStatus'
        '401':
          description: Authorization information is missing or invalid.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/commands_Error_401_Unauthorized'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/commands_Error_500_Internal_Server_Error'
  /commands/v0/status/{id}/:
    get:
      x-badges:
        - name: Stable
          color: green
      summary: Get a command status
      description: >
        Retrieves a single command status record by its ID.


        Returns the full CommandStatus object for one device's execution of one
        command, including its current state, the associated device and request
        IDs, and the reason for its current state.


        **About Get Command Status**

        This is the most granular status check available for a command's
        execution on a specific device. Use it once you already have a command
        status id, typically obtained by filtering GET /commands/v0/status/ down
        to the record you care about.


        **Common Use Cases**


        Checking the current state and reason for one device's execution of a
        command


        Confirming a command has reached a terminal state before considering it
        complete


        **Best Practices**


        Use the reason field to understand why a command failed rather than only
        checking state


        Cache this result briefly rather than polling continuously if the state
        is already terminal


        **Workflow**


        Filter GET /commands/v0/status/ by device or request to find the
        specific command status id


        Call this endpoint with that id for the full record
      operationId: getCommandStatus
      tags:
        - commands_Command Status
      security:
        - commands_apiKey: []
      parameters:
        - name: id
          in: path
          description: ID of the command status object
          required: true
          schema:
            type: string
      responses:
        '200':
          description: Command status information
          content:
            application/json:
              schema:
                type: object
                properties:
                  code:
                    type: integer
                  message:
                    type: string
                  content:
                    $ref: '#/components/schemas/commands_CommandStatus'
        '401':
          description: Authorization information is missing or invalid.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/commands_Error_401_Unauthorized'
        '404':
          description: Not Found.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/commands_Error_404_Not_Found'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/commands_Error_500_Internal_Server_Error'
    put:
      x-badges:
        - name: Stable
          color: green
      summary: Update command status
      description: >
        Updates the state of an individual command status record. Supports only
        CANCEL. Cancellations are not always guaranteed and depends on the
        command's exact state.


        **About Update Command Status**


        Each CommandStatus record tracks the execution of one command against
        one device and is created automatically when a command request targets
        that device. This endpoint lets you override the current lifecycle state
        directly rather than waiting for the device to report back. It's
        typically used by internal tooling and integrations that need to
        reconcile command state (such as cancelling a command stuck in Command
        Queued) rather than as part of a normal command-issuing workflow.


        **Key Fields / Request Body**


        state — the new command state; accepts Command Cancelled


        reason — free text explaining why the state was changed


        **Common Use Cases**


        Cancelling a command that is stuck in a queued state before it reaches
        the device


        Forcing a command into a terminal state when a device is known to be
        offline or decommissioned



        **Best Practices**


        Use GET /commands/v0/status/{id}/ first to confirm the command's current
        state before changing it


        Always include a reason so the change is auditable in the command
        history


        Prefer letting the device report its own status through the normal
        command lifecycle; only override manually when necessary


        **Workflow**


        Call GET /commands/v0/status/{id}/ to review the command's current state
        and device


        Determine the correct terminal or intermediate state to apply


        PUT the new state and reason to this endpoint


        Confirm the update by re-fetching the command status record
      operationId: updateCommandStatus
      tags:
        - commands_Command Status
      parameters:
        - name: id
          in: path
          description: ID of the command status object
          required: true
          schema:
            type: string
      security:
        - commands_apiKey: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/commands_CommandStatus_PUT'
      responses:
        '200':
          description: Command status successfully updated.
          content:
            application/json:
              schema:
                type: object
                properties:
                  code:
                    type: integer
                  message:
                    type: string
                  content:
                    $ref: '#/components/schemas/commands_CommandStatus'
        '400':
          description: Bad request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/commands_Error_400_Bad_Data'
        '401':
          description: Authorization information is missing or invalid.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/commands_Error_401_Unauthorized'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/commands_Error_500_Internal_Server_Error'
  /v2/command-inbox/:
    get:
      x-badges:
        - name: Stable
          color: green
      summary: Get queued commands to be executed by the physical device.
      description: >
        Retrieves the commands currently queued for a specific device to
        execute.


        This is the device-facing endpoint the Esper agent itself calls to pick
        up its pending work; it returns commands in the Command Queued state for
        the given device_id, along with the command arguments and basic device
        metadata.


        **About Command Inbox**


        While GET /commands/v0/status/ gives an administrative view of command
        execution across the tenant, the command inbox is the device-side queue
        that the Esper agent polls to find out what it needs to run next. It is
        scoped to a single device_id and reflects only commands that have not
        yet been picked up.


        **Key Fields / Query Parameters**


        device_id — the device whose queued commands should be returned,
        required


        **Common Use Cases**


        Verifying that a command was actually queued for delivery to a specific
        device


        Diagnosing a device that isn't executing commands by checking whether
        they are reaching its inbox at all


        **Best Practices**


        If a command doesn't appear here after being issued, check the device's
        connectivity and last-seen time before assuming the command failed to
        queue


        Use this alongside GET /commands/v0/status/{id}/ to distinguish between
        a command that never reached the device and one that reached it but
        failed to execute


        **Workflow**


        Issue a command targeting the device through POST /commands/v0/commands/


        Call this endpoint with the device_id to confirm the command is queued


        If the command doesn't appear, check the device's last-seen status
        before retrying
      operationId: getCommandInbox
      tags:
        - commands_Command Status
      parameters:
        - in: query
          name: device_id
          description: Filter status result by device IDs.
          required: true
          schema:
            type: string
      security:
        - commands_apiKey: []
      responses:
        '200':
          description: List of Queued Command Status
          content:
            application/json:
              schema:
                type: object
                properties:
                  code:
                    type: integer
                  message:
                    type: string
                  content:
                    $ref: '#/components/schemas/commands_CommandInbox'
        '400':
          description: Bad request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/commands_Error_400_Bad_Data'
        '401':
          description: Authorization information is missing or invalid.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/commands_Error_401_Unauthorized'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/commands_Error_500_Internal_Server_Error'
  /v2/converge:
    get:
      x-badges:
        - name: Stable
          color: green
      summary: List converge action
      description: >
        Retrieves a paginated list of Converge actions issued in the tenant.


        Each record reflects a single device's Converge request, including which
        blueprint and version it targeted and its current aggregate status.
        Filter by device_ids to scope the list to specific devices.


        **About List Converge Actions**


        Converge is the mechanism that assigns a device to a blueprint and
        blueprint version and brings it into alignment with that configuration,
        covering apps, files, restrictions, and platform settings. Each Converge
        action moves through QUEUED, PROCESSING, IN_PROGRESS, and a terminal
        SUCCESS or FAILURE state as Esper applies the blueprint. This endpoint
        is the tenant-wide view of that activity, separate from the alpha
        Operations API, which handles Converge issued at fleet scale through
        POST /v0/operations/.


        **Key Fields / Query Parameters**


        device_ids — filters results to one or more device IDs, accepts
        comma-separated values


        **Common Use Cases**


        Reviewing the Converge history for a specific device


        Auditing recent Converge activity across the tenant


        **Best Practices**


        Filter by device_ids when troubleshooting a specific device rather than
        paging through the full tenant-wide list


        For large-scale Converge issued through the Operations API, use GET
        /v0/operations/ and its device-level endpoints instead of this list


        **Workflow**


        Call this endpoint with device_ids to scope to the devices you're
        investigating


        Identify the converge id for the action you need


        Call GET /v2/converge/{id} for full detail, or
        /v2/converge/{id}/commands to see the underlying commands it fired
      operationId: listConverges
      tags:
        - drift_Converge
      parameters:
        - in: query
          name: device_ids
          description: Filter by device IDs. Accepts comma separated values.
          schema:
            type: string
        - in: query
          name: limit
          schema:
            type: number
        - in: query
          name: offset
          schema:
            type: number
      security:
        - drift_apiKey: []
      responses:
        '200':
          description: Converge action list for the Tenant
          content:
            application/json:
              schema:
                type: object
                properties:
                  content:
                    type: object
                    properties:
                      count:
                        type: integer
                      previous:
                        type: string
                      next:
                        type: string
                      results:
                        type: array
                        items:
                          $ref: '#/components/schemas/drift_Converge'
        '401':
          description: Authorization information is missing or invalid.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/drift_Error_401_Unauthorized'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/drift_Error_500_Internal_Server_Error'
    post:
      x-badges:
        - name: Stable
          color: green
      summary: Create a converge action
      description: >
        POST converge (V2). Assigns a device to a specific blueprint (and
        blueprint version) and triggers the converge workflow. Converge brings
        the device into alignment with the selected blueprint configuration,
        including apps, files, restrictions, and platform settings. What this
        endpoint does Assigns the device to the provided blueprint_id. Targets a
        specific blueprint_version_id. Queues a converge action (status: QUEUED)
        for execution. Optionally applies provisioning-related behavior via
        converge_with_provision_option. Workflow Use Get all blueprints (V2) to
        retrieve the desired blueprint_id and blueprint_version_id. Use a device
        listing endpoint to retrieve the device_id or group_id. Send a POST
        request to /api/v2/converge with the required identifiers. Monitor the
        converge/command status to confirm successful application.
      operationId: createConverge
      tags:
        - drift_Converge
      security:
        - drift_apiKey: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/drift_Converge_POST'
      responses:
        '201':
          description: Converge action successfully created.
          content:
            application/json:
              schema:
                type: object
                properties:
                  content:
                    $ref: '#/components/schemas/drift_Converge'
        '400':
          description: Bad request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/drift_Error_400_Bad_Data'
        '401':
          description: Authorization information is missing or invalid.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/drift_Error_401_Unauthorized'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/drift_Error_500_Internal_Server_Error'
  /v2/converge/{id}:
    get:
      x-badges:
        - name: Stable
          color: green
      summary: Get converge action
      description: >
        Retrieves the full detail of a single Converge action by its ID.


        Returns the blueprint and version targeted, the device it applies to,
        its current status, and the reason for that status.


        **About Get Converge Action**


        This is the detail view behind a single entry in the Converge list,
        useful for confirming exactly which blueprint_info a device was
        converged to and why a Converge action succeeded or failed. If a
        Converge action is marked FAILURE, check /v2/converge/{id}/commands to
        see which underlying command caused it.


        **Common Use Cases**


        Confirming which blueprint version a device was actually converged to


        Investigating why a specific Converge action failed


        **Best Practices**


        Check the reason field first when a Converge action shows FAILURE, then
        drill into its commands for the underlying cause


        Cross-reference blueprint_info against the intended blueprint_version_id
        to catch cases where a device converged to an unexpected version


        **Workflow**


        Obtain the converge id from the Converge list or from creating a new
        Converge action


        Call this endpoint to review its status and blueprint_info


        If status is FAILURE, call /v2/converge/{id}/commands to see the
        commands fired and their outcomes
      operationId: getConverge
      tags:
        - drift_Converge
      security:
        - drift_apiKey: []
      parameters:
        - name: id
          in: path
          description: ID of the converge object
          required: true
          schema:
            type: string
      responses:
        '200':
          description: Converge information
          content:
            application/json:
              schema:
                type: object
                properties:
                  content:
                    $ref: '#/components/schemas/drift_Converge'
        '401':
          description: Authorization information is missing or invalid.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/drift_Error_401_Unauthorized'
        '404':
          description: Not Found.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/drift_Error_404_Not_Found'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/drift_Error_500_Internal_Server_Error'
  /v2/converge/{id}/commands:
    get:
      x-badges:
        - name: Stable
          color: green
      summary: List commands fires for converge action
      description: >
        Retrieves the underlying commands that were fired to carry out a
        specific Converge action.


        A single Converge action can result in multiple individual commands
        being dispatched to a device (for example, installing apps and applying
        settings); this endpoint lists each of those commands along with its own
        state.


        **About Converge Commands**


        Converge doesn't apply a blueprint to a device directly; it decomposes
        the blueprint's configuration into individual commands and dispatches
        them. This endpoint exposes that breakdown, which is the most direct way
        to identify exactly which underlying action caused a Converge action to
        fail.


        **Key Fields / Query Parameters**


        command_state — each result's current state, for example Command Failure
        or Command Success


        **Common Use Cases**


        Identifying which specific command caused a Converge action to fail, for
        example a failed app install versus a failed settings change


        Auditing the full set of commands a Converge action generated


        **Best Practices**


        Check each command's command_state and reason individually rather than
        relying on the Converge action's overall status alone, since one failed
        command among several is enough to fail the whole Converge action


        Cross-reference command_request_id with GET /commands/v0/status/ if you
        need device-level command status detail beyond what's returned here


        **Workflow**


        Identify a Converge action with a FAILURE status from the Converge list
        or detail endpoint


        Call this endpoint with that converge id


        Review each command's command_state to find the one that failed
      operationId: listConvergeCommands
      tags:
        - drift_Converge Command
      parameters:
        - name: id
          in: path
          description: ID of the converge object
          required: true
          schema:
            type: string
        - in: query
          name: limit
          schema:
            type: number
        - in: query
          name: offset
          schema:
            type: number
      security:
        - drift_apiKey: []
      responses:
        '200':
          description: List of commands fired for converge action for the tenant
          content:
            application/json:
              schema:
                type: object
                properties:
                  content:
                    type: object
                    properties:
                      count:
                        type: integer
                      previous:
                        type: string
                      next:
                        type: string
                      results:
                        type: array
                        items:
                          $ref: '#/components/schemas/drift_ConvergeCommand'
        '401':
          description: Authorization information is missing or invalid.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/drift_Error_401_Unauthorized'
        '404':
          description: Not Found.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/drift_Error_404_Not_Found'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/drift_Error_500_Internal_Server_Error'
  /v2/seamless/upload:
    post:
      summary: Create a ABM provisioning request by uploading file
      description: >
        ⚠️ Apple devices only. 


        Creates one or more ABM provisioning requests by uploading a CSV file
        containing device identifiers, assigning devices to a blueprint and
        optionally a group.


        **About Create ABM Provisioning Request (CSV Upload)**


        Seamless provisioning (also referred to as ABM provisioning in Esper)
        pre-assigns newly enrolled Apple Business Manager devices to a blueprint
        and group before they reach end users, enabling hands-free setup. This
        endpoint accepts a multipart/form-data CSV upload (csv_file) containing
        the device identifiers to provision. On success, it returns a paginated
        list of SeamlessRequest records — one per device in the file — each
        including the assigned blueprint, group, and identifier metadata. For
        provisioning a single device by serial number without a CSV, use POST
        /api/v2/seamless.


        **Key Fields**


        csv_file (body, required) — Binary CSV file containing device
        identifiers


        id (response) — SeamlessRequest UUID


        assigned_blueprint_id (response) — Blueprint UUID assigned to the
        devices


        group_id (response) — Group UUID assigned to the devices (nullable)


        unique_ids (response) — The device identifiers from the CSV


        unique_id_type (response) — Integer type code identifying the identifier
        format used


        tenant_id (response) — Tenant UUID


        **Common Use Cases**


        Bulk pre-assigning a shipment of Apple devices to a blueprint and
        deployment group before enrollment


        Automating ABM provisioning for large device deployments using exported
        device lists


        Setting up hands-free enrollment workflows for iOS devices entering an
        ABM-managed fleet


        **Best Practices**


        Validate CSV formatting before upload — a 400 response indicates invalid
        file format or contents


        For single-device provisioning or API-driven workflows without a file,
        use POST /api/v2/seamless with a JSON body instead


        Capture the returned SeamlessRequest records to confirm each device was
        registered with the correct blueprint and group assignments
      x-badges:
        - name: Stable
          color: green
      tags:
        - device_onboarding_ABM Provisioning
      security:
        - device_onboarding_apiKey: []
      requestBody:
        required: true
        content:
          multipart/form-data:
            schema:
              type: object
              properties:
                csv_file:
                  type: string
                  format: binary
      responses:
        '200':
          description: ABM provisioning request successfully created.
          content:
            application/json:
              schema:
                type: object
                properties:
                  code:
                    type: integer
                  message:
                    type: string
                  content:
                    type: object
                    properties:
                      count:
                        type: integer
                      previous:
                        type: string
                      next:
                        type: string
                      results:
                        type: array
                        items:
                          $ref: >-
                            #/components/schemas/device_onboarding_SeamlessRequest
        '400':
          description: Bad request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/device_onboarding_Error_400_Bad_Data'
        '401':
          description: Authorization information is missing or invalid.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/device_onboarding_Error_401_Unauthorized'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: >-
                  #/components/schemas/device_onboarding_Error_500_Internal_Server_Error
  /v2/seamless:
    post:
      summary: Create a ABM provisioning request using device serial number
      description: >
        ⚠️ Apple devices only. 


        Creates an ABM provisioning request for one or more devices using device
        serial numbers supplied in a JSON request body, pre-assigning them to a
        blueprint and optionally a group.


        **About Create ABM Provisioning Request (Serial Number)**


        This endpoint is the JSON-body alternative to the CSV upload path for
        seamless ABM provisioning. It accepts a SeamlessRequestBody containing
        the assigned_blueprint_id, an optional group_id, and a seamless_info
        object with unique_ids (comma-separated device identifiers) and
        unique_id_type. On success it returns a single SeamlessRequest record.
        This is the preferred method for programmatic or API-driven provisioning
        workflows where device identifiers are available at runtime rather than
        in a pre-prepared file. For bulk provisioning from an exported device
        list, use POST /api/v2/seamless/upload.


        **Key Fields**


        assigned_blueprint_id (body, required) — UUID of the blueprint to assign
        to the devices


        group_id (body, optional) — UUID of the group to assign the devices to


        seamless_info.unique_ids (body) — Comma-separated device identifiers
        (e.g., serial numbers)


        seamless_info.unique_id_type (body) — Integer type code identifying the
        identifier format


        id (response) — SeamlessRequest UUID


        assigned_blueprint_id (response) — Confirmed blueprint assignment


        group_id (response) — Confirmed group assignment (nullable)


        **Common Use Cases**


        Programmatically pre-assigning a specific device to a blueprint as part
        of an automated provisioning pipeline


        Registering a known device serial number for zero-touch enrollment
        without preparing a CSV file


        Integrating ABM provisioning into a device lifecycle management workflow
        driven by an external system


        **Best Practices**


        Ensure assigned_blueprint_id references a published blueprint version —
        assigning an unpublished blueprint will result in a device that cannot
        complete hands-free enrollment


        Use comma-separated unique_ids to provision multiple devices in a single
        call rather than making repeated individual requests


        For large-scale bulk provisioning, POST /api/v2/seamless/upload with a
        CSV may be more practical
      x-badges:
        - name: Stable
          color: green
      tags:
        - device_onboarding_ABM Provisioning
      security:
        - device_onboarding_apiKey: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/device_onboarding_SeamlessRequestBody'
      responses:
        '200':
          description: Seamless request successfully created.
          content:
            application/json:
              schema:
                type: object
                properties:
                  code:
                    type: integer
                  message:
                    type: string
                  content:
                    $ref: '#/components/schemas/device_onboarding_SeamlessRequest'
        '400':
          description: Bad request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/device_onboarding_Error_400_Bad_Data'
        '401':
          description: Authorization information is missing or invalid.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/device_onboarding_Error_401_Unauthorized'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: >-
                  #/components/schemas/device_onboarding_Error_500_Internal_Server_Error
  /onboarding/v0/depsyncs/:
    get:
      summary: List all DEP sync requests for the tenant
      description: >
        ⚠️ Apple devices only. DEP (Device Enrollment Program) is an Apple
        provisioning technology, now part of Apple Business Manager.


        Retrieves a paginated list of all DEP sync requests for the tenant,
        including each request's status and any device-level failure details.


        **About List DEP Sync Requests**


        Apple's Device Enrollment Program (DEP), accessed through Apple Business
        Manager, assigns managed devices to an MDM server. A DEP sync request
        triggers Esper to pull the latest device assignments from Apple's DEP
        service, ensuring that newly enrolled or reassigned Apple devices are
        reflected in the tenant. Each DEPSyncRequestForGetResponse record
        includes the request's lifecycle status (QUEUED, INPROGRESS, COMPLETE,
        SUCCESS, or FAILURE), the user or service that created the request
        (created_by), and the timestamps for when the request was created and
        last updated. On failure, a failure_reason and a devices object may
        contain details about specific devices that failed to sync. Use POST
        /api/onboarding/v0/depsyncs/ to trigger a new sync, and GET
        /api/onboarding/v0/depsyncs/{id}/ to retrieve a specific request.


        **Key Response Fields**


        id — DEP sync request UUID


        status — QUEUED, INPROGRESS, COMPLETE, SUCCESS, or FAILURE


        failure_reason — High-level reason for sync failure (present on FAILURE
        status)


        devices.failure — Array of {serial, reason} objects for devices that
        failed to process


        created_by — User who triggered the sync


        created_at / updated_at — Timestamps


        **Common Use Cases**


        Reviewing the history of DEP sync operations to confirm when devices
        were last successfully synced from Apple


        Identifying which specific devices failed in a DEP sync and why


        Auditing DEP sync activity for compliance or onboarding reporting


        **Best Practices**


        On FAILURE status, inspect both failure_reason for the overall cause and
        devices.failure for per-device detail — they may differ


        Paginate with limit and offset for tenants with a long sync history
      operationId: listDEPSyncRequest
      x-badges:
        - name: Stable
          color: green
      tags:
        - device_onboarding_DEP Sync Request
      security:
        - device_onboarding_apiKey: []
      responses:
        '200':
          description: DEP sync request list for the Tenant
          content:
            application/json:
              schema:
                type: object
                properties:
                  code:
                    type: integer
                  message:
                    type: string
                  content:
                    type: object
                    properties:
                      count:
                        type: integer
                      previous:
                        type: string
                      next:
                        type: string
                      results:
                        type: array
                        items:
                          $ref: >-
                            #/components/schemas/device_onboarding_DEPSyncRequestForGetResponse
        '401':
          description: Authorization information is missing or invalid.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/device_onboarding_Error_401_Unauthorized'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: >-
                  #/components/schemas/device_onboarding_Error_500_Internal_Server_Error
    post:
      summary: Create a DEP sync request
      description: >
        ⚠️ Apple devices only. DEP (Device Enrollment Program) is an Apple
        provisioning technology, now part of Apple Business Manager.


        Triggers a new DEP sync request, instructing Esper to pull the latest
        device assignments from Apple's DEP service for the tenant.

        About Create DEP Sync Request

        This endpoint initiates a DEP sync — the process by which Esper fetches
        the current set of Apple-assigned devices from Apple Business Manager
        and updates the tenant's device enrollment records accordingly. The
        request body is an empty JSON object; no parameters are required. The
        sync runs asynchronously: the 200 response returns a DEPSyncRequest
        record with a QUEUED or initial status, and the sync progresses through
        INPROGRESS to COMPLETE, SUCCESS, or FAILURE. Poll GET
        /api/onboarding/v0/depsyncs/{id}/ to track progress, or use GET
        /api/onboarding/v0/depsyncs/ to review status across all sync requests.


        **Key Fields**


        Request body — Empty JSON object ({})


        id (response) — UUID of the newly created DEP sync request


        status (response) — Initial status: QUEUED or INPROGRESS


        created_by / created_at — Audit fields


        **Common Use Cases**


        Triggering a DEP sync after adding new devices to Apple Business Manager
        to make them available in Esper


        Forcing a refresh of device enrollment assignments following an ABM
        organizational change


        Programmatically scheduling regular DEP syncs as part of a device
        onboarding pipeline


        **Best Practices**


        Avoid triggering DEP syncs in rapid succession — syncs run
        asynchronously and queuing multiple requests simultaneously is unlikely
        to produce faster results


        After triggering, poll GET /api/onboarding/v0/depsyncs/{id}/ using the
        returned id to track the sync to completion before taking dependent
        actions


        For GET responses with full failure detail (including per-device failure
        reasons), use GET /api/onboarding/v0/depsyncs/{id}/ — the POST response
        uses the lighter DEPSyncRequest schema without device-level failure data


        **Workflow**


        Trigger the sync with an empty JSON POST body


        Capture the returned id


        Poll GET /api/onboarding/v0/depsyncs/{id}/ until status reaches SUCCESS,
        COMPLETE, or FAILURE
      operationId: createDEPSyncRequest
      x-badges:
        - name: Stable
          color: green
      tags:
        - device_onboarding_DEP Sync Request
      security:
        - device_onboarding_apiKey: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
      responses:
        '200':
          description: DEP sync request successfully created.
          content:
            application/json:
              schema:
                type: object
                properties:
                  code:
                    type: integer
                  message:
                    type: string
                  content:
                    $ref: '#/components/schemas/device_onboarding_DEPSyncRequest'
        '400':
          description: Bad request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/device_onboarding_Error_400_Bad_Data'
        '401':
          description: Authorization information is missing or invalid.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/device_onboarding_Error_401_Unauthorized'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: >-
                  #/components/schemas/device_onboarding_Error_500_Internal_Server_Error
  /onboarding/v0/depsyncs/{id}/:
    get:
      summary: Get a DEP sync request
      description: >
        ⚠️ Apple devices only. DEP (Device Enrollment Program) is an Apple
        provisioning technology, now part of Apple Business Manager.


        Retrieves the current status and full detail of a specific DEP sync
        request by its UUID, including per-device failure information if the
        sync encountered errors.


        **About Get DEP Sync Request**

        This is the detail and polling endpoint for a single DEP sync request.
        It returns a DEPSyncRequestForGetResponse — the richer schema compared
        to the POST response — which includes the failure_reason field and the
        devices.failure array listing individual device serials and their
        specific failure reasons when the sync status is FAILURE. Use this
        endpoint to determine when a sync has completed and to diagnose any
        device-level issues that occurred during the sync. The status field
        progresses from QUEUED through INPROGRESS to a terminal state: COMPLETE,
        SUCCESS, or FAILURE.


        **Key Fields**


        id (path) — DEP sync request UUID (required)


        status — QUEUED, INPROGRESS, COMPLETE, SUCCESS, or FAILURE


        failure_reason — Overall failure description (present when status is
        FAILURE)


        devices.failure — Array of {serial, reason} objects for each device that
        failed to process (present when failure_reason is included)


        created_by — User who triggered the sync


        created_at / updated_at — Timestamps


        **Common Use Cases**


        Polling a DEP sync to completion after triggering it with POST
        /api/onboarding/v0/depsyncs/


        Retrieving per-device failure detail when a sync reaches FAILURE status


        Confirming the exact completion time of a sync for audit or pipeline
        sequencing purposes


        **Best Practices**


        Poll at a reasonable interval (e.g., every 30 seconds) — DEP syncs are
        Apple-dependent and duration varies with device count and Apple service
        response time


        When status is FAILURE, always check both failure_reason (overall) and
        devices.failure (per-device) — a sync may fail for an overall reason,
        for per-device reasons, or both


        Use updated_at as the authoritative timestamp for when the sync reached
        its terminal state
      operationId: getDEPSyncRequest
      x-badges:
        - name: Stable
          color: green
      tags:
        - device_onboarding_DEP Sync Request
      security:
        - device_onboarding_apiKey: []
      parameters:
        - name: id
          in: path
          description: ID of the DEP sync request object
          required: true
          schema:
            type: string
      responses:
        '200':
          description: DEP sync request information
          content:
            application/json:
              schema:
                type: object
                properties:
                  code:
                    type: integer
                  message:
                    type: string
                  content:
                    $ref: >-
                      #/components/schemas/device_onboarding_DEPSyncRequestForGetResponse
        '401':
          description: Authorization information is missing or invalid.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/device_onboarding_Error_401_Unauthorized'
        '404':
          description: Not Found.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/device_onboarding_Error_404_Not_Found'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: >-
                  #/components/schemas/device_onboarding_Error_500_Internal_Server_Error
  /tenant/v0/apnscertificates/:
    get:
      x-badges:
        - name: Stable
          color: green
      summary: Get all APNs certificate meta data for the Tenant
      description: >
        ⚠️ iOS/iPadOS/tvOS only. APNs (Apple Push Notification service)
        certificates are required for Esper to communicate with and manage Apple
        devices.


        Retrieves a paginated list of APNs certificate records for the tenant,
        with optional filtering by state.Returns APNSCertInfo records containing
        each certificate's state, Apple ID, topic, creation timestamp, and
        expiry date. Default page size is 10.


        **About List APNs Certificates**


        APNs certificates enable the Esper MDM server to send push notifications
        to iOS and iPadOS managed devices — without a valid certificate, device
        management commands cannot be delivered. Each APNSCertInfo record
        represents a certificate in one of two states: CSR_GENERATED (the CSR
        has been generated via POST /api/tenant/v0/apnscertificates/ but the
        signed certificate has not yet been uploaded) or COMPLETED (the signed
        certificate has been uploaded via PUT
        /api/tenant/v0/apnscertificates/{id}/ and is active). The
        meta.cert_expiry_on field is critical for proactive certificate renewal
        — APNs certificates expire annually and must be renewed before expiry to
        avoid loss of device management capability.Key Query Parameters / 


        **Response Fields**


        state (query) — Filter by CSR_GENERATED or COMPLETED


        id — APNs certificate record UUID


        apple_id — Apple ID associated with the certificate


        meta.topic — APNs topic string for the certificate


        meta.cert_created_at — Timestamp when the certificate was created at
        Apple


        meta.cert_expiry_on — Certificate expiry datetime — monitor this for
        renewal


        state — CSR_GENERATED or COMPLETED


        **Common Use Cases**


        Auditing all APNs certificates in the tenant and their expiry dates for
        renewal planning


        Identifying certificates stuck in CSR_GENERATED state that have not been
        completed


        Confirming which Apple ID is associated with each active certificate


        **Best Practices**


        Monitor meta.cert_expiry_on proactively — APNs certificates expire
        annually and must be renewed before expiry to maintain uninterrupted iOS
        device management


        Filter by state=CSR_GENERATED to identify in-progress certificate setups
        that have not been completed


        Renewing an APNs certificate must use the same Apple ID as the original;
        verify apple_id before beginning renewal
      operationId: listAPNsCerts
      tags:
        - tenant_APNs certificate
      security:
        - tenant_apiKey: []
      parameters:
        - in: query
          name: limit
          schema:
            type: integer
            default: 10
          description: Number of records to return
        - in: query
          name: offset
          schema:
            type: integer
            default: 0
          description: Number of records to skip
        - in: query
          name: state
          schema:
            type: string
            enum:
              - CSR_GENERATED
              - COMPLETED
      responses:
        '200':
          description: APNs certificate meta data list for the Tenant
          content:
            application/json:
              schema:
                type: object
                properties:
                  code:
                    type: integer
                  message:
                    type: string
                  content:
                    type: object
                    properties:
                      count:
                        type: integer
                      previous:
                        type: string
                      next:
                        type: string
                      results:
                        type: array
                        items:
                          $ref: '#/components/schemas/tenant_APNSCertInfo'
        '401':
          description: Authorization information is missing or invalid.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/tenant_Error_401_Unauthorized'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/tenant_Error_500_Internal_Server_Error'
    post:
      x-badges:
        - name: Stable
          color: green
      summary: Get the CSR file to upload to the apple identity console
      description: >
        ⚠️ iOS/iPadOS/tvOS only. This is step 1 of the APNs certificate setup
        workflow.


        Generates a CSR (Certificate Signing Request) file for the tenant's
        Esper server, returning it as a downloadable .plist binary for upload to
        Apple's identity portal.


        **About Generate APNs CSR**


        This endpoint initiates the APNs certificate setup process. The request
        body is an empty JSON object; no parameters are required. The response
        is not JSON — it returns a binary application/x-plist file (the CSR)
        that must be downloaded and uploaded to Apple's Push Certificates Portal
        to obtain a signed APNs certificate. The signed certificate is then
        uploaded back to Esper via PUT /api/tenant/v0/apnscertificates/{id}/ to
        complete the setup. Calling this endpoint also creates a new
        APNSCertInfo record in CSR_GENERATED state, retrievable by the returned
        id. Each call generates a new CSR and a new certificate record — do not
        call this multiple times for the same setup.


        **Full APNs Certificate Workflow**


        Step 1: (This step) Esper API — POST /api/tenant/v0/apnscertificates/ →
        downloads the .plist CSR file


        Step 2: (Outside of the API workflow) Apple Portal (out-of-band) — log
        into Apple's Push Certificates Portal, upload the .plist CSR, and
        download the signed .pem certificate Apple returns


        Step 3: Esper API — PUT /api/tenant/v0/apnscertificates/{id}/ → upload
        the signed cert + Apple ID back to Esper


        **Key Fields**


        Request body — Empty JSON object ({})


        Response — Binary application/x-plist CSR file (download and save; do
        not attempt to parse as JSON)


        The corresponding APNSCertInfo record (with id and state=CSR_GENERATED)
        is created and retrievable via GET /api/tenant/v0/apnscertificates/


        **Common Use Cases**


        Starting the APNs certificate setup process for a new tenant or after
        certificate expiry


        Generating a new CSR as part of the annual APNs certificate renewal
        workflow


        **Best Practices**


        Do not call this endpoint multiple times for the same setup — each call
        creates a new record and CSR, which can result in orphaned CSR_GENERATED
        records


        Use the same Apple ID throughout the workflow — the Apple ID used at the
        Apple portal must match what is submitted in the PUT step


        Treat the response as a file download; store the .plist before
        proceeding to the Apple portal
      operationId: getAPNsCSR
      tags:
        - tenant_APNs certificate
      security:
        - tenant_apiKey: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
      responses:
        '200':
          description: Created
          content:
            application/x-plist:
              schema:
                type: string
                format: binary
        '400':
          description: Bad request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/tenant_Error_400_Bad_Data'
        '401':
          description: Authorization information is missing or invalid.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/tenant_Error_401_Unauthorized'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/tenant_Error_500_Internal_Server_Error'
  /tenant/v0/apnscertificates/{id}/:
    get:
      x-badges:
        - name: Stable
          color: green
      summary: Get APNs certificate meta information
      description: >
        ⚠️ iOS/iPadOS/tvOS only.


        Retrieves the metadata record for a specific APNs certificate by its
        UUID.Returns a single APNSCertInfo object with the certificate's state,
        associated Apple ID, APNs topic, creation and expiry timestamps, and
        audit fields.


        **About Get APNs Certificate**


        Direct lookup for a single APNs certificate record, returning the same
        APNSCertInfo schema as the list endpoint. Use this endpoint to check the
        state and expiry of a specific certificate when its id is already known
        — for example, after generating a CSR to confirm the record was created,
        or to check meta.cert_expiry_on for renewal planning. A state of
        CSR_GENERATED indicates the setup workflow has been started but the
        signed certificate has not yet been uploaded; COMPLETED means the
        certificate is active.


        **Key Fields**


        id (path) — APNs certificate record UUID (required)


        state — CSR_GENERATED or COMPLETED


        apple_id — Apple ID associated with the certificate


        meta.topic — APNs topic string


        meta.cert_expiry_on — Certificate expiry datetime


        meta.cert_created_at — Certificate creation timestamp at Apple


        **Common Use Cases**


        Confirming a new APNs certificate record was created after calling the
        CSR generation endpoint


        Checking the expiry date of a specific active certificate for renewal
        scheduling


        Verifying the Apple ID and topic for a certificate before renewal


        **Best Practices**


        Use meta.cert_expiry_on to schedule renewal — APNs certificates expire
        annually and must be renewed before expiry to maintain iOS device
        management


        If state is CSR_GENERATED and no PUT has been performed, the certificate
        setup is incomplete — proceed with uploading the signed certificate via
        PUT /api/tenant/v0/apnscertificates/{id}/
      operationId: getAPNsCert
      tags:
        - tenant_APNs certificate
      security:
        - tenant_apiKey: []
      parameters:
        - name: id
          in: path
          description: ID of the APNs certificate meta object
          required: true
          schema:
            type: string
      responses:
        '200':
          description: APNs certificate meta information
          content:
            application/json:
              schema:
                type: object
                properties:
                  code:
                    type: integer
                  message:
                    type: string
                  content:
                    $ref: '#/components/schemas/tenant_APNSCertInfo'
        '401':
          description: Authorization information is missing or invalid.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/tenant_Error_401_Unauthorized'
        '404':
          description: Not Found.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/tenant_Error_404_Not_Found'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/tenant_Error_500_Internal_Server_Error'
    put:
      x-badges:
        - name: Stable
          color: green
      summary: Upload APNs certificate
      description: >
        ⚠️ iOS/iPadOS/tvOS only. This is step 3 of the APNs certificate setup
        workflow.


        Uploads the signed APNs certificate obtained from Apple's Push
        Certificates Portal to Esper, completing the APNs setup for the tenant.


        **About Upload APNs Certificate**


        This endpoint completes the APNs certificate workflow by accepting the
        signed certificate file and the Apple ID used to sign it. The id path
        parameter refers to the APNSCertInfo record created when the CSR was
        generated via POST /api/tenant/v0/apnscertificates/. The request uses
        multipart/form-data with two required fields: file (the signed
        certificate binary) and apple_id (the Apple ID used at Apple's Push
        Certificates Portal). On success, the certificate record transitions
        from CSR_GENERATED to COMPLETED state and the tenant's iOS devices can
        receive push-delivered management commands. The apple_id submitted here
        must match the one used at Apple's portal — a mismatch will prevent
        successful activation.


        **Key Fields**


        id (path) — APNs certificate record UUID from the CSR generation step
        (required)


        file (body, required) — Signed APNs certificate binary obtained from
        Apple's Push Certificates Portal


        apple_id (body, required) — Apple ID used to sign the certificate at
        Apple's portal


        **Common Use Cases**


        Completing initial APNs certificate setup after uploading the CSR to
        Apple and downloading the signed certificate


        Renewing an expiring APNs certificate by uploading the newly signed
        renewal certificate


        **Best Practices**


        Ensure apple_id exactly matches the Apple ID used at Apple's Push
        Certificates Portal — mismatches will prevent activation and cannot be
        corrected without regenerating the CSR


        For annual renewal, use the same Apple ID as the original certificate —
        renewing with a different Apple ID creates a new certificate rather than
        renewing the existing one, which can disrupt existing device enrollments


        After upload, confirm the record's state has transitioned to COMPLETED
        using GET /api/tenant/v0/apnscertificates/{id}/ before relying on push
        delivery for device management


        **Workflow**


        Generate CSR via POST /api/tenant/v0/apnscertificates/ → obtain id


        Upload CSR to Apple Push Certificates Portal with the intended Apple ID
        → download signed certificate


        PUT signed certificate + Apple ID to this endpoint using the id from
        step 1
      operationId: uploadAPNsCert
      tags:
        - tenant_APNs certificate
      security:
        - tenant_apiKey: []
      parameters:
        - name: id
          in: path
          description: ID of the APNs certificate meta object
          required: true
          schema:
            type: string
      requestBody:
        required: true
        content:
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/tenant_APNSCert_PUT'
      responses:
        '200':
          description: Uploaded APNs certificate meta Information
          content:
            application/json:
              schema:
                type: object
                properties:
                  code:
                    type: integer
                  message:
                    type: string
                  content:
                    $ref: '#/components/schemas/tenant_APNSCertInfo'
        '400':
          description: APNs certificate update error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/tenant_Error_400_Bad_Data'
        '401':
          description: APNs certificate update error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/tenant_Error_401_Unauthorized'
        '404':
          description: Not Found.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/tenant_Error_404_Not_Found'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/tenant_Error_500_Internal_Server_Error'
    delete:
      x-badges:
        - name: Stable
          color: green
      summary: Delete a APNs certificate
      description: >
        ⚠️ iOS/iPadOS/tvOS only.


        Deletes an APNs certificate record from the Esper tenant by its ID.


        Once deleted, Esper can no longer send push notifications to iOS devices
        provisioned under that certificate; devices will lose MDM connectivity
        until a new certificate is uploaded and enrolled.


        **About Delete APNs Certificate**


        APNs (Apple Push Notification service) certificates are required for all
        iOS MDM communication between Esper and Apple-managed devices. Deleting
        a certificate invalidates the Esper-side record; however, the
        corresponding certificate entry in the Apple Push Certificates Portal is
        unaffected and must be managed separately. This operation is
        irreversible — if you need to re-establish iOS MDM for the tenant, you
        must create a new APNs certificate from scratch. Only tenants with iOS
        provisioning enabled will have APNs certificate records.


        **Key Fields / Query Parameters**


        id (path, required) — The UUID of the APNs certificate meta object to
        delete, as returned by the list or create APNs certificate endpoints.

        **Common Use Cases**


        Removing a certificate tied to a deprecated Apple ID or service account
        before replacing it with a new one


        Cleaning up stale certificate records after migrating to a new Apple
        Push Certificates account


        Decommissioning iOS management for a tenant


        **Best Practices**


        Ensure all affected iOS devices have been unenrolled or migrated before
        deleting a certificate, as deletion immediately breaks MDM connectivity
        for those devices.


        Use a dedicated service account Apple ID for APNs certificates so that
        ownership is not tied to an individual who may leave the organization.


        Before deleting, retrieve the certificate details via GET
        /api/tenant/v0/apnscertificates/{id}/ to confirm you have the correct
        record.


        **Workflow**


        List existing APNs certificates via GET /api/tenant/v0/apnscertificates/
        to identify the correct certificate id.


        Unenroll or migrate all iOS devices relying on that certificate.


        Send DELETE /api/tenant/v0/apnscertificates/{id}/ to remove the
        certificate record from Esper.


        Upload and enroll a new APNs certificate if continued iOS MDM management
        is required.
      operationId: deleteAPNsCert
      tags:
        - tenant_APNs certificate
      security:
        - tenant_apiKey: []
      parameters:
        - name: id
          in: path
          description: ID of the APNs certificate meta object
          required: true
          schema:
            type: string
      responses:
        '204':
          description: Deleted APNs certificate
          content:
            application/json:
              schema:
                type: object
                properties:
                  code:
                    type: integer
                  message:
                    type: string
                  content:
                    type: object
        '401':
          description: APNs certificate delete error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/tenant_Error_401_Unauthorized'
        '404':
          description: Not Found.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/tenant_Error_404_Not_Found'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/tenant_Error_500_Internal_Server_Error'
  /tenant/v0/vpptokens/:
    get:
      x-badges:
        - name: Stable
          color: green
      security:
        - tenant_apiKey: []
      summary: Get all VPP tokens for the tenant
      description: >
        ⚠️ iOS/iPadOS/tvOS only.


        Returns all Volume Purchase Program (VPP) tokens registered to the Esper
        tenant.


        Use this endpoint to audit which VPP tokens are currently on file, check
        their metadata and expiry status, and identify tokens that need renewal
        before they affect app distribution.


        **About List VPP Tokens**


        VPP tokens enable Esper to distribute paid and free apps from the Apple
        App Store to managed iOS devices on behalf of an Apple Business
        organization. Each token is associated with a specific location in Apple
        Business, and Esper recommends tying one token to one location to avoid
        app installation conflicts. Tokens expire annually and must be renewed
        before expiry to maintain uninterrupted app management. The response
        includes pagination fields (count, next, previous) and an array of
        VPPToken objects.


        **Key Fields / Query Parameters**


        id — UUID of the VPP token record in Esper.


        meta — Object containing token metadata, including expiry information.


        created_at / updated_at — Timestamps for auditing when the token was
        uploaded or last modified.


        **Common Use Cases**


        Retrieving all VPP tokens to check expiry dates before the annual
        renewal window


        Auditing which Apple Business locations have active tokens registered in
        Esper


        Verifying a VPP token was successfully stored after upload


        **Best Practices**


        Monitor meta for expiry dates and renew tokens before they lapse;
        expired VPP tokens will block app installations and updates on enrolled
        iOS devices.


        Associate each VPP token with a dedicated, Esper-specific Apple Business
        location to prevent conflicts with other MDM platforms.


        If you manage multiple regions, use the VPP country selection feature in
        Apple MDM Management to configure up to five countries per token.
      tags:
        - tenant_VPP Token Management
      responses:
        '200':
          description: VPP tokens for the Tenant
          content:
            application/json:
              schema:
                type: object
                properties:
                  code:
                    type: integer
                    default: 200
                  message:
                    type: string
                  content:
                    type: object
                    properties:
                      count:
                        type: integer
                      previous:
                        type: string
                      next:
                        type: string
                      results:
                        type: array
                        items:
                          $ref: '#/components/schemas/tenant_VPPToken'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/tenant_Error_401_Unauthorized'
        '500':
          description: Internal Server Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/tenant_Error_500_Internal_Server_Error'
    post:
      x-badges:
        - name: Stable
          color: green
      security:
        - tenant_apiKey: []
      summary: Store a VPP token
      description: >
        ⚠️ iOS/iPadOS/tvOS only.


        Uploads a VPP token file to the Esper tenant to enable Apple App Store
        app distribution on managed iOS devices.


        Submit the token as multipart/form-data; on success, Esper stores the
        token and returns the new VPPToken record with its assigned id for use
        in subsequent operations.


        **About Upload VPP Token**


        A VPP (Volume Purchase Program) token is a .vpptoken file downloaded
        from an Apple Business location's Apps & Books settings. Uploading it to
        Esper grants the tenant the ability to assign and install App Store apps
        on enrolled iOS devices without requiring individual Apple IDs on each
        device. Esper recommends creating a dedicated Apple Business location
        specifically for your Esper MDM integration before downloading and
        uploading the token. If migrating from another MDM platform, the
        existing VPP token should be migrated to avoid losing app licenses.


        **Key Fields / Query Parameters**


        filename (form field, binary) — The .vpptoken file downloaded from Apple
        Business.


        **Common Use Cases**


        Initial setup of iOS app management after configuring Apple MDM
        Management in Esper


        Migrating a VPP token from a previous MDM platform to Esper


        Adding a second VPP token for a new Apple Business location or region


        **Best Practices**


        Create and use a dedicated Apple Business location for Esper before
        downloading the VPP token to avoid conflicts with other MDM platforms
        sharing the same token.


        Download the token from the correct MDM server entry in Apple Business
        (it will match the location name).


        After upload, verify the token was stored correctly via GET
        /api/tenant/v0/vpptokens/ before assigning apps to devices.


        **Workflow**


        In Apple Business, create a location dedicated to Esper MDM and navigate
        to Settings > Payments & Billing > Apps & Books.


        Select the linked Esper MDM server and download the .vpptoken file.


        POST the file as multipart/form-data to /api/tenant/v0/vpptokens/.


        Confirm the returned VPPToken record and note the id for future
        reference.
      tags:
        - tenant_VPP Token Management
      requestBody:
        content:
          multipart/form-data:
            schema:
              type: object
              properties:
                filename:
                  type: string
                  format: binary
      responses:
        '201':
          description: Created
          content:
            application/json:
              schema:
                type: object
                properties:
                  code:
                    type: integer
                    default: 201
                  message:
                    type: string
                  content:
                    $ref: '#/components/schemas/tenant_VPPToken'
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/tenant_Error_400_Bad_Data'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/tenant_Error_401_Unauthorized'
        '500':
          description: Internal Server Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/tenant_Error_500_Internal_Server_Error'
  /tenant/v0/vpptokens/{id}:
    delete:
      x-badges:
        - name: Stable
          color: green
      security:
        - tenant_apiKey: []
      parameters:
        - in: path
          name: id
          schema:
            type: integer
          required: true
      summary: Delete VPP Token
      description: >
        ⚠️ iOS/iPadOS/tvOS only.


        Deletes a VPP token from the Esper tenant by its ID.


        Once deleted, Esper can no longer distribute or manage Apple App Store
        apps associated with that token's Apple Business location; previously
        installed apps remain on devices but cannot be updated or reassigned
        through Esper.


        **About Delete VPP Token**


        VPP tokens link Esper to a specific Apple Business location for app
        license management. Removing a token from Esper does not revoke app
        licenses in Apple Business, but it ends Esper's ability to manage those
        licenses going forward. This action is appropriate when retiring an
        Apple Business location, replacing a token with a renewed one, or
        decommissioning iOS app management entirely. Use the id returned from
        GET /api/tenant/v0/vpptokens/ or POST /api/tenant/v0/vpptokens/ to
        identify the correct token.


        **Key Fields / Query Parameters**


        id (path, required, integer) — The identifier of the VPP token record to
        delete.


        **Common Use Cases**


        Removing an expired token before uploading a renewed one


        Cleaning up a stale token from a retired Apple Business location


        Decommissioning iOS app management for the tenant


        **Best Practices**


        Before deleting, verify that no active iOS devices are relying on app
        licenses managed through this token.


        Upload a replacement token via POST /api/tenant/v0/vpptokens/
        immediately after deletion to minimize disruption to app management.


        Confirm the correct token using GET /api/tenant/v0/vpptokens/ before
        deleting, especially in tenants with multiple VPP tokens.
      tags:
        - tenant_VPP Token Management
      responses:
        '204':
          description: Success
          content:
            application/json:
              schema:
                type: object
                properties:
                  code:
                    type: integer
                    description: response code
                    default: 204
                  message:
                    type: string
                    description: response message
                  content:
                    type: object
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/tenant_Error_401_Unauthorized'
        '404':
          description: Resource Not Found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/tenant_Error_404_Not_Found'
        '500':
          description: Internal Server Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/tenant_Error_500_Internal_Server_Error'
  /tenant/v0/deptokens/:
    post:
      x-badges:
        - name: Stable
          color: green
      summary: Generate the public key file
      description: >
        ⚠️ iOS/iPadOS/tvOS only.


        Generates and downloads the Esper public key file (.pem) required to
        register an MDM server entry and create a DEP token in Apple Business
        Manager.


        This is the first step in the DEP token setup workflow: the returned
        public key file must be uploaded to Apple Business Manager to generate
        the encrypted server token (.p7m) that is then uploaded back to Esper.


        **About Generate DEP Public Key**


        Device Enrollment Program (DEP) tokens allow Esper to communicate with
        Apple Business Manager (ABM) to automatically enroll DEP-provisioned iOS
        devices. The process begins with generating an Esper public key, which
        ABM uses to encrypt the server token it returns. This key exchange is
        required by Apple as a security measure in the MDM server registration
        flow. The response is a plain-text PEM file delivered as an attachment
        (Esper_Public_Key.pem), not a JSON object. The resulting DEP token
        record is created in state CSR_GENERATED until the server token is
        uploaded via PUT /api/tenant/v0/deptokens/{id}/.Key Fields / Query
        Parameters


        Request body is optional (DEP_Token_POST schema is an empty object).

        Response is a text/plain PEM-formatted public key file with
        Content-Disposition: attachment; filename="Esper_Public_Key.pem".


        **Common Use Cases**


        Initial DEP token setup for a new Esper tenant provisioning iOS devices
        through Apple Business


        Regenerating a public key when rotating DEP credentials


        Starting the renewal process for an expiring DEP token


        **Best Practices**


        Upload the public key to ABM promptly; do not share the file externally.


        After uploading to ABM and downloading the resulting server token,
        proceed to PUT /api/tenant/v0/deptokens/{id}/ to complete the
        registration — use GET /api/tenant/v0/deptokens/ to retrieve the id of
        the newly created CSR_GENERATED record.


        Use a consistent Apple Business account across all DEP token operations
        to avoid mismatch errors.


        **Workflow**


        Call POST /api/tenant/v0/deptokens/ to generate and download
        Esper_Public_Key.pem.


        In Apple Business Manager, go to Devices > Management > Add device
        management service and upload the Esper public key.


        Save the MDM server entry, then download the resulting server token
        (.p7m) via the ellipsis menu.


        Upload the .p7m to Esper via PUT /api/tenant/v0/deptokens/{id}/ using
        the id of the CSR_GENERATED record.
      operationId: DEPToken
      tags:
        - tenant_DEP Tokens
      security:
        - tenant_apiKey: []
      requestBody:
        required: false
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/tenant_DEP_Token_POST'
      responses:
        '200':
          description: Public key generation for ABM
          headers:
            Content-Disposition:
              schema:
                type: string
                example: attachment; filename="Esper_Public_Key.pem"
          content:
            text/plain; charset=utf-8:
              schema:
                type: string
                properties:
                  content:
                    type: string
                example: >-
                  -----BEGIN PUBLIC KEY-----
                  MIGeMA0GCSqGSIb3DQEBAQUAA4GMADCBiAKBgE7FsxhVgAauNzV2S+B2O2TVpcKc
                  /aPylhD8Abq0/5swcu3XFseP/GVttTH7JzSLLKdpyculA/DWfc73OP+r4LeswbAc
                  pyvI8uDVCexU7YsND00Vs/L1i9RZXpCBk0oNECjIKQ6ex7ccI6VzZaTH6DallGkY
                  eUcBApaAiL5QILTlAgMBAAE= -----END PUBLIC KEY-----
        '400':
          description: Public key generation error - Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/tenant_Error_400_Bad_Data'
        '401':
          description: Public key generation error - Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/tenant_Error_401_Unauthorized'
        '500':
          description: Public key generation error - Internal Server Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/tenant_Error_500_Internal_Server_Error'
    get:
      x-badges:
        - name: Stable
          color: green
      summary: Get all DEP tokens
      description: >

        ⚠️ iOS/iPadOS/tvOS only.


        Returns a paginated list of all DEP tokens registered to the Esper
        tenant, with optional filtering by token state.


        Use this endpoint to audit DEP token status across the tenant, identify
        tokens pending completion, and retrieve id values needed for upload or
        individual retrieval operations.


        **About List DEP Tokens**


        DEP tokens are credentials that authorize Esper to communicate with
        Apple Business Manager for automatic iOS device enrollment. Each token
        progresses through two states. CSR_GENERATED (the Esper public key has
        been generated but the ABM server token has not yet been uploaded) and
        COMPLETED (the full token exchange is done and the integration is
        active). A tenant may have multiple DEP tokens, each corresponding to a
        different ABM MDM server entry or Apple Business location.


        **Key Fields / Query Parameters**


        state (query, optional) — Filter results by token state-- CSR_GENERATED
        or COMPLETED.


        id — UUID of the DEP token record; used in GET
        /api/tenant/v0/deptokens/{id}/ and PUT /api/tenant/v0/deptokens/{id}/.


        token_name — Human-readable label assigned to the token during upload.


        meta.token_expiry_on — Expiry date of the DEP token; tokens expire
        annually and must be renewed.


        **Common Use Cases**


        Auditing all DEP tokens to identify any CSR_GENERATED records that
        represent incomplete setup flows


        Monitoring token expiry dates ahead of the annual renewal window


        Retrieving token id values to pass to the individual token endpoints


        **Best Practices**


        Filter by state=CSR_GENERATED periodically to surface abandoned token
        setup flows that were started but never completed.


        Track meta.token_expiry_on across all tokens; expired DEP tokens prevent
        automatic enrollment of new iOS devices.


        Use the returned id values to fetch full details via GET
        /api/tenant/v0/deptokens/{id}/ before performing uploads or updates.
      operationId: ListDEPTokens
      tags:
        - tenant_DEP Tokens
      security:
        - tenant_apiKey: []
      parameters:
        - in: query
          name: state
          schema:
            type: string
            enum:
              - CSR_GENERATED
              - COMPLETED
      responses:
        '200':
          description: Lists all dep tokens for a tenant
          content:
            application/json:
              schema:
                type: object
                properties:
                  code:
                    type: integer
                  message:
                    type: string
                  content:
                    type: object
                    properties:
                      count:
                        type: integer
                      next:
                        type: string
                      prev:
                        type: string
                      results:
                        type: array
                        items:
                          $ref: '#/components/schemas/tenant_DEP_Token_GET'
        '401':
          description: Get DEP tokens error - Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/tenant_Error_401_Unauthorized'
        '500':
          description: Get DEP tokens error - Internal Server Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/tenant_Error_500_Internal_Server_Error'
  /tenant/v0/deptokens/{id}/:
    get:
      x-badges:
        - name: Stable
          color: green
      summary: Get dep token by id
      description: >
        Retrieves the details of a single DEP token by its UUID.


        Returns metadata including the token name, current state, expiry date,
        and audit timestamps — useful for checking the status of a specific
        token before renewal or upload operations.


        **About Get DEP Token by ID**


        DEP tokens in Esper go through a two-step setup: public key generation
        (CSR_GENERATED) followed by ABM server token upload (COMPLETED). This
        endpoint lets you inspect a specific token's full record without
        fetching the entire list, which is especially useful in tenants with
        multiple active DEP tokens. The state field confirms whether the token
        exchange with Apple Business Manager is complete and the integration is
        ready for device enrollment.


        **Key Fields / Query Parameters**


        id (path, required, UUID) — The unique identifier of the DEP token
        record.


        state — Current token state: CSR_GENERATED or COMPLETED.


        token_name — The label assigned to the token during upload.


        meta.token_expiry_on — Token expiry date; critical for renewal planning.


        created_at / updated_at — Audit timestamps for when the token was
        created and last modified.


        **Common Use Cases**


        Checking whether a specific DEP token setup is complete before
        onboarding iOS devices


        Retrieving expiry information for a single token as part of a renewal
        workflow


        Confirming token state has transitioned to COMPLETED after uploading the
        ABM server token via PUT /api/tenant/v0/deptokens/{id}/


        **Best Practices**


        Call this endpoint after completing the ABM server token upload to
        confirm the state has transitioned to COMPLETED before attempting to
        enroll devices.


        Use meta.token_expiry_on to set renewal reminders well in advance —
        expired DEP tokens block automatic device enrollment.
      operationId: DEPTokenBasedOnID
      parameters:
        - name: id
          in: path
          description: ID of the token object
          required: true
          schema:
            type: string
            format: UUID
      tags:
        - tenant_DEP Tokens
      security:
        - tenant_apiKey: []
      responses:
        '200':
          description: Get DEP token by id
          content:
            application/json:
              schema:
                type: object
                properties:
                  code:
                    type: integer
                  message:
                    type: string
                  content:
                    type: object
                    properties:
                      schema:
                        $ref: '#/components/schemas/tenant_DEP_Token_GET'
        '401':
          description: Get DEP token by id error - Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/tenant_Error_401_Unauthorized'
        '404':
          description: Not Found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/tenant_Error_404_Not_Found'
        '500':
          description: Get DEP token by id error - Internal Server Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/tenant_Error_500_Internal_Server_Error'
    put:
      x-badges:
        - name: Stable
          color: green
      summary: Upload dep token to a tenant
      description: >-
        Upload dep token for a public key for a tenant based on ID of DEP public
        key
      operationId: DEPTokenUpload
      parameters:
        - name: id
          in: path
          description: ID of the token object
          required: true
          schema:
            type: string
            format: UUID
      requestBody:
        required: true
        content:
          multipart/form-data:
            schema:
              type: object
              properties:
                file:
                  type: string
                  format: binary
                  description: .p7m file from abm console
                token_name:
                  type: string
              required:
                - file
                - token_name
      tags:
        - tenant_DEP Tokens
      security:
        - tenant_apiKey: []
      responses:
        '200':
          description: Upload dep token for a public key by id
          content:
            application/json:
              schema:
                type: object
                properties:
                  code:
                    type: integer
                  message:
                    type: string
                  content:
                    type: object
                    properties:
                      schema:
                        $ref: '#/components/schemas/tenant_DEP_Token_GET'
        '400':
          description: Upload DEP token by id error - Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/tenant_Error_400_Bad_Data'
        '401':
          description: Upload DEP token by id error - Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/tenant_Error_401_Unauthorized'
        '404':
          description: Not Found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/tenant_Error_404_Not_Found'
        '500':
          description: Upload DEP token by id error - Internal Server Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/tenant_Error_500_Internal_Server_Error'
  /tenant/v0/depprofiles/:
    get:
      x-badges:
        - name: Stable
          color: green
      summary: Get all DEP profiles for the tenant
      description: Returns all the DEP profile for the tenant
      operationId: getDEPProfileList
      tags:
        - tenant_DEP Profile
      security:
        - tenant_apiKey: []
      responses:
        '200':
          description: DEP profile information for the Tenant
          content:
            application/json:
              schema:
                type: object
                properties:
                  code:
                    type: integer
                  message:
                    type: string
                  content:
                    type: object
                    properties:
                      count:
                        type: integer
                      previous:
                        type: string
                      next:
                        type: string
                      results:
                        type: array
                        items:
                          $ref: '#/components/schemas/tenant_DEPProfile'
        '401':
          description: Authorization information is missing or invalid.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/tenant_Error_401_Unauthorized'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/tenant_Error_500_Internal_Server_Error'
    post:
      x-badges:
        - name: Stable
          color: green
      summary: Create a DEP profile
      description: Creates a DEP profile
      operationId: createDEPProfile
      tags:
        - tenant_DEP Profile
      security:
        - tenant_apiKey: []
      requestBody:
        required: false
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/tenant_DEPProfileCreateRequest'
      responses:
        '200':
          description: Updated the DEP profile for the tenant
          content:
            application/json:
              schema:
                type: object
                properties:
                  code:
                    type: integer
                  message:
                    type: string
                  content:
                    $ref: '#/components/schemas/tenant_DEPProfile'
        '400':
          description: Bad request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/tenant_Error_400_Bad_Data'
        '401':
          description: Authorization information is missing or invalid.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/tenant_Error_401_Unauthorized'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/tenant_Error_500_Internal_Server_Error'
  /v2/emm/enrollment/begin/:
    post:
      x-badges:
        - name: Stable
          color: green
      summary: Generate sign-up URL
      tags:
        - tenant_Google Enterprise
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/tenant_BeginGoogleEMMEnrollmentRequest'
      parameters:
        - name: Authorization
          in: header
          description: Bearer token for authorization
          required: true
          schema:
            type: string
      responses:
        '201':
          description: Successfully generated sign-up URL
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/tenant_BeginGoogleEMMEnrollmentResponse'
        '400':
          description: Invalid input
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/tenant_Error_400_Bad_Data'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/tenant_Error_401_Unauthorized'
        '409':
          description: >-
            Conflict: Google Enterprise already exists and is enrolled to Google
            EMM
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/tenant_Error_409_Conflict'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/tenant_Error_500_Internal_Server_Error'
  /v2/emm/details/:
    get:
      x-badges:
        - name: Stable
          color: green
      summary: Return the enrollment status of the Enterprise
      tags:
        - tenant_Google Enterprise
      parameters:
        - name: Authorization
          in: header
          description: Bearer token for authorization
          required: true
          schema:
            type: string
      responses:
        '200':
          description: Successfully retrieved enrollment status
          content:
            application/json:
              schema:
                type: object
                properties:
                  content:
                    type: object
                    properties:
                      count:
                        type: integer
                      previous:
                        type: string
                      next:
                        type: string
                      results:
                        type: array
                        items:
                          $ref: '#/components/schemas/tenant_GoogleEnterpriseDetails'
        '400':
          description: Invalid input
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/tenant_Error_400_Bad_Data'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/tenant_Error_401_Unauthorized'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/tenant_Error_500_Internal_Server_Error'
    post:
      x-badges:
        - name: Stable
          color: green
      summary: Creates a new Google Enterprise with the provided details
      tags:
        - tenant_Google Enterprise
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/tenant_GoogleEnterpriseDetails'
      parameters:
        - name: Authorization
          in: header
          description: Bearer token for authorization
          required: true
          schema:
            type: string
      responses:
        '201':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/tenant_GoogleEnterpriseDetails'
        '400':
          description: Invalid input
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/tenant_Error_400_Bad_Data'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/tenant_Error_401_Unauthorized'
        '409':
          description: 'Conflict: Google Enterprise already exists'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/tenant_Error_409_Conflict'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/tenant_Error_500_Internal_Server_Error'
  /v2/emm/web-token/:
    post:
      x-badges:
        - name: Stable
          color: green
      summary: Create a Google Web Token
      tags:
        - tenant_Google Enterprise
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/tenant_CreateWebTokenRequest'
      parameters:
        - name: Authorization
          in: header
          description: Bearer token for authorization
          required: true
          schema:
            type: string
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/tenant_CreateWebTokenResponse'
        '400':
          description: Invalid input
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/tenant_Error_400_Bad_Data'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/tenant_Error_401_Unauthorized'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/tenant_Error_500_Internal_Server_Error'
  /v2/emm/enrollment/complete/:
    post:
      x-badges:
        - name: Stable
          color: green
      summary: Complete EMM enrollment for a Google Enterprise
      tags:
        - tenant_Google Enterprise
      parameters:
        - name: Authorization
          in: header
          description: Bearer token for authorization
          required: true
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                completion_token:
                  type: string
                enterprise_token:
                  type: string
              required:
                - completion_token
                - enterprise_token
      responses:
        '200':
          description: Successfully completed EMM enrollment
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/tenant_GoogleEnterpriseDetails'
        '400':
          description: Invalid input
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/tenant_Error_400_Bad_Data'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/tenant_Error_401_Unauthorized'
        '404':
          description: Not Found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/tenant_Error_404_Not_Found'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/tenant_Error_500_Internal_Server_Error'
  /v2/emm/accounts/:
    get:
      x-badges:
        - name: Stable
          color: green
      summary: Return the Google Service Account of the Enterprise
      tags:
        - tenant_Google Enterprise
      parameters:
        - name: Authorization
          in: header
          description: Bearer token for authorization
          required: true
          schema:
            type: string
      responses:
        '200':
          description: Successfully retrieved Google Service Account
          content:
            application/json:
              schema:
                type: object
                properties:
                  content:
                    type: object
                    properties:
                      count:
                        type: integer
                      previous:
                        type: string
                      next:
                        type: string
                      results:
                        type: array
                        items:
                          $ref: >-
                            #/components/schemas/tenant_GoogleServiceAccountDetails
        '400':
          description: Invalid input
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/tenant_Error_400_Bad_Data'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/tenant_Error_401_Unauthorized'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/tenant_Error_500_Internal_Server_Error'
    post:
      x-badges:
        - name: Stable
          color: green
      summary: Creates a new Google Service Account with the provided details
      tags:
        - tenant_Google Enterprise
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/tenant_GoogleServiceAccountDetails'
      parameters:
        - name: Authorization
          in: header
          description: Bearer token for authorization
          required: true
          schema:
            type: string
      responses:
        '201':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/tenant_GoogleServiceAccountDetails'
        '400':
          description: Invalid input
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/tenant_Error_400_Bad_Data'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/tenant_Error_401_Unauthorized'
        '409':
          description: 'Conflict: Google Service Account already exists'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/tenant_Error_409_Conflict'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/tenant_Error_500_Internal_Server_Error'
  /v2/mdmserviceconfig:
    get:
      x-badges:
        - name: Stable
          color: green
      summary: Get MDM service configuration
      description: >
        Unauthenticated discovery endpoint per Apple's
        [MDMServiceConfig](https://developer.apple.com/documentation/devicemanagement/providing-information-about-your-device-management-service)
        spec.

        Returns the URL a device uses to begin Automated Device Enrollment.
      operationId: getMDMServiceConfig
      tags:
        - tenant_MDM Service Config
      responses:
        '200':
          description: MDM service configuration
          content:
            application/json:
              schema:
                type: object
                properties:
                  dep_enrollment_url:
                    type: string
                  dep_anchor_certs_url:
                    type: string
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/tenant_Error_400_Bad_Data'
  /v2/mdmserviceconfig/anchor-certs:
    get:
      x-badges:
        - name: Stable
          color: green
      summary: Get DEP anchor certificates
      description: |
        Unauthenticated endpoint referenced by dep_anchor_certs_url. We use a
        trusted SSL certificate and don't support custom anchor certs yet, so
        this always returns an empty body.
      operationId: getDepAnchorCerts
      tags:
        - tenant_MDM Service Config
      responses:
        '200':
          description: Empty body (no custom anchor certificates configured)
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/tenant_Error_400_Bad_Data'
  /v1/foundry/builds/:
    get:
      summary: Get Foundry builds
      description: >
        Returns a deduplicated list of all Esper Foundation OS version strings
        currently present across enrolled devices in the tenant.


        Use this endpoint to inventory which Foundation OS versions are deployed
        across your fleet — useful for identifying version spread, spotting
        devices running outdated builds, and scoping update operations.


        **About Get All Distinct Foundation Versions**


        Esper Foundation is a customized Android-based operating system for x86
        and ARM devices, providing long-term support, regular security patches,
        and broad hardware compatibility. Foundation version strings follow the
        format [Android version].[Major Foundation version].[Minor Foundation
        version].[Build version] — for example, 7.10.21.02 indicates Android 7,
        Major Foundation version 10, Minor version 21, build 02. This endpoint
        returns each distinct version once regardless of how many devices share
        it, giving a fleet-wide view of OS version distribution. It requires the
        read:foundationversions scope.


        **Key Fields / Query Parameters**


        search — Partial string match (case-insensitive) to filter returned
        version strings


        limit — Number of results per page; defaults to 10


        offset — Starting index for pagination


        foundation_version — The version string returned per result, in
        [Android].[Major].[Minor].[Build] format


        **Common Use Cases**


        Auditing Foundation OS version spread across a fleet before planning an
        update campaign


        Identifying whether devices running builds below a minimum supported
        version are present in the tenant


        Cross-referencing deployed versions against the latest approved builds
        visible in Esper Software Updates for Foundation


        **Best Practices**


        Use search to quickly check whether a specific Foundation version is
        present rather than paginating the full list


        Combine results with device list endpoints filtered by Foundation
        version to enumerate specific devices on a given OS version


        Call this before scheduling OTA operations to establish a version
        distribution baseline


        **Workflow**


        Call GET /api/v2/foundationversions to retrieve all distinct Foundation
        OS versions present in the tenant


        Compare results against the latest approved build in Esper Software
        Updates for Foundation to identify outdated versions


        Use device list endpoints filtered by Foundation version to target
        devices on older builds for update via Pipeline, auto-update, or
        API-based FOTA
      security:
        - foundation_AuthToken: []
      operationId: getFoundryBuilds
      tags:
        - foundation_FoundryBuilds
      parameters:
        - in: query
          name: foundation_major_number
          description: >-
            Filter by Esper Foundation Major Number, Foundation Numbers are
            integers starting at 1.
          schema:
            type: string
        - in: query
          name: build_arch
          description: >-
            Filter by build architecture name, build architectures {arm, arm64,
            x86_64, x86}
          schema:
            type: string
        - in: query
          name: android_major_version
          description: >-
            Filter by Android Major Version, Android Major Versions are integers
            starting at 1 and going to Current Android Release
          schema:
            type: integer
        - in: query
          name: device_model_id
          description: Device model id
          schema:
            type: string
            format: uuid
        - in: query
          name: approved
          description: Filter builds which have been approved for OTA update
          schema:
            type: boolean
        - in: query
          name: limit
          schema:
            type: integer
        - in: query
          name: offset
          schema:
            type: integer
        - in: query
          name: ordering
          schema:
            type: string
        - in: query
          name: locked
          description: >-
            Filter the locked builds. To be used with build_fingerprint_hash and
            device_model_id
          schema:
            type: boolean
        - in: query
          name: build_fingerprint_hash
          description: hash of the build fingerprint of the existing build
          schema:
            type: string
      responses:
        '200':
          description: List of Foundry builds
          content:
            application/json:
              schema:
                type: object
                properties:
                  code:
                    type: integer
                    description: returned response code
                  content:
                    properties:
                      count:
                        type: integer
                        description: counter of number of builds retrieved
                      next:
                        type: string
                        format: url
                        description: url of the next ten builds
                      previous:
                        type: string
                        format: url
                        description: url of the previous ten builds
                      results:
                        items:
                          $ref: '#/components/schemas/foundation_Build_V1'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/foundation_Error_401_Unauthorized'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: >-
                  #/components/schemas/foundation_Error_500_Internal_Server_Error
  /v1/foundry/builds/{build_id}/:
    get:
      summary: Get Foundry Build
      description: >
        Returns a paginated list of Foundation OS builds registered in the
        Foundry system, with filters for architecture, Android version, device
        model, approval status, and more.


        Use this endpoint to browse available Foundation builds for a specific
        device model — for example, to find all approved builds before
        initiating a Pipeline deployment or configuring auto-update.


        **About Get Foundry Builds**


        Foundry is Esper's build management backend for Foundation OS. Each
        Foundry build represents a compiled OS image tied to a specific device
        model, CPU architecture, and Foundation version. Builds go through a
        lifecycle — released, to_be_deprecated, or unavailable — and must be
        explicitly approved before they can be used for OTA deployment or
        auto-update. The Console surfaces these builds in the Esper Software
        Updates > Esper Foundation tab; this endpoint provides the same catalog
        programmatically.


        **Key Fields / Query Parameters**


        foundation_major_number — Filter by Foundation major version number
        (integer starting at 1)


        build_arch — Filter by CPU architecture: arm, arm64, x86, or x86_64


        android_major_version — Filter by Android major version (integer)


        device_model_id — Filter builds for a specific device model (UUID)


        approved — When true, returns only builds approved for OTA deployment


        locked — Filter for builds currently locked to a device model; use with
        build_fingerprint_hash and device_model_id


        build_fingerprint_hash — Hash of an existing build's fingerprint, used
        to identify a currently installed build


        build_state — Lifecycle status: released, to_be_deprecated, or
        unavailable


        **Common Use Cases**


        Listing all approved Foundation builds for a device model before
        scheduling a Pipeline deployment or enabling auto-update


        Auditing available builds by architecture and Android version across
        supported hardware


        Identifying builds approaching deprecation (to_be_deprecated) to plan
        timely update campaigns


        **Best Practices**


        Always filter by approved=true when looking for builds eligible for
        deployment — unapproved builds cannot be used for OTA or auto-update


        Filter by device_model_id to scope results to your target hardware,
        since builds are model-specific


        Monitor build_state values and proactively migrate devices off
        to_be_deprecated builds before they become unavailable


        Workflow


        Call GET /v1/foundry/builds/ with device_model_id and approved=true to
        list eligible builds for your target hardware


        Review build_arch, foundation_major_number, and android_major_version to
        identify the desired build


        Use the returned build_id to approve the build (PUT
        /v1/foundry/builds/{build_id}/) or lock it for auto-update (PUT
        /v1/foundry/device-models/{device_model_id}/)
      security:
        - foundation_AuthToken: []
      tags:
        - foundation_FoundryBuilds
      parameters:
        - name: build_id
          in: path
          description: A build UUID specifying the Foundry Build
          required: true
          schema:
            type: string
      responses:
        '200':
          description: Specified Foundry build
          content:
            application/json:
              schema:
                type: object
                properties:
                  content:
                    $ref: '#/components/schemas/foundation_Build_V1'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/foundation_Error_401_Unauthorized'
        '404':
          description: Build not found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/foundation_Error_404_Not_Found'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: >-
                  #/components/schemas/foundation_Error_500_Internal_Server_Error
    put:
      summary: Update Foundry build
      description: >
        Retrieves full details for a single Foundation OS build by its unique
        Foundry build ID.


        Use this endpoint to inspect a specific build's metadata — including its
        architecture, Foundation version numbers, Android SDK level, approval
        status, and lifecycle state — before approving it or locking it to a
        device model for auto-update.


        **About Get Foundry Build**


        Foundry builds are the individual compiled OS images that make up the
        Foundation update catalog. Each build is identified by a UUID (build_id)
        and carries detailed metadata about the OS it contains: Foundation
        major/minor/build version numbers, Android version, CPU architecture,
        build hash, and whether it has been approved for OTA deployment. This
        endpoint returns the full Build_V1 object for a single build, providing
        the complete picture needed for approval or deployment decisions.


        Key Fields / Query Parameters


        build_id (path, required) — UUID of the Foundry build to retrieve


        foundation_major_number / foundation_minor_number /
        foundation_build_number — Foundation version components of the build


        android_major_version / android_sdk_level — Android version metadata


        build_arch — CPU architecture (arm, arm64, x86, x86_64)


        approved — Whether the build has been approved for OTA deployment


        build_state — Lifecycle status: released, to_be_deprecated, or
        unavailable


        deprecated_on — Date the build was or will be deprecated


        release_notes — JSON-formatted release notes for the build


        **Common Use Cases**


        Confirming a build's approval status and lifecycle state before using
        its build_id in a device model auto-update configuration


        Reviewing release notes and version metadata for a specific build ahead
        of a planned deployment


        Retrieving build details to display in internal tooling or audit records


        **Best Practices**


        Always check approved and build_state before proceeding with deployment
        — only approved: true builds in released state are safe to deploy


        Store the build_fingerprint_hash if you need to identify this build
        later via the list endpoint's locked filter


        Review deprecated_on to understand the support window remaining for this
        build


        **Workflow**


        Obtain a build_id from GET /v1/foundry/builds/ filtered by device model
        and architecture


        Call GET /v1/foundry/builds/{build_id}/ to confirm approval status,
        version details, and release notes


        Proceed to PUT /v1/foundry/builds/{build_id}/ to approve the build, or
        PUT /v1/foundry/device-models/{device_model_id}/ to lock it for
        auto-update
      security:
        - foundation_AuthToken: []
      operationId: updateFoundryBuild
      tags:
        - foundation_FoundryBuilds
      parameters:
        - name: build_id
          in: path
          description: A build UUID specifying the Foundry Build
          required: true
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/foundation_Foundry_Build_PUT_Request_V1'
      responses:
        '200':
          description: Updated
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    $ref: '#/components/schemas/foundation_Build_V1'
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/foundation_Error_400_Bad_Data'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/foundation_Error_401_Unauthorized'
        '404':
          description: Builds not found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/foundation_Error_404_Not_Found'
  /v1/foundry/device-models/:
    get:
      summary: Get device models
      description: >
        Returns a list of Foundation-eligible device models registered to the
        tenant in the Foundry system, with optional filters for manufacturer,
        model, profile, and Android API level compatibility.


        Use this endpoint to enumerate the device models in your tenant's
        Foundation catalog and retrieve the device_model_id values needed to
        manage builds and auto-update configuration.


        **About Get Device Models**


        In Foundry, a device model record represents a hardware profile eligible
        to run Foundation OS. Each model is associated with a profile name and
        variant, a manufacturer and model identifier, and configuration that
        governs how Foundation builds are deployed to it — including whether
        auto-update is enabled and which build is currently locked for OTA.
        Device model IDs are required parameters for filtering builds (GET
        /v1/foundry/builds/) and for configuring auto-update behavior (PUT
        /v1/foundry/device-models/{device_model_id}/).


        **Key Fields / Query Parameters**


        manufacturer — Filter by device manufacturer name


        model — Filter by device model name


        profile_name — Filter by Foundation build profile name


        profile_variant — Filter by profile variant identifier


        update_compatible_android_api_level_begin — Filter models compatible
        with updates from this Android API level


        update_compatible_android_api_level_end — Filter models compatible with
        updates up to this Android API level


        device_model_id — UUID returned per result; used as a path parameter in
        build and auto-update endpoints


        auto_update — Indicates whether auto-update is currently enabled for the
        model


        locked_build_id — The build_id currently locked for auto-update on this
        model (nullable)


        latest — Whether the model is configured to auto-update to the latest
        approved build


        **Common Use Cases**


        Retrieving device_model_id values to use when filtering builds or
        configuring auto-update for specific hardware


        Auditing which device models have auto-update enabled and which build
        each is locked to


        Filtering models by manufacturer or Android API level compatibility when
        planning a Foundation rollout across mixed hardware


        **Best Practices**


        Use manufacturer and model filters to quickly locate the target device
        model rather than paginating through the full list


        Cross-reference locked_build_id with GET /v1/foundry/builds/{build_id}/
        to confirm the currently pinned build's approval status and version
        details


        Check auto_update status on all managed models before approving a new
        build — enabled models will begin rolling out the update to devices
        within 24 hours of approval


        **Workflow**


        Call GET /v1/foundry/device-models/ with manufacturer and model filters
        to locate your target hardware


        Note the device_model_id for use in subsequent build filtering and
        auto-update configuration calls


        Review auto_update, latest, and locked_build_id to understand the
        current update configuration for each model
      security:
        - foundation_AuthToken: []
      tags:
        - foundation_FoundryDeviceModels
      parameters:
        - in: query
          name: limit
          schema:
            type: string
        - in: query
          name: offset
          schema:
            type: string
        - in: query
          name: manufacturer
          schema:
            type: string
        - in: query
          name: model
          schema:
            type: string
        - in: query
          name: profile_name
          schema:
            type: string
        - in: query
          name: profile_variant
          schema:
            type: string
        - in: query
          name: update_compatible_android_api_level_begin
          schema:
            type: string
        - in: query
          name: update_compatible_android_api_level_end
          schema:
            type: string
      responses:
        '200':
          description: >-
            List of DeviceModels associated with the TenantId coming from the
            header
          content:
            application/json:
              schema:
                type: object
                properties:
                  code:
                    type: integer
                    description: returned response code
                  content:
                    properties:
                      count:
                        type: integer
                        description: counter of number of device models retrieved
                      next:
                        type: string
                        format: url
                        description: url of the next ten device models
                      previous:
                        type: string
                        format: url
                        description: url of the previous ten device models
                      results:
                        items:
                          $ref: '#/components/schemas/foundation_Device_Model_V1'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/foundation_Error_401_Unauthorized'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: >-
                  #/components/schemas/foundation_Error_500_Internal_Server_Error
  /v1/foundry/device-models/{device_model_id}/:
    put:
      summary: Update Tenant Device Model
      description: >
        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
      security:
        - foundation_AuthToken: []
      tags:
        - foundation_FoundryDeviceModels
      parameters:
        - name: device_model_id
          in: path
          description: An UUID specifying the Device Model
          required: true
          schema:
            type: string
            format: uuid
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/foundation_Device_Model_PUT_Request_V1'
      responses:
        '200':
          description: Updated
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    $ref: '#/components/schemas/foundation_Build_V1'
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/foundation_Error_400_Bad_Data'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/foundation_Error_401_Unauthorized'
        '403':
          description: locked_build_id not approved
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/foundation_Error_403_Forbidden'
        '404':
          description: DeviceModel not found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/foundation_Error_404_Not_Found'
  /v1/foundry/events/:
    get:
      summary: Get Foundry events
      description: >
        Returns a paginated list of Foundry events in reverse chronological
        order, providing an audit trail of Foundation build approvals,
        auto-update configuration changes, and related actions.


        Use this endpoint to programmatically access the Foundation Event Feed —
        the same activity log visible in the Esper Software Updates > Foundation
        Event Feed tab — for monitoring, compliance reporting, or automated
        alerting on Foundation update activity.


        **About Get Foundry Events**


        The Foundation Event Feed records significant actions taken within the
        Foundry system, including build approvals and unapprovals, auto-update 

        configuration changes, and other state transitions. Each event captures
        the actor (user or system), the affected resource, the event type and
        message, and any remarks provided at the time of the action. This log is
        essential for change management auditing — especially in regulated
        environments where OS update approvals require traceability. Events are
        returned in reverse chronological order (most recent first).


        **Key Fields / Query Parameters**


        limit — Number of events to return per page


        offset — Starting index for pagination


        actor — Object identifying the user or system that triggered the event
        (includes id and name)


        event_type — Classification of the event (e.g., build approval,
        auto-update change)


        event_message — Human-readable description of what occurred


        resource — Object identifying the affected resource (id and type, e.g.,
        a specific build or device model)


        meta.user_remarks — Any comment provided by the actor at the time of the
        action (e.g., approval rationale from PUT
        /v1/foundry/builds/{build_id}/)


        meta.change_type — The type of change recorded


        created_timestamp — Unix timestamp of when the event occurred


        **Common Use Cases**


        Auditing the history of build approvals and auto-update configuration
        changes for compliance or change management records


        Monitoring for unexpected approval or configuration changes as part of a
        security or operations workflow


        Correlating Foundation update events with device behavior observed in
        device telemetry or command history


        Best Practices


        Paginate with limit and offset to retrieve a bounded window of recent
        events rather than loading the full history in a single call


        Persist events to an external log store if long-term retention is
        required — Foundry does not guarantee indefinite event history


        When using PUT /v1/foundry/builds/{build_id}/ or PUT
        /v1/foundry/device-models/{device_model_id}/, always supply user_remarks
        — these notes appear in this event feed and significantly improve audit
        trail quality


        **Workflow**


        Call GET /v1/foundry/events/ to retrieve recent Foundation activity,
        paginating as needed


        Filter results client-side by event_type or resource.id to isolate
        events related to a specific build or device model


        Cross-reference meta.user_remarks and actor fields with internal change
        management records for compliance verification
      security:
        - foundation_AuthToken: []
      tags:
        - foundation_FoundryEvents
      parameters:
        - in: query
          name: limit
          schema:
            type: integer
        - in: query
          name: offset
          schema:
            type: integer
      responses:
        '200':
          description: List of Foundry events in reverse chronological order
          content:
            application/json:
              schema:
                type: object
                properties:
                  content:
                    properties:
                      count:
                        type: integer
                        description: counter of number of events retrieved
                      next:
                        type: string
                        format: url
                        description: url of the next ten events
                      previous:
                        type: string
                        format: url
                        description: url of the previous ten events
                      results:
                        items:
                          $ref: '#/components/schemas/foundation_Foundry_Event_V1'
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/foundation_Error_400_Bad_Data'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/foundation_Error_401_Unauthorized'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: >-
                  #/components/schemas/foundation_Error_500_Internal_Server_Error
  /report/v0/report-types:
    get:
      tags:
        - reports_Reports API
      summary: Get report types
      description: >
        Retrieve the list of report types available in the tenant.


        Returns each report type's internal name, display name, description, the
        last time it was generated, and the earliest date from which data is
        available (available_from).


        **About Get Report Types**


        Esper's Reports system provides pre-built fleet-level snapshots across
        devices and apps. Before generating a report, use this endpoint to
        discover which report types are available (device_apps, device, etc.)
        and to check when each type was last generated and how far back its data
        reaches. This is the recommended first step in any automated reporting
        workflow. Report availibility varies by operating system. 


        **Key Fields**


        name — The internal identifier used in the report_type field when
        creating a report (e.g., device_apps, device)


        display_name — The human-readable label shown in the console


        last_generated_at — Timestamp of the most recently completed report of
        this type


        available_from — The earliest date for which data exists for this report
        type


        **Common Use Cases**


        Discovering available report types before building an automated
        reporting pipeline


        Checking whether a given report type has been generated recently enough
        to meet data freshness requirements


        Validating the name value to use in the report_type field of a Create
        Report request


        **Best Practices**


        Call this endpoint at the start of a reporting workflow to confirm the
        correct report_type value before posting a report request


        Use last_generated_at to assess data freshness; reports reflect ingested
        data and may lag up to 24 hours behind live device state


        Use available_from to validate that your desired date range falls within
        the supported window before submitting a report


        **Workflow**


        Call GET /report/v0/report-types to retrieve available types and their
        metadata


        Note the name value for the desired report type (e.g., device_apps or
        device)


        Pass that name as report_type in a POST /report/v0/reports request
      operationId: getReportTypes
      security:
        - reports_bearerAuth: []
      responses:
        '200':
          description: Report types
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/reports_GetReportTypesResponse'
        '400':
          description: Bad request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/reports_ReportsErrorResponse'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/reports_ReportsErrorResponse'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/reports_ReportsErrorResponse'
  /report/v0/reports:
    post:
      tags:
        - reports_Reports API
      summary: Create Report
      description: >
        Initiate generation of a device or device apps report and receive a
        report ID for status polling. Report availibity varies by operating
        system.


        Returns a report_id and an initial status of PENDING; poll GET
        /report/v0/reports/{report_id} to track progress and retrieve results
        once the status reaches SUCCEEDED.


        **About Create Report**


        Report generation in Esper is asynchronous. Submitting this request
        triggers a backend job that ingests and consolidates fleet data — a
        process that can take several minutes. The is_download flag controls the
        output mode: set it to false to retrieve an in-memory preview (up to
        10,000 rows) or true to generate a full dataset available via a signed
        download link. Supported report types are device_apps (Android and
        iOS/iPadOS/tvOS) and device (Android, iOS, Linux, Windows). Note that
        app reports exclude sideloaded, preloaded, and SDK-installed apps.


        **Key Fields / Request Body**


        report_type (required) — device_apps for the Device Apps Report or
        device for the Device Report


        start_time — Report window start in UTC (e.g., 2024-08-28T00:00:00Z);
        must be after July 1, 2024 for device_apps


        end_time — Must equal start_time (single-day reports only)


        is_download — true to generate a full downloadable CSV; false for an
        in-console preview (first 10,000 rows)


        filters.date — Optional date override in YYYY-MM-DD format; takes
        precedence over start_time/end_time if provided


        filters.package_name — (device_apps only) Array of package names to
        filter by; omit for all packages


        filters.app_state — (device_apps only) Filter by app visibility: SHOW,
        HIDE, DISABLE, or LAUNCHABLE_BUT_HIDDEN


        filters.platform — Filter by platform: Android, Apple, Linux, Windows
        (platform availability varies by report type)


        **Common Use Cases**


        Generating a point-in-time snapshot of all app versions across an
        Android or iOS fleet


        Producing a full CSV export of device state, OS version, location, and
        provisioning data for all managed platforms


        Filtering a device apps report to a specific package name to audit
        version consistency across devices


        **Best Practices**


        Set end_time equal to start_time; the API supports single-day reports
        only


        Use filters.date as a simpler alternative to start_time/end_time when
        generating a same-day report


        Set is_download: true when your fleet exceeds 10,000 devices or apps,
        since the preview response is capped at 10,000 rows


        Poll GET /report/v0/reports/{report_id} at a reasonable interval (e.g.,
        every 10–30 seconds) rather than immediately, as report generation can
        take several minutes


        **Workflow**


        Call GET /report/v0/report-types to confirm the report_type value and
        check data availability


        POST to /report/v0/reports with the desired report_type, date range,
        is_download flag, and any filters


        Store the returned report_id and poll GET /report/v0/reports/{report_id}
        until status is SUCCEEDED or FAILED
      operationId: createReportStatus
      security:
        - reports_bearerAuth: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/reports_Report'
      responses:
        '200':
          description: Create Report
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/reports_CreateReportResponse'
        '400':
          description: Bad request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/reports_ReportsErrorResponse'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/reports_ReportsErrorResponse'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/reports_ReportsErrorResponse'
  /report/v0/reports/{report_id}:
    get:
      tags:
        - reports_Reports API
      summary: Get report status
      description: >
        Poll the status of a report and retrieve its results once generation is
        complete.


        Returns the current status of the report job (PENDING, RUNNING,
        SUCCEEDED, FAILED, CANCELED, or CLOSED) and, on success, either an
        inline data preview or a signed external download link depending on the
        is_download flag set when the report was created.


        **About Get Report Status**


        This endpoint is the second half of Esper's two-step asynchronous report
        pattern. After POST /report/v0/reports returns a report_id, poll this
        endpoint until status reaches a terminal state. When is_download was
        false, the successful response includes a data_array of up to 10,000
        rows along with a schema object describing column names, positions, and
        types. When is_download was true, the response instead includes an
        external_link — a signed URL pointing to the full dataset as a
        downloadable CSV.


        **Key Fields**


        report_id (path, required) — UUID returned by POST /report/v0/reports


        status — Current job state: PENDING (queued), RUNNING (processing),
        SUCCEEDED (results available), FAILED, CANCELED, or CLOSED


        schema.columns — Array of column metadata objects, each with name,
        position, type_name, and type_text


        data_array — (preview mode only) 2D array of row data, capped at 10,000
        rows


        external_link — (download mode only) Signed URL to the full CSV export


        **Common Use Cases**


        Polling report status after initiating generation via POST
        /report/v0/reports


        Retrieving inline row data for small to mid-sized fleets (preview mode,
        ≤10,000 rows)


        Obtaining a signed download URL for full fleet exports that exceed the
        10,000-row preview cap


        **Best Practices**


        Poll at a reasonable interval (e.g., every 10–30 seconds) rather than
        immediately after creating the report, as generation can take several
        minutes


        Check for terminal statuses (SUCCEEDED, FAILED, CANCELED, CLOSED) and
        stop polling once reached


        If status is FAILED, re-submit the report via POST /report/v0/reports
        rather than retrying the same report_id


        For download-mode reports, retrieve the external_link promptly as signed
        URLs may expire


        **Workflow**


        Receive the report_id from POST /report/v0/reports


        Poll this endpoint at intervals until status is SUCCEEDED (or a failure
        terminal state)


        If preview mode: read data_array for results and schema for column
        structure; if download mode: fetch the CSV from external_link
      operationId: getReportStatus
      parameters:
        - $ref: '#/components/parameters/reports_ReportID'
      security:
        - reports_bearerAuth: []
      responses:
        '200':
          description: Report status
          content:
            application/json:
              schema:
                oneOf:
                  - $ref: '#/components/schemas/reports_CreateReportResponse'
                  - $ref: '#/components/schemas/reports_GetReportResponsePreview'
                  - $ref: '#/components/schemas/reports_GetReportResponseDownload'
        '400':
          description: Bad request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/reports_ReportsErrorResponse'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/reports_ReportsErrorResponse'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/reports_ReportsErrorResponse'
  /geofence/v1/geofences:
    post:
      summary: Create a new geofence
      description: Creates a new geofence with the specified geometry and actions
      operationId: geofence_createGeofence
      tags:
        - geofence_Geofences
      parameters:
        - $ref: '#/components/parameters/geofence_XEsperTenantIdHeader'
        - $ref: '#/components/parameters/geofence_XCallerIdHeader'
      security:
        - geofence_bearerAuth: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/geofence_GeofenceRequest'
            examples:
              polygonExample:
                summary: Polygon Geofence
                value:
                  name: Warehouse Perimeter
                  description: A polygon-shaped geofence
                  actions:
                    - lockdown
                  geometry:
                    type: polygon
                    coordinates:
                      - latitude: 41.8902
                        longitude: 12.4924
                      - latitude: 41.8903
                        longitude: 12.4925
                      - latitude: 41.8904
                        longitude: 12.4926
              circleExample:
                summary: Circular Geofence
                value:
                  name: Restricted Area
                  description: A circle-shaped geofence
                  actions:
                    - beep
                    - lockdown
                  geometry:
                    type: circle
                    coordinates:
                      - latitude: 41.8902
                        longitude: 12.4924
                    radius: 100
              noActionsExample:
                summary: Geofence with No Actions
                value:
                  name: Monitoring Zone
                  description: A geofence for monitoring only
                  actions: []
                  geometry:
                    type: circle
                    coordinates:
                      - latitude: 41.8902
                        longitude: 12.4924
                    radius: 50
      responses:
        '201':
          description: Geofence created successfully
          content:
            application/json:
              schema:
                type: object
                properties:
                  content:
                    $ref: '#/components/schemas/geofence_GeofenceResponse'
        '400':
          description: Invalid input
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/geofence_ErrorResponse'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/geofence_ErrorResponse'
        '500':
          description: Server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/geofence_ErrorResponse'
    get:
      summary: List all geofences
      description: >-
        Retrieves a paginated list of geofences for the tenant. Supports
        filtering by geofence IDs, exact name match, or searching by name.
        Optionally include device summary statistics and/or total count.
      operationId: geofence_listGeofences
      tags:
        - geofence_Geofences
      parameters:
        - $ref: '#/components/parameters/geofence_XEsperTenantIdHeader'
        - $ref: '#/components/parameters/geofence_XCallerIdHeader'
        - $ref: '#/components/parameters/geofence_OffsetParam'
        - $ref: '#/components/parameters/geofence_LimitParam'
        - $ref: '#/components/parameters/geofence_IdsParam'
        - $ref: '#/components/parameters/geofence_IncludeSummaryParam'
        - $ref: '#/components/parameters/geofence_IncludeCountParam'
        - $ref: '#/components/parameters/geofence_SearchParam'
        - $ref: '#/components/parameters/geofence_NameParam'
      security:
        - geofence_bearerAuth: []
      responses:
        '200':
          description: A list of geofences
          content:
            application/json:
              schema:
                type: object
                properties:
                  content:
                    type: object
                    properties:
                      next:
                        type: string
                        nullable: true
                        example: /v1/geofences?offset=10&limit=10
                      previous:
                        type: string
                        nullable: true
                        example: null
                      count:
                        type: integer
                        nullable: true
                        description: >-
                          Total count of geofences matching the filters. Only
                          included when include_count=true.
                        example: 42
                      results:
                        type: array
                        items:
                          $ref: '#/components/schemas/geofence_GeofenceListResponse'
              examples:
                example:
                  value:
                    content:
                      next: /v1/geofences?offset=10&limit=10
                      previous: null
                      results:
                        - id: 11111111-1111-1111-1111-111111111111
                          name: Sample Polygon Geofence
                          description: A polygon shaped zone
                          actions:
                            - lockdown
                          geometry:
                            type: polygon
                            coordinates:
                              - latitude: 41.8902
                                longitude: 12.4924
                              - latitude: 41.8903
                                longitude: 12.4925
                              - latitude: 41.8904
                                longitude: 12.4926
                          created_at: '2024-06-24T14:00:00Z'
                          updated_at: '2024-06-24T15:00:00Z'
                        - id: 22222222-2222-2222-2222-222222222222
                          name: Sample Circular Geofence
                          description: A circle shaped zone
                          actions:
                            - beep
                          geometry:
                            type: circle
                            coordinates:
                              - latitude: 41.8902
                                longitude: 12.4924
                            radius: 100
                          created_at: '2024-06-25T10:00:00Z'
                          updated_at: '2024-06-25T11:00:00Z'
                withSummary:
                  summary: With device summary
                  value:
                    content:
                      next: null
                      previous: null
                      count: 1
                      results:
                        - id: 11111111-1111-1111-1111-111111111111
                          name: Sample Geofence
                          description: A geofence with device tracking
                          actions:
                            - lockdown
                          geometry:
                            type: polygon
                            coordinates:
                              - latitude: 41.8902
                                longitude: 12.4924
                              - latitude: 41.8903
                                longitude: 12.4925
                              - latitude: 41.8904
                                longitude: 12.4926
                          created_at: '2024-06-24T14:00:00Z'
                          updated_at: '2024-06-24T15:00:00Z'
                          device_summary:
                            total_devices: 50
                            inside_count: 30
                            outside_count: 18
                            unknown_count: 2
                          blueprints:
                            - blueprint_id: 550e8400-e29b-41d4-a716-446655440000
                              blueprint_version_number: 1
                              device_count: 25
                            - blueprint_id: 550e8400-e29b-41d4-a716-446655440001
                              blueprint_version_number: 2
                              device_count: 15
                            - blueprint_id: 550e8400-e29b-41d4-a716-446655440002
                              blueprint_version_number: 1
                              device_count: 10
        '400':
          description: Invalid input
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/geofence_ErrorResponse'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/geofence_ErrorResponse'
        '500':
          description: Server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/geofence_ErrorResponse'
  /geofence/v1/geofences/{geofence_id}/device-summary:
    get:
      summary: Get device summary for a geofence
      description: >-
        Returns aggregate statistics about devices in relation to a specific
        geofence (total devices, inside count, outside count)
      operationId: geofence_getDeviceSummary
      tags:
        - geofence_Device State
      parameters:
        - $ref: '#/components/parameters/geofence_XEsperTenantIdHeader'
        - $ref: '#/components/parameters/geofence_XCallerIdHeader'
        - $ref: '#/components/parameters/geofence_GeofenceIdParam'
      security:
        - geofence_bearerAuth: []
      responses:
        '200':
          description: Device summary retrieved successfully
          content:
            application/json:
              schema:
                type: object
                properties:
                  content:
                    $ref: '#/components/schemas/geofence_DeviceSummaryResponse'
              examples:
                example:
                  value:
                    content:
                      total_devices: 100
                      inside_count: 60
                      outside_count: 35
                      unknown_count: 5
        '400':
          description: Invalid geofence ID or missing tenant ID
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/geofence_ErrorResponse'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/geofence_ErrorResponse'
        '500':
          description: Server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/geofence_ErrorResponse'
  /geofence/v1/geofences/{geofence_id}/blueprints:
    get:
      summary: Get blueprint usage statistics for a geofence
      description: >-
        Returns paginated statistics about blueprint usage within a specific
        geofence (which blueprints are used and device counts)
      operationId: geofence_getBlueprintUsage
      tags:
        - geofence_Device State
      parameters:
        - $ref: '#/components/parameters/geofence_XEsperTenantIdHeader'
        - $ref: '#/components/parameters/geofence_XCallerIdHeader'
        - $ref: '#/components/parameters/geofence_GeofenceIdParam'
        - $ref: '#/components/parameters/geofence_OffsetParam'
        - $ref: '#/components/parameters/geofence_LimitParam'
      security:
        - geofence_bearerAuth: []
      responses:
        '200':
          description: Blueprint usage statistics retrieved successfully
          content:
            application/json:
              schema:
                type: object
                properties:
                  content:
                    type: object
                    properties:
                      next:
                        type: string
                        nullable: true
                        example: >-
                          /v1/geofences/f5316a75-f186-4769-970e-28d6a1a0e110/blueprints?offset=10&limit=10
                      previous:
                        type: string
                        nullable: true
                        example: null
                      results:
                        type: array
                        items:
                          $ref: '#/components/schemas/geofence_BlueprintUsageItem'
              examples:
                example:
                  value:
                    content:
                      next: >-
                        /v1/geofences/f5316a75-f186-4769-970e-28d6a1a0e110/blueprints?offset=10&limit=10
                      previous: null
                      results:
                        - blueprint_id: 550e8400-e29b-41d4-a716-446655440000
                          blueprint_version_number: 1
                          device_count: 25
                        - blueprint_id: 550e8400-e29b-41d4-a716-446655440002
                          blueprint_version_number: 2
                          device_count: 15
        '400':
          description: >-
            Invalid geofence ID, missing tenant ID, or missing pagination
            parameters
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/geofence_ErrorResponse'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/geofence_ErrorResponse'
        '500':
          description: Server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/geofence_ErrorResponse'
  /geofence/v1/geofences/{geofence_id}/devices:
    get:
      summary: Get devices for a geofence
      description: >-
        Returns a paginated list of devices and their states within a specific
        geofence. Supports filtering by inside/outside status and blueprint
        version ID.
      operationId: geofence_getDevices
      tags:
        - geofence_Device State
      parameters:
        - $ref: '#/components/parameters/geofence_XEsperTenantIdHeader'
        - $ref: '#/components/parameters/geofence_XCallerIdHeader'
        - $ref: '#/components/parameters/geofence_GeofenceIdParam'
        - $ref: '#/components/parameters/geofence_OffsetParam'
        - $ref: '#/components/parameters/geofence_LimitParam'
        - $ref: '#/components/parameters/geofence_InsideParam'
        - $ref: '#/components/parameters/geofence_BlueprintIdParam'
        - $ref: '#/components/parameters/geofence_BlueprintVersionNumberParam'
      security:
        - geofence_bearerAuth: []
      responses:
        '200':
          description: Device list retrieved successfully
          content:
            application/json:
              schema:
                type: object
                properties:
                  content:
                    type: object
                    properties:
                      next:
                        type: string
                        nullable: true
                        example: >-
                          /v1/geofences/f5316a75-f186-4769-970e-28d6a1a0e110/devices?offset=10&limit=10
                      previous:
                        type: string
                        nullable: true
                        example: null
                      results:
                        type: array
                        items:
                          $ref: '#/components/schemas/geofence_DeviceListingItem'
              examples:
                example:
                  value:
                    content:
                      next: >-
                        /v1/geofences/f5316a75-f186-4769-970e-28d6a1a0e110/devices?offset=10&limit=10
                      previous: null
                      results:
                        - device_id: 660e8400-e29b-41d4-a716-446655440000
                          blueprint_id: 550e8400-e29b-41d4-a716-446655440000
                          blueprint_version_number: 1
                          inside: true
                          state_changed_at: '2025-07-24T09:00:00Z'
                        - device_id: 660e8400-e29b-41d4-a716-446655440001
                          blueprint_id: 550e8400-e29b-41d4-a716-446655440002
                          blueprint_version_number: 2
                          inside: false
                          state_changed_at: '2025-07-24T08:30:00Z'
        '400':
          description: >-
            Invalid geofence ID, missing tenant ID, invalid query parameters, or
            missing pagination parameters
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/geofence_ErrorResponse'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/geofence_ErrorResponse'
        '500':
          description: Server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/geofence_ErrorResponse'
components:
  securitySchemes:
    esper_cloud_api_apiKey:
      type: http
      scheme: bearer
      description: >
        #### API KEY - Access Token

        Access token for API is passed as authorization header in calls. You
        need to generate this from your Esper Console at
        `<domain>-api.esper.cloud` where foo is the sub-domain name you gave for
        your Esper Dev environment when you signed up for your Esper account.
        Please follow the instructions [in this Help
        article](https://help.esper.io/hc/en-us/articles/12656959508497) to
        generate an access token.

        Once you have the access token, you need to send an authorization header
        as below


        ```bash

            curl -X GET \
              https://<domain>-api.esper.cloud/api/enterprise/<enterprise_id>/device/ \
              -H 'Authorization: Bearer <ACCESS_TOKEN>' \
              -H 'Content-Type: application/json' \
        ```


        > Please note the use of keyword **Bearer** before the token value.



        You can read more about api key authentication
        [here](https://help.esper.io/hc/en-us/articles/12656959508497).
    pipelines_SCAPIAuthToken:
      type: http
      scheme: bearer
    device_apiKey:
      type: http
      scheme: bearer
      description: >
        #### API KEY - Access Token

        Access token for API is passed as authorization header in calls. You
        need to generate this from your Esper Console at
        `<domain>-api.esper.cloud` where foo is the sub-domain name you gave for
        your Esper Dev environment when you signed up for your Esper account.
        Please follow the instructions [in this Help
        article](https://help.esper.io/hc/en-us/articles/12656959508497) to
        generate an access token.

        Once you have the access token, you need to send an authorization header
        as below


        ```bash

            curl -X GET \
              https://<domain>-api.esper.cloud/api/enterprise/<enterprise_id>/device/ \
              -H 'Authorization: Bearer <ACCESS_TOKEN>' \
              -H 'Content-Type: application/json' \
        ```


        > Please note the use of keyword **Bearer** before the token value.



        You can read more about api key authentication
        [here](https://help.esper.io/hc/en-us/articles/12656959508497).
    apps_management_apiKey:
      type: http
      scheme: bearer
      description: >
        #### API KEY - Access Token

        Access token for API is passed as authorization header in calls. You
        need to generate this from your Esper Console at
        `<domain>-api.esper.cloud` where foo is the sub-domain name you gave for
        your Esper Dev environment when you signed up for your Esper account.
        Please follow the instructions [in this Help
        article](https://help.esper.io/hc/en-us/articles/12656959508497) to
        generate an access token.

        Once you have the access token, you need to send an authorization header
        as below


        ```bash

            curl -X GET \
              https://<domain>-api.esper.cloud/api/enterprise/<enterprise_id>/device/ \
              -H 'Authorization: Bearer <ACCESS_TOKEN>' \
              -H 'Content-Type: application/json' \
        ```


        > Please note the use of keyword **Bearer** before the token value.



        You can read more about api key authentication
        [here](https://help.esper.io/hc/en-us/articles/12656959508497).
    commands_apiKey:
      type: http
      scheme: bearer
      description: >
        #### API KEY - Access Token

        Access token for API is passed as authorization header in calls. You
        need to generate this from your Esper Console at
        `<domain>-api.esper.cloud` where foo is the sub-domain name you gave for
        your Esper Dev environment when you signed up for your Esper account.
        Please follow the instructions [in this Help
        article](https://help.esper.io/hc/en-us/articles/12656959508497) to
        generate an access token.

        Once you have the access token, you need to send an authorization header
        as below


        ```bash

            curl -X GET \
              https://<domain>-api.esper.cloud/api/enterprise/<enterprise_id>/device/ \
              -H 'Authorization: Bearer <ACCESS_TOKEN>' \
              -H 'Content-Type: application/json' \
        ```


        > Please note the use of keyword **Bearer** before the token value.



        You can read more about api key authentication
        [here](https://help.esper.io/hc/en-us/articles/12656959508497).
    drift_apiKey:
      type: http
      scheme: bearer
      description: >
        #### API KEY - Access Token

        Access token for API is passed as authorization header in calls. You
        need to generate this from your Esper Console at
        `<domain>-api.esper.cloud` where foo is the sub-domain name you gave for
        your Esper Dev environment when you signed up for your Esper account.
        Please follow the instructions [in this Help
        article](https://help.esper.io/hc/en-us/articles/12656959508497) to
        generate an access token.

        Once you have the access token, you need to send an authorization header
        as below


        ```bash

            curl -X GET \
              https://<domain>-api.esper.cloud/api/enterprise/<enterprise_id>/device/ \
              -H 'Authorization: Bearer <ACCESS_TOKEN>' \
              -H 'Content-Type: application/json' \
        ```


        > Please note the use of keyword **Bearer** before the token value.



        You can read more about api key authentication
        [here](https://help.esper.io/hc/en-us/articles/12656959508497).
    device_onboarding_apiKey:
      type: http
      scheme: bearer
      description: >
        #### API KEY - Access Token

        Access token for API is passed as authorization header in calls. You
        need to generate this from your Esper Console at
        `<domain>-api.esper.cloud` where foo is the sub-domain name you gave for
        your Esper Dev environment when you signed up for your Esper account.
        Please follow the instructions [in this Help
        article](https://help.esper.io/hc/en-us/articles/12656959508497) to
        generate an access token.

        Once you have the access token, you need to send an authorization header
        as below


        ```bash

            curl -X GET \
              https://<domain>-api.esper.cloud/api/enterprise/<enterprise_id>/device/ \
              -H 'Authorization: Bearer <ACCESS_TOKEN>' \
              -H 'Content-Type: application/json' \
        ```


        > Please note the use of keyword **Bearer** before the token value.



        You can read more about api key authentication
        [here](https://help.esper.io/hc/en-us/articles/12656959508497).
    tenant_apiKey:
      type: http
      scheme: bearer
      description: >
        #### API KEY - Access Token

        Access token for API is passed as authorization header in calls. You
        need to generate this from your Esper Console at
        `<domain>-api.esper.cloud` where foo is the sub-domain name you gave for
        your Esper Dev environment when you signed up for your Esper account.
        Please follow the instructions [in this Help
        article](https://help.esper.io/hc/en-us/articles/12656959508497) to
        generate an access token.

        Once you have the access token, you need to send an authorization header
        as below


        ```bash

            curl -X GET \
              https://<domain>-api.esper.cloud/api/enterprise/<enterprise_id>/device/ \
              -H 'Authorization: Bearer <ACCESS_TOKEN>' \
              -H 'Content-Type: application/json' \
        ```


        > Please note the use of keyword **Bearer** before the token value.



        You can read more about api key authentication
        [here](https://help.esper.io/hc/en-us/articles/12656959508497).
    foundation_AuthToken:
      type: apiKey
      in: header
      name: Authorization
    reports_bearerAuth:
      type: http
      scheme: bearer
    geofence_bearerAuth:
      type: http
      scheme: bearer
      bearerFormat: JWT
  schemas:
    esper_cloud_api_ApplicationVersion:
      title: Version
      type: object
      properties:
        id:
          title: Id
          type: string
          format: uuid
          readOnly: true
        version_code:
          title: Version code
          maxLength: 50
          minLength: 1
          type: string
        build_number:
          title: Build number
          maxLength: 100
          minLength: 1
          type: string
          nullable: true
        hash_string:
          title: Hash string
          type: string
        min_sdk_version:
          title: Min sdk version
          maxLength: 10
          minLength: 1
          type: string
          nullable: true
        target_sdk_version:
          title: Target sdk version
          maxLength: 10
          minLength: 1
          type: string
          nullable: true
        download_url:
          title: Url
          type: string
          format: url
        icon_url:
          title: Url for the icon
          type: string
          format: url
        release_name:
          title: Name of the release
          type: string
        release_comments:
          title: comments about the release
          type: string
    esper_cloud_api_Application:
      required:
        - application_name
        - enterprise
        - package_name
      type: object
      properties:
        id:
          title: Id
          type: string
          format: uuid
          readOnly: true
        versions:
          type: array
          items:
            $ref: '#/components/schemas/esper_cloud_api_ApplicationVersion'
        application_name:
          title: Application name
          maxLength: 255
          minLength: 1
          type: string
        package_name:
          title: Package name
          maxLength: 255
          minLength: 1
          type: string
        developer:
          title: Developer
          maxLength: 255
          minLength: 1
          type: string
          nullable: true
        category:
          title: Category
          maxLength: 255
          minLength: 1
          type: string
          nullable: true
        content_rating:
          title: Content rating
          type: string
          format: decimal
        compatibility:
          title: Compatibility
          minLength: 1
          type: string
          nullable: true
        created_on:
          title: Created on
          type: string
          format: date-time
          readOnly: true
        updated_on:
          title: Updated on
          type: string
          format: date-time
          readOnly: true
        is_active:
          title: Is active
          type: boolean
        is_hidden:
          title: Is hidden
          type: boolean
        enterprise:
          title: Enterprise
          type: string
          format: url
    esper_cloud_api_ErrorResponse:
      type: object
      properties:
        errors:
          title: Messages describing the error
          type: array
          items:
            type: string
        message:
          title: Message describing the error
          type: string
        status:
          title: alias name
          type: integer
    esper_cloud_api_AppPermission:
      required:
        - enterprise
        - permission
      type: object
      properties:
        id:
          title: Id
          type: string
          format: uuid
          readOnly: true
        permission:
          title: Permission
          maxLength: 255
          minLength: 1
          type: string
        grant_state:
          title: Grant state
          type: string
          enum:
            - Default
            - Denied
            - Granted
        created_on:
          title: Created on
          type: string
          format: date-time
          readOnly: true
        updated_on:
          title: Updated on
          type: string
          format: date-time
          readOnly: true
        is_active:
          title: Is active
          type: boolean
        enterprise:
          title: Enterprise
          type: string
          format: url
        app_version:
          title: App version
          type: string
          format: url
    esper_cloud_api_AppVersion:
      title: Application Version
      required:
        - enterprise
        - permissions
        - version_code
      type: object
      properties:
        id:
          title: Id
          type: string
          format: uuid
          readOnly: true
        installed_count:
          title: Installed count
          type: integer
          readOnly: true
        permissions:
          type: array
          items:
            $ref: '#/components/schemas/esper_cloud_api_AppPermission'
        app_file:
          title: App file
          type: string
          format: url
          readOnly: true
        app_icon:
          title: App icon
          type: string
          format: url
          nullable: true
          readOnly: true
        version_code:
          title: Version code
          maxLength: 50
          minLength: 1
          type: string
        build_number:
          title: Build number
          maxLength: 100
          minLength: 1
          type: string
          nullable: true
        size_in_mb:
          title: Size in mb
          type: number
        hash_string:
          title: Hash string
          type: string
        release_name:
          title: Release name
          maxLength: 255
          minLength: 1
          type: string
          nullable: true
        release_comments:
          title: Release comments
          minLength: 1
          type: string
          nullable: true
        release_track:
          title: Release track
          type: string
          nullable: true
          enum:
            - Alpha
            - Beta
            - Production
        created_on:
          title: Created on
          type: string
          format: date-time
          readOnly: true
        updated_on:
          title: Updated on
          type: string
          format: date-time
          readOnly: true
        min_sdk_version:
          title: Min sdk version
          maxLength: 10
          minLength: 1
          type: string
          nullable: true
        target_sdk_version:
          title: Target sdk version
          maxLength: 10
          minLength: 1
          type: string
          nullable: true
        is_enabled:
          title: Is enabled
          type: boolean
        is_default:
          title: Is Default
          type: boolean
        enterprise:
          title: Enterprise
          type: string
          format: url
        application:
          title: Application
          type: string
          format: url
        approval_status:
          title: Application status
          type: string
          enum:
            - AVAILABLE
            - ACCEPTED
            - APPROVED
            - REJECTED
    esper_cloud_api_AppVersionDelete:
      type: object
      properties:
        request_id:
          title: Request id
          type: string
          format: uuid
        templates:
          type: array
          description: List of linked templates to an app version
          items:
            type: object
            properties:
              id:
                title: Id
                type: integer
                description: Id of the linked template
              name:
                title: Name
                type: string
                description: Name of the linked template
    esper_cloud_api_InstallDevices:
      required:
        - id
      type: object
      properties:
        id:
          title: Id
          type: string
          format: uuid
        device_name:
          title: Device name
          type: string
        alias_name:
          title: alias name
          type: string
          nullable: true
        group_name:
          title: Group name
          maxLength: 255
          minLength: 1
          type: string
    esper_cloud_api_GoogleEnterprise:
      type: object
      required:
        - name
      properties:
        id:
          title: Id
          type: integer
        google_enterprise_id:
          title: Google Enterprise Id
          type: string
        name:
          title: Name of Google Enterprise
          type: string
        state:
          type: integer
        callback_url:
          type: string
          format: url
        signup_url:
          type: string
          format: url
        completion_token:
          type: string
        enterprise_token:
          type: string
        is_active:
          type: boolean
        created_on:
          type: string
          format: date-time
        updated_on:
          type: string
          format: date-time
        enterprise:
          type: string
    esper_cloud_api_GoogleWebToken:
      type: object
      properties:
        id:
          title: Id
          type: integer
        emm:
          title: emm Id
          type: integer
        token:
          title: Webtoken
          type: string
        parent_url:
          type: string
          format: url
        is_active:
          type: boolean
        created_on:
          type: string
          format: date-time
    esper_cloud_api_GoogleWebTokenUpdate:
      type: object
      required:
        - emm
        - parent_url
      properties:
        id:
          title: Id
          type: integer
        emm:
          title: emm Id
          type: integer
        token:
          title: Webtoken
          type: string
        parent_url:
          type: string
          format: url
        is_active:
          type: boolean
    esper_cloud_api_GoogleWebTokenUpdateNoRequirements:
      type: object
      properties:
        id:
          title: Id
          type: integer
        emm:
          title: emm Id
          type: integer
        token:
          title: Webtoken
          type: string
        parent_url:
          type: string
          format: url
        is_active:
          type: boolean
    esper_cloud_api_GoogleProduct:
      type: object
      properties:
        id:
          type: string
          format: uuid
        icon_url:
          type: string
          format: url
        is_active:
          type: boolean
        title:
          type: string
        unapproved:
          type: boolean
        created_on:
          type: string
          format: date-time
        updated_on:
          type: string
          format: date-time
        min_sdk_version:
          type: string
        google_product_id:
          type: string
        package_name:
          type: string
          minLength: 1
          maxLength: 255
        google_enterprise:
          type: integer
    esper_cloud_api_PatchGoogleProduct:
      type: object
      properties:
        id:
          type: string
          format: uuid
        icon_url:
          type: string
          format: url
        is_active:
          type: boolean
        title:
          type: string
        created_on:
          type: string
          format: date-time
        updated_on:
          type: string
          format: date-time
        min_sdk_version:
          type: string
        google_product_id:
          type: string
        package_name:
          type: string
          minLength: 1
          maxLength: 255
        google_enterprise:
          type: integer
    esper_cloud_api_GoogleProductInstall:
      type: object
      properties:
        id:
          type: string
          format: uuid
        enterprise:
          type: string
        device:
          type: string
        install_state:
          type: string
        version_code:
          type: string
        install_type:
          type: integer
          title: install type- default 0, EMM 1
        is_force_install:
          type: boolean
        reason_details:
          type: string
        created_on:
          type: string
          format: date-time
        updated_on:
          type: string
          format: date-time
        is_active:
          type: boolean
        objects:
          type: object
    esper_cloud_api_DeviceStateEnum:
      type: integer
      format: int32
      description: >
        Following are the Device States and their description


        ```

        * 0 = Device State is Unspecified

        * 1 = Online

        * 20 = Disabled (device has been factory reset or removed from the Esper
        Dashboard)

        * 30 = Beginning Provisioning

        * 40 = Configuring Google Play (still provisioning)

        * 50 = Applying Policies and Installing Applications (still
        provisioning)

        * 60 = Offline

        * 70 = Device is undergoing a Factory Reset (reset started from
        Dashboard)

        * 80 = Device Onboarding in Progress

        * 90 = Device Onboarding Failed

        * 100 = Device Onboarded in Esper

        * 110 = Android For Work Account added

        * 120 = Apps installed

        * 130 = Branding Processed

        * 140 = Permission Policy Processed

        * 150 = Device Policy Processed

        * 160 = Device Settings Processed

        * 170 = Security Policy Processed

        * 180 = Phone Policy Processed

        * 190 = Custom Settings Processed

        * 200 = Registered

        ```
      enum:
        - 0
        - 1
        - 20
        - 30
        - 40
        - 50
        - 60
        - 70
        - 80
        - 90
        - 100
        - 110
        - 120
        - 130
        - 140
        - 150
        - 160
        - 170
        - 180
        - 190
        - 200
    esper_cloud_api_EmmDevice:
      type: object
      properties:
        id:
          type: integer
          format: int64
        google_device_id:
          type: string
        managementType:
          type: string
        device:
          type: string
          format: uuid
        google_user:
          type: integer
          format: int64
        policy:
          type: integer
          format: int64
        created_on:
          type: string
          format: date-time
        updated_on:
          type: string
          format: date-time
        is_active:
          type: boolean
          default: true
    esper_cloud_api_DeviceInfo:
      type: object
      properties:
        id:
          type: string
          format: uuid
        url:
          type: string
          format: url
        device_name:
          type: string
        alias_name:
          type: string
          description: Device friendly name
        policy_name:
          type: string
        status:
          type: integer
          description: Current status of device
          format: int32
        state:
          $ref: '#/components/schemas/esper_cloud_api_DeviceStateEnum'
        current_command:
          type: string
          description: Current command associated with device
          format: uuid
        suid:
          type: string
          description: Device generated unique id
        directory_record_id:
          type: string
          format: uuid
          description: ID of Directory Record associated with the device (if available)
        fcm_id:
          type: string
        enterprise:
          type: string
          format: url
        policy:
          type: string
          format: url
        user:
          type: string
          format: url
        groups:
          type: array
          items:
            type: string
            format: url
        tags:
          type: array
          items:
            type: string
        api_level:
          type: integer
          format: int32
        template_name:
          type: string
        mqtt_id:
          type: string
        softwareInfo:
          type: object
          properties: {}
        hardwareInfo:
          type: object
          properties: {}
        displays:
          type: object
          properties: {}
        networkInfo:
          type: object
          properties: {}
        memoryInfo:
          type: object
          properties: {}
        esper_cient:
          type: string
        device_type:
          type: string
        audioConstraints:
          type: object
          properties: {}
        provisioned_on:
          type: string
          format: date-time
        created_on:
          type: string
          format: date-time
        current_app_mode:
          type: integer
        kiosk_app_name:
          type: string
        lockdown_state:
          type: integer
        timezone_string:
          type: string
        initialtemplate:
          type: string
        updated_on:
          type: string
          format: date-time
        emm_device:
          $ref: '#/components/schemas/esper_cloud_api_EmmDevice'
        is_gms:
          type: boolean
          default: true
        is_active:
          type: boolean
          default: true
        has_seamlessInfo:
          type: boolean
          readOnly: true
    esper_cloud_api_DeviceApp:
      required:
        - app_name
        - device
        - package_name
      type: object
      properties:
        id:
          title: Id
          type: string
          format: uuid
          readOnly: true
        app_name:
          title: App name
          minLength: 1
          type: string
        state:
          type: string
        app_type:
          type: string
        package_name:
          title: Package name
          maxLength: 255
          minLength: 1
          type: string
        whitelisted:
          title: Whitelisted
          type: boolean
        is_data_clearable:
          title: Data clearable
          type: boolean
        is_uninstallable:
          title: Uninstallable
          type: boolean
        product_id:
          title: Product id
          maxLength: 255
          minLength: 1
          type: string
          nullable: true
        version_code:
          title: Version code
          maxLength: 128
          minLength: 1
          type: string
          nullable: true
        version_name:
          title: Version name
          maxLength: 128
          minLength: 1
          type: string
          nullable: true
        created_on:
          title: Created on
          type: string
          format: date-time
          readOnly: true
        updated_on:
          title: Updated on
          type: string
          format: date-time
          readOnly: true
        is_active:
          title: Is active
          type: boolean
        is_kiosk_app:
          type: boolean
        is_esper_controlled:
          type: boolean
        device:
          title: AndroidDevice
          type: string
          format: uuid
    esper_cloud_api_AppInstallVersion:
      title: Version
      type: object
      properties:
        app_version_id:
          title: App version id
          type: string
          format: uuid
        version_code:
          title: Version code
          type: string
        build_number:
          title: Build number
          type: string
        hash_string:
          title: Hash string
          type: string
    esper_cloud_api_AppInstallApplication:
      title: Application
      type: object
      properties:
        application_name:
          title: Application name
          type: string
        package_name:
          title: Package name
          type: string
        version:
          $ref: '#/components/schemas/esper_cloud_api_AppInstallVersion'
        is_enabled:
          title: Is enabled
          type: boolean
    esper_cloud_api_AppInstallStateEnum:
      title: Install state
      type: string
      description: |
        Device App Install State

        ``` * NOT_INSTALLED = "Not Installed"
        * INSTALL_IN_PROGRESS = "Installation In-Progress"
        * UNINSTALL_IN_PROGRESS = "Uninstallation In-Progress"
        * INSTALL_SUCCESS = "Install Success"
        * INSTALL_FAILED = "Install Failed"
        * UNINSTALL_SUCCESS = "Uninstall Success"
        * UNINSTALL_FAILED = "Uninstall Failed"
        ```
      enum:
        - NOT_INSTALLED
        - INSTALL_IN_PROGRESS
        - UNINSTALL_IN_PROGRESS
        - INSTALL_SUCCESS
        - INSTALL_FAILED
        - UNINSTALL_SUCCESS
        - UNINSTALL_FAILED
    esper_cloud_api_AppInstall:
      required:
        - application
        - device
        - enterprise
        - install_state
      type: object
      properties:
        id:
          title: Id
          type: string
          format: uuid
          readOnly: true
        application:
          $ref: '#/components/schemas/esper_cloud_api_AppInstallApplication'
        install_state:
          $ref: '#/components/schemas/esper_cloud_api_AppInstallStateEnum'
        reason_details:
          title: Reason details
          minLength: 1
          type: string
          nullable: true
        created_on:
          title: Created on
          type: string
          format: date-time
          readOnly: true
        updated_on:
          title: Updated on
          type: string
          format: date-time
          readOnly: true
        is_active:
          title: Is active
          type: boolean
        enterprise:
          title: Enterprise
          type: string
          format: url
        device:
          title: AndroidDevice
          type: string
          format: url
    esper_cloud_api_DeviceStatus:
      required:
        - data
        - device
        - enterprise
      type: object
      properties:
        id:
          title: ID
          type: integer
          readOnly: true
        data:
          title: Data
          type: string
        created_on:
          title: Created on
          type: string
          format: date-time
          readOnly: true
        device:
          title: AndroidDevice
          type: string
          format: url
        enterprise:
          title: Enterprise
          type: string
          format: url
    esper_cloud_api_EventFeed:
      type: object
      properties:
        id:
          type: integer
          description: Integer representing the event ID
        message_id:
          type: string
          format: UUID
          description: UUID string representing message ID
        device_status_id:
          type: string
          format: UUID
          description: UUID string representing device status ID
        created_on:
          type: string
          format: date-time
        message:
          type: string
          description: >-
            Message describing the command, who issued it, and from which state
            it was issued.
        device:
          type: string
          format: url
          description: URL to device instance
          example: >-
            https://{example}-api.esper.cloud/api/enterprise/{enterprise_id}/device/{device_id}/
        enterprise:
          type: string
          format: url
          description: URL to enterprise instance
          example: https://{example}-api.esper.cloud/api/enterprise/{enterprise_id}/
    esper_cloud_api_V0DeviceCommandEnum:
      type: string
      description: >
        Following commands are supported


        ```

        * ADD_TO_WHITELIST: Whitelist an installed sytem app. Requires
        `package_name` in command arguments where `package_name` is the app
        package uploaded on Esper

        * ADD_WIFI_AP : Add wifi access points for device. Requires
        `wifi_access_points` in command arguments where `wifi_access_points` is
        the data with access points

        * CLEAR_APP_DATA : Clear data for an installed app. Requires
        `package_name` in command arguments where `package_name` is the app
        package uploaded on Esper

        * CLEAR_APP_CACHE : Clear the cache of an installed app without removing
        its data. Requires `package_name` in command arguments where
        `package_name` is the app package uploaded on Esper. Supported on
        Android 6.0+ devices with the supervisor installed.

        * INSTALL: Install an app on a device. Requires `app_version` in command
        arguments where `app_version` is the version id of app uploaded on Esper

        * LOCK: Lock device screen

        * REBOOT: Reboot a device

        * REMOVE_FROM_WHITELIST : Remove an installed system app from whitelist.
        Requires `package_name` in command arguments where `package_name` is the
        app package uploaded on Esper

        * REMOVE_WIFI_AP : Remove Wifi access points for device. Requires
        `wifi_access_points` in command arguments where `wifi_access_points` is
        the data with access points

        * UPDATE_WIFI_AP : Update Wi-Fi access point configuration on device.
        Requires `wifi_ssid` and `wifi_security_type` in command arguments.
        Device must be connected to the target SSID. Supports EAP (enterprise)
        and personal (WPA2/WPA/WEP) networks. On failure, attempts to restore
        the previous configuration. Android only.

        * SET_APP_PERMISSION : Set permission for an installed app. Requires
        `package_name`, `grant_state`, `permission` in command arguments where
        `package_name` is the app package uploaded on Esper, `grant_state`
        should be "PERMISSION_GRANT_STATE_DEFAULT",
        "PERMISSION_GRANT_STATE_DENIED", "PERMISSION_GRANT_STATE_GRANTED" and
        `permission` is a valid permission

        * SET_APP_STATE : Set the state of an app -
        SHOW/HIDE/DISABLE/LAUNCHABLE_BUT_HIDDEN. Requries `app_state` and
        `package_name` in command arguments where `app_state` is the state of
        app and `package_name` is the app package uploaded on Esper

        * SET_BLUETOOTH_STATE : Set bluetooth state (ON/OFF) for device.
        Requires `bluetooth_state` in command arguments where `bluetooth_state`
        is a boolean.

        * SET_BRIGHTNESS_SCALE : Set brightness for device. Requires
        `brightness_value` in command arguments where `brightness_value` is an
        integer (1-100).

        * SET_DEVICE_LOCKDOWN_STATE : Set lockdown state for a device. Requires
        `state` and `message` in command arguments where `state` is
        LOCKED/UNLOCKED and `message` is the message to be added with command

        * SET_GPS_STATE :Set the GPS state for a device. Requires `gps_state` in
        command arguments where `gps_state` should be either 0, 1, 2, 3 or 4
        (LOCATION_MODE_HIGH_ACCURACY = 0, LOCATION_MODE_SENSORS_ONLY = 1,
        LOCATION_MODE_BATTERY_SAVING = 2, LOCATION_MODE_OFF = 3,
        LOCATION_MODE_ON = 4)

        * SET_KIOSK_APP : Command to set the Kiosk app for a device. Requires
        `package_name` in command arguments where `package_name` is the app
        package uploaded on Esper

        * SET_NEW_POLICY : Apply policy on device. Requires `policy_url` in
        command arguments where `policy_url` is the URL to the policy

        * SET_ROTATION_STATE : Set screen orientation. Requires `rotate_state`
        in command arguments where `rotate_state` should be either 0, 1 or 2 (0
        = AUTO, 1 = PORTRAIT_ONLY, 2 = LANDSCAPE_ONLY)

        * SET_SCREEN_OFF_TIMEOUT: Set screen off timeout for a device. Requires
        `screen_off_timeout` in command arguments where `screen_off_timeout`
        should be either -1 or between 5000 and 1800000

        * SET_STREAM_VOLUME : Set stream volume for a device. Requires `stream`
        and `volume_level` in command arguments where `stream` should be either
        0(Ring), 1(Notification), 2(Alarm) or 3(Music) and `volume_level` should
        be a value from 0 to 100

        * SET_TIMEZONE : Set the timezone for a device. Requires
        `timezone_string` in command arguments where `timezone_string` is a
        valid string representing the timezone

        * SET_WIFI_STATE : Set the wifi state (ON/OFF) for a device. Requires
        `wifi_state` in command arguments where `wifi_state` is a boolean.

        * UNINSTALL: Uninstall an app from device. Requires `package_name` in
        command arguments where `package_name` is the app package uploaded on
        Esper

        * UPDATE_DEVICE_CONFIG: Push additional configurations to the Device

        * UPDATE_HEARTBEAT: Ping a device

        * UPDATE_LATEST_DPC : Prompt device to update the DPC app to the latest
        versions.

        * WIPE : Wipes the device.

        * RESET_LOCKSCREEN_PASSWORD: Change the lockscreen password of the
        device. Requires `new_lockscreen_password` in command arguments where
        `new_lockscreen_password` is a valid string.

        * CAPTURE_SCREENSHOT: Allows you to take a screenshot of the device's
        current screen. The "tag" is an optional param that can be set to
        corresponding screenshot.

        * UPDATE_BLUEPRINT: Pushes or reapplies the most current Blueprint
        version to the device or group.

        * NOTIFY_DEVICE: Allows you to  broadcast message to the device.
        Requires 'title', 'message' and 'url' (optional) as string in command
        arguments. For scheduled message command requires 'name', 'time_type' as
        string and 'start_datetime' and 'end_datetime' as date-time.

        * SET_DEVICE_LANGUAGE: Set language for a device. Requires locale value
        in xx[_Zzzz]_yy where xx is language code, Zzzz is script (optional) and
        yy is country code.

        * SET_ETHERNET_SETTINGS: Set ethernet settings on supported Device

        * SET_STATIC_IP: Set static ip on the deivce. Requires interface,
        dhcp_dnabled, static_ip, primary_dns, subnet_mask, gateway,
        secondary_dns (optional)

        * BEEP_DEVICE: Allows you to make the device beep for a specified
        duration

        * SET_APP_NOTIFICATIONS: Enable/disable app notifications. Requries
        `app_notifications_state` and `package_name` in command arguments where
        `app_notifications_state` is a string that has the value `ENABLED` or
        `DISABLED` and `package_name` is the app package uploaded on Esper.

        * USE_ONLY_SAVED_WIFI_AP: Allow/disallow device to connect to
        unregistered WiFi APs. Requires boolean `use_only_saved_ap`.

        * CONVERGE: Allows you to converge the device to the latest version of
        its assigned blueprint.

        * SYNC_CONTENT: Allows you to sync content to the device. Requires
        `content_id` in command arguments where `content_id` is the id of the
        content to be synced. ```
      enum:
        - ADD_TO_WHITELIST
        - ADD_WIFI_AP
        - CLEAR_APP_DATA
        - CLEAR_APP_CACHE
        - INSTALL
        - LOCK
        - REBOOT
        - REMOVE_FROM_WHITELIST
        - REMOVE_WIFI_AP
        - SET_APP_PERMISSION
        - SET_APP_STATE
        - SET_BLUETOOTH_STATE
        - SET_BRIGHTNESS_SCALE
        - SET_DEVICE_LOCKDOWN_STATE
        - SET_GPS_STATE
        - SET_KIOSK_APP
        - SET_NEW_POLICY
        - SET_ROTATION_STATE
        - SET_SCREEN_OFF_TIMEOUT
        - SET_STREAM_VOLUME
        - SET_TIMEZONE
        - SET_WIFI_STATE
        - UNINSTALL
        - UPDATE_DEVICE_CONFIG
        - UPDATE_HEARTBEAT
        - UPDATE_LATEST_DPC
        - UPDATE_WIFI_AP
        - WIPE
        - RESET_LOCKSCREEN_PASSWORD
        - UPDATE_BLUEPRINT
        - CAPTURE_SCREENSHOT
        - NOTIFY_DEVICE
        - SET_DEVICE_LANGUAGE
        - SET_ETHERNET_SETTINGS
        - SET_STATIC_IP
        - BEEP_DEVICE
        - SET_APP_NOTIFICATIONS
        - USE_ONLY_SAVED_WIFI_AP
        - CONVERGE
        - SYNC_CONTENT
    esper_cloud_api_V0CommandArgs:
      title: Command args
      type: object
      properties:
        device_alias_name:
          type: string
          description: Alternate human-readable name for your Device
        custom_settings_config:
          type: object
          properties: {}
          description: Managed configurations for your device (passed as JSON object)
        app_version:
          type: string
          description: The version id of app uploaded on Esper
        package_name:
          type: string
          description: The app package name uploaded on Esper
        policy_url:
          type: string
          description: The URL to the policy
        wifi_access_points:
          type: object
          properties: {}
          description: Wifi access points for the device (passed as JSON object)
        state:
          type: string
          description: LOCKED/UNLOCKED
        message:
          type: string
          description: Message to be added with command to notify device.
        title:
          type: string
          description: Message title  to be added with command to notify device.
        url:
          type: string
          description: (Optional) Link to notify device.
        app_state:
          type: string
          description: The state of app - SHOW/HIDE/DISABLE/LAUNCHABLE_BUT_HIDDEN
        bluetooth_state:
          type: boolean
          description: The state of bluetooth - ON/OFF
        brightness_value:
          type: integer
          description: The brightness value of a device(1-100)
        gps_state:
          type: integer
          description: >-
            The GPS state of a device. Should be either 0, 1, 2, 3 or 4
            (LOCATION_MODE_HIGH_ACCURACY = 0, LOCATION_MODE_SENSORS_ONLY = 1,
            LOCATION_MODE_BATTERY_SAVING = 2, LOCATION_MODE_OFF = 3,
            LOCATION_MODE_ON = 4)
        rotate_state:
          type: integer
          description: >-
            The screen orientation of a device. Should be either 0, 1 or 2 (0 =
            AUTO, 1 = PORTRAIT_ONLY, 2 = LANDSCAPE_ONLY)
        screen_off_timeout:
          type: integer
          description: >-
            The value for screen timeout of a device. Should be either -1 or
            between 5000 and 1800000
        stream:
          type: integer
          description: >-
            The value of the volume stream. Should be either 0(Ring),
            1(Notification), 2(Alarm) or 3(Music)
        volume_level:
          type: integer
          description: The level of volume. Should be a value from 0 to 100
        timezone_string:
          type: integer
          description: The timezone of a device. Should be a valid timezone string
        wifi_state:
          type: boolean
          description: The state of WIFI - ON/OFF
        wifi_revert_timeout:
          type: integer
          description: The WIFI revert timeout. Should be greater than or equal to 1
        locale:
          type: string
          description: >-
            Language and country code in xx[_Zzzz]_yy where xx is language code,
            Zzzz is script (optional) and yy is country code.
        ethernet_auth_mode:
          type: string
          description: Chosen mode of authentication
          enum:
            - NONE
            - EAP_TLS
        ethernet_ca_cert_alias:
          type: string
          description: CA certificate alias. It is mandatory with Auth Mode EAP_TLS
        ethernet_client_cert_alias:
          type: string
          description: Client certificate alias. It is mandatory with Auth Mode EAP_TLS
        ethernet_eap_identity:
          type: string
          description: EAP identity
        interface:
          type: string
          description: The network interface of the device - wlan/eth
        dhcp_enabled:
          type: string
          description: The dhcp state on the device - true/false
        static_ip:
          type: string
          description: The static ip to set on the device. Should be a valid ipv4
        primary_dns:
          type: string
          description: The primary dns to set on the device. Should be a valid ipv4
        subnet_mask:
          type: string
          description: >-
            The subnet mask set on the device. Should between 1-32 both
            inclusive
        secondary_dns:
          type: string
          description: The secondary dns to set on the device. Should be a valid ipv4
        gateway:
          type: string
          description: The gateway to set on the device. Should be a valid ipv4
        duration:
          type: string
          description: >-
            The beep duration specified in seconds. Value must be between 10 and
            300, both inclusive.
        tag:
          type: string
          description: >-
            The tag is an optional param that can be set to corresponding
            screenshot. Options are "tag".
        video_quality:
          type: string
          description: >-
            The video quality of the respective Remote Viewer session. Options
            are "STANDARD" and "DATA_SAVER".
        enable_debug_mode:
          type: boolean
          default: false
          description: >-
            The flag to determine whether device must go into Debug Mode, in
            order to retreive bug report when the device is already in Kiosk
            Mode.
        converge_with_provision_option:
          type: boolean
          default: false
          description: >-
            The flag to determine whether device should be converged with
            provision only or not.
        auto_update_mode:
          type: string
          enum:
            - autoUpdateDefault
            - autoUpdateHighPriority
            - autoUpdatePostponed
          default: autoUpdateHighPriority
          description: (Optional) Auto update mode for google play application
        content_id:
          type: string
          description: The id of the content to be synced.
    esper_cloud_api_V0CommandScheduleEnum:
      type: string
      description: >
        Following Schedule types are supported


        ```

        * IMMEDIATE: Schedule the command to execcute Immediately

        * WINDOW: Schedule the command to execute within the given window

        * RECURRING: Schedule the command to execute during the scheduled time
        until it succeeds or expires. After executing successfully, it will not
        fire again.

        ```
      enum:
        - IMMEDIATE
        - WINDOW
        - RECURRING
    esper_cloud_api_V0CommandScheduleArgsTimeTypeEnum:
      type: string
      description: >
        The Time-Type argument, in Schedule args, is to indicate which timezone
        the Command Framework should utilize when scheduling the command.

        Following Schedule Args for Time-Type are supported:


        ```

        * CONSOLE: Use the local timezone of the user creating the schedule.

        * DEVICE: Use the local timezone of the device, to which the command is
        issued, wherever it may be.

        ```
      enum:
        - console
        - device
    esper_cloud_api_V0CommandScheduleArgs:
      title: Command Schedule Arguments
      type: object
      properties:
        name:
          type: string
        start_datetime:
          type: string
          format: date-time
        end_datetime:
          type: string
          format: date-time
        time_type:
          $ref: >-
            #/components/schemas/esper_cloud_api_V0CommandScheduleArgsTimeTypeEnum
        window_start_time:
          type: string
          description: >-
            It is automatically populated by the time field from the request's
            start_datetime and cannot be injected via the API request body.
        window_end_time:
          type: string
          description: >-
            It is automatically populated by the time field from the request's
            end_datetime and cannot be injected via the API request body.
        days:
          type: array
          items:
            type: string
    esper_cloud_api_V0CommandRequestStatus:
      type: object
      properties:
        state:
          title: Command State
          type: string
          description: Current State of command
          format: uuid
        total:
          title: Count
          type: integer
          description: No of commands currently in this state
          format: int64
    esper_cloud_api_V0CommandRequest:
      type: object
      properties:
        id:
          title: Id
          type: string
          description: Unique command request identifier
          format: uuid
          readOnly: true
        enterprise:
          title: Enterperise ID
          type: string
          description: Esper account identifier
          format: uuid
          readOnly: true
        command_type:
          type: string
          description: |
            Identifies the type of command

            ```
            * DEVICE: command request is meant for devices
            * GROUP: command request is meant for groups
            * DYNAMIC: command request is meant for dynamic set of devices
              i.e subset of devices from different groups or otherwise.
            ```
          enum:
            - DEVICE
            - GROUP
            - DYNAMIC
        devices:
          maxItems: 1000
          minItems: 0
          type: array
          description: list of devices to run commands
          items:
            type: string
            format: uuid
        groups:
          maxItems: 500
          minItems: 0
          type: array
          description: list of groups to run commands
          items:
            type: string
            format: uuid
        command:
          $ref: '#/components/schemas/esper_cloud_api_V0DeviceCommandEnum'
        command_args:
          $ref: '#/components/schemas/esper_cloud_api_V0CommandArgs'
        schedule:
          $ref: '#/components/schemas/esper_cloud_api_V0CommandScheduleEnum'
        schedule_args:
          $ref: '#/components/schemas/esper_cloud_api_V0CommandScheduleArgs'
        issued_by:
          type: string
          description: command is issued by this user
          format: url
          readOnly: true
        created_on:
          title: Created on
          type: string
          description: Timestamp of command request
          format: date-time
          readOnly: true
        status:
          title: Current Status
          type: array
          description: Show current status of commands issued during this request
          readOnly: true
          items:
            $ref: '#/components/schemas/esper_cloud_api_V0CommandRequestStatus'
    esper_cloud_api_DeviceGroup:
      required:
        - name
      type: object
      properties:
        id:
          title: Id
          type: string
          description: Group id
          format: uuid
          readOnly: true
        name:
          title: Name
          type: string
          description: Group name
        created_on:
          title: Created on
          type: string
          description: Date and time of when the group was created
          format: date-time
          readOnly: true
        enterprise:
          title: Enterprise
          type: string
          description: Enterprise url
          format: url
          readOnly: true
        parent:
          title: Parent
          type: string
          description: Parent group url
          format: url
        device_count:
          title: Device count
          type: integer
          description: Count of devices in the group
          readOnly: true
        path:
          title: Path
          type: string
          description: Path of the group
          readOnly: true
        children_count:
          title: Children count
          type: integer
          description: Count of child groups
          readOnly: true
        thumbnail:
          title: thumbnail
          description: thumbnail associated with the group
          type: string
          format: uuid
        blueprint:
          title: Blueprint
          description: Blueprint associated with the group.
          type: string
          format: uuid
          readOnly: true
    esper_cloud_api_DeviceGroupUpdate:
      required:
        - name
      type: object
      properties:
        id:
          title: Id
          type: string
          description: Group id
          format: uuid
          readOnly: true
        name:
          title: Name
          type: string
          description: Group name
        created_on:
          title: Created on
          type: string
          description: Date and time of when the group was created
          format: date-time
          readOnly: true
        enterprise:
          title: Enterprise
          type: string
          description: Enterprise url
          format: url
          readOnly: true
        parent:
          title: Parent
          type: string
          description: Parent group id
          format: uuid
        device_ids:
          title: Device ids
          uniqueItems: true
          type: array
          description: Devices ids
          items:
            type: string
            format: uuid
        device_count:
          title: Device count
          type: integer
          readOnly: true
        path:
          title: Path
          type: string
          description: Path of the group
          readOnly: true
        children_count:
          title: Children Count
          type: integer
          description: Count of child groups
          readOnly: true
    esper_cloud_api_DeviceGroupPartialUpdate:
      type: object
      properties:
        id:
          title: Id
          type: string
          description: Group id
          format: uuid
          readOnly: true
        name:
          title: Name
          type: string
          description: Group name
        created_on:
          title: Created on
          type: string
          description: Date and time of when the group was created
          format: date-time
          readOnly: true
        enterprise:
          title: Enterprise
          type: string
          description: Enterprise url
          format: url
          readOnly: true
        parent:
          title: Parent
          type: string
          description: Parent group id
          format: uuid
        device_ids:
          title: Device ids
          uniqueItems: true
          type: array
          description: Device ids
          items:
            type: string
            format: uuid
        device_count:
          title: Device count
          type: integer
          description: Count of devices in the group
          readOnly: true
        path:
          title: Path
          type: string
          description: Path of the group
          readOnly: true
        children_count:
          title: Children Count
          type: integer
          description: Count of child groups
          readOnly: true
    esper_cloud_api_GroupThumbnail:
      type: object
      properties:
        id:
          type: string
          format: uuid
          readOnly: true
        image_file:
          type: string
          readOnly: true
        thumbnail_url:
          type: string
          readOnly: true
        created_on:
          type: string
          format: date-time
          readOnly: true
    esper_cloud_api_DeviceSubGroup:
      type: object
      properties:
        subgroups:
          type: array
          items:
            type: string
            format: uuid
    esper_cloud_api_EnterprisePolicyData:
      title: Policy Data
      type: object
      properties:
        keyguardDisabled:
          type: boolean
          description: Should KeyGuard be disabled?
        safeBootDisabled:
          type: boolean
          description: Should SafeBoot be disabled?
        statusBarDisabled:
          type: boolean
          description: Should Status Bar be disabled?
        factoryResetDisabled:
          type: boolean
          description: Should Factory Reset be disabled?
        screenshotDisabled:
          type: boolean
          description: Should Screenshot capability be disabled?
        usbConnectivityDisabled:
          type: boolean
          description: Should USB connectivity be disabled?
        smsDisabled:
          type: boolean
          description: Should SMS functionality be disabled?
        outgoingCallsDisabled:
          type: boolean
          description: Should Outgoing Calls be disabled?
        cameraDisabled:
          type: boolean
          description: Should Camera be disabled?
        nfcBeamDisabled:
          type: boolean
          description: Should NFC capability be disabled?
        disablePlayStore:
          type: boolean
          description: Should Google Play Store be disabled on the device?
        usbFileTransferDisabled:
          type: boolean
          description: Should USB File transfer capability be disabled?
        tetheringDisabled:
          type: boolean
          description: Should USB Tethering capability be enabled?
        dateTimeConfigDisabled:
          type: boolean
          description: Should Date/Time configuration capability be disabled?
        appUninstallDisabled:
          type: boolean
          description: Should App uninstall capability be disabled?
        googleAssistantDisabled:
          type: boolean
          description: Should Google Assistant feature be disabled?
        disableLocalAppInstall:
          type: boolean
          description: Should Side-loading of Applications be disabled?
        adbDisabled:
          type: boolean
          description: Should Android Debugger be disabled?
        phonePolicy:
          type: object
          properties:
            incomingNumbers:
              type: array
              description: List of permitted incoming phone numbers to recieve calls from
              items:
                maxLength: 15
                type: string
            outgoingNumbers:
              type: array
              description: List of permitted outgoing phone numbers to make calls to
              items:
                maxLength: 15
                type: string
            dialer:
              type: string
              description: Pick a dialer - System default or Esper Dialer
              enum:
                - DEFAULT
                - SHOONYA
            allowUssdCodes:
              type: boolean
              default: false
              description: Allow USSD codes to be dialed. Default is false
          description: Rules regarding restricting calls from/to phone-numbers
        frpGoogles:
          type: array
          description: >-
            Details regarding Factory Reset Protection capability. List of
            permitted Google People IDs, emails and such
          items:
            type: object
            properties:
              type:
                type: string
                description: Type of User account provided - USER or ADMIN
                enum:
                  - USER
                  - ADMIN
              email:
                type: string
                description: >-
                  Email id to be used for Factory protection. This will be asked
                  on the Device's UI
                format: email
              googleId:
                type: string
                description: >-
                  Google People ID associated with the above email
                  (https://developers.google.com/people/api/rest/v1/people/get)
        googleAccountPermission:
          type: object
          properties:
            maxAccount:
              type: integer
              description: >-
                Maximum number of Google accounts to be associated with this
                device. (Max = 10)
            emails:
              type: array
              description: List of emails to be associated
              items:
                type: string
                format: email
            domains:
              type: array
              description: List of domains that can be associated
              items:
                type: string
          description: Details regarding Google accounts to be associated with the device
        devicePasswordPolicy:
          type: object
          properties:
            passwordQuality:
              type: string
              description: What is the type of password quality to apply to the device?
              enum:
                - PASSWORD_QUALITY_ALPHABETIC
                - PASSWORD_QUALITY_ALPHANUMERIC
                - PASSWORD_QUALITY_BIOMETRIC_WEAK
                - PASSWORD_QUALITY_COMPLEX
                - PASSWORD_QUALITY_NUMERIC
                - PASSWORD_QUALITY_NUMERIC_COMPLEX
                - PASSWORD_QUALITY_SOMETHING
                - PASSWORD_QUALITY_UNSPECIFIED
          description: Define the Password Policy for the device
        minimumPasswordLength:
          minimum: 4
          type: integer
          description: What is the minimum length for your device's password
        permissionPolicy:
          type: string
          description: >-
            What permission should be applied by default for all apps,
            henceforth?
          enum:
            - PERMISSION_POLICY_PROMPT
            - PERMISSION_POLICY_AUTO_GRANT
            - PERMISSION_POLICY_AUTO_DENY
        deviceUpdatePolicy:
          type: object
          properties:
            type:
              type: string
              description: What type of installation is preferred?
              enum:
                - TYPE_INSTALL_AUTOMATIC
                - TYPE_POSTPONE
                - TYPE_INSTALL_WINDOWED
                - TYPE_INSTALL_DISABLED
            maintenanceStart:
              type: integer
              description: >-
                If the `type` is `TYPE_INSTALL_WINDOWED`, when should the
                maintenance start?
            maintenanceEnd:
              type: integer
              description: >-
                If the `type` is `TYPE_INSTALL_WINDOWED`, when should the
                maintenance end?
          description: Configuration regarding Device OS Updates
        settingsAccessLevel:
          type: string
          description: >-
            Type of Android settings app to be applied? Default System Settings
            or ESPER Settings App?
          enum:
            - SYSTEM
            - SHOONYA
            - NONE
        settingsAppPassword:
          type: string
          description: Lock Password (optional) for the ESPER Settings app
          format: password
    esper_cloud_api_EnterprisePolicy:
      required:
        - enterprise
        - name
        - policy
      type: object
      properties:
        uuid:
          title: UUID
          type: string
          description: Unique Policy identifier
          format: uuid
          readOnly: true
        enterprise:
          title: Enterprise url
          type: string
          description: Url of the enterprise resource
          format: url
        url:
          title: Policy URL
          type: string
          description: URL link to policy
          format: url
          readOnly: true
        name:
          title: Policy Name
          type: string
          description: Name of the Policy
        description:
          title: Policy Description
          type: string
          description: Details regarding the Policy
        device_count:
          title: Number of Devices with this policy applied
          type: integer
          description: Count of Devices with this policy applied
          readOnly: true
        google_policy_id:
          title: Google policy id
          type: string
          description: Id of the Google policy
          readOnly: true
        policy:
          $ref: '#/components/schemas/esper_cloud_api_EnterprisePolicyData'
        updated_on:
          title: Updated On
          type: string
          description: Last-Updated Timestamp of Policy
          format: date-time
          readOnly: true
        created_on:
          title: Created on
          type: string
          description: Creation Timestamp of Policy
          format: date-time
          readOnly: true
        is_active:
          title: Policy Active status
          type: boolean
          description: Is this policy currently active
    esper_cloud_api_EnterprisePolicyPartialUpdate:
      type: object
      properties:
        uuid:
          title: UUID
          type: string
          description: Unique Policy identifier
          format: uuid
          readOnly: true
        enterprise:
          title: Enterprise url
          type: string
          description: Url of the enterprise resource
          format: url
        url:
          title: Policy URL
          type: string
          description: URL link to policy
          format: url
          readOnly: true
        name:
          title: Policy Name
          type: string
          description: Name of the Policy
        description:
          title: Policy Description
          type: string
          description: Details regarding the Policy
        device_count:
          title: Number of Devices with this policy applied
          type: integer
          description: Count of Devices with this policy applied
          readOnly: true
        policy:
          $ref: '#/components/schemas/esper_cloud_api_EnterprisePolicyData'
        updated_on:
          title: Updated On
          type: string
          description: Last-Updated Timestamp of Policy
          format: date-time
          readOnly: true
        created_on:
          title: Created on
          type: string
          description: Creation Timestamp of Policy
          format: date-time
          readOnly: true
        is_active:
          title: Policy Active status
          type: boolean
          description: Is this policy currently active
        google_policy_id:
          title: Google policy id
          type: string
          description: Id of the Google policy
          readOnly: true
    esper_cloud_api_V0CommandStatus1:
      type: object
      properties:
        id:
          title: Id
          type: string
          description: Unique command identifier
          format: uuid
          readOnly: true
        request:
          title: Request Id
          type: string
          description: Request Id associated with this command
          format: uuid
          readOnly: true
        device:
          title: AndroidDevice
          type: string
          description: Device associated with this command
          format: url
          readOnly: true
        state:
          type: string
          description: Current state of the command
          enum:
            - Command Queued
            - Command Initiated
            - Command Acknowledged
            - Command In Progress
            - Command TimeOut
            - Command Success
            - Command Failure
            - Command Scheduled
            - Command Cancelled
        reason:
          type: string
          description: details briefing the reason for current command state
        created_on:
          title: Created on
          type: string
          description: Timestamp of command creation
          format: date-time
          readOnly: true
        updated_on:
          title: Updated on
          type: string
          description: Last updated timestamp of command
          format: date-time
          readOnly: true
        meta:
          type: object
          properties:
            device:
              type: object
              properties:
                id:
                  type: string
                  format: uuid
                device_name:
                  type: string
                alias_name:
                  type: string
                  nullable: true
                timezone_string:
                  type: string
                  nullable: true
                tags:
                  type: array
                  items:
                    type: string
                  nullable: true
                  description: Tags associated with the device
                managed_by:
                  type: string
                  enum:
                    - BLUEPRINT
                    - TEMPLATE
                  description: >-
                    Indicates whether the device is managed by a Blueprint or
                    Template
    esper_cloud_api_Content:
      required:
        - id
      type: object
      properties:
        id:
          title: Id
          type: integer
          description: Unique content Identifier
          readOnly: true
        download_url:
          title: Content download URL
          type: string
          description: URL to download the content
          format: url
        name:
          title: Name
          type: string
          description: Name of the content
        key:
          title: Key
          maxLength: 255
          minLength: 1
          type: string
        is_dir:
          title: Is Directory
          type: boolean
          default: false
        kind:
          title: Content kind
          maxLength: 255
          type: string
          description: The mime type of the content
          nullable: true
        hash:
          title: Content Hash
          type: string
          description: Hash string of the content
        size:
          title: Content Size
          maxLength: 255
          type: string
          description: Size of the content in bytes
        path:
          title: Path
          type: string
          description: Path to the content
        permissions:
          title: Permissions
          type: string
          description: The permssion string for the content
        tags:
          title: Content tags
          type: array
          description: Tags for the content
          items:
            maxLength: 255
            type: string
        description:
          title: Content description
          type: string
          description: Description for the content
          nullable: true
        created:
          title: Created on
          type: string
          format: date-time
          readOnly: true
        modified:
          title: Modified on
          type: string
          format: date-time
          readOnly: true
        enterprise:
          title: Enterprise
          type: string
          description: URL of the enterprise resource
          format: url
        owner:
          title: Owner
          type: object
          properties:
            id:
              type: integer
            username:
              type: string
          description: Owner of the content
    esper_cloud_api_AlertChannelsV1:
      type: object
      properties:
        id:
          type: integer
        properties:
          type: object
          properties:
            to_address:
              type: string
              format: email
        name:
          type: string
        type:
          type: string
          description: format of alert. e.g. email
        created_on:
          type: string
          format: date-time
        updated_on:
          type: string
          format: date-time
        enterprise:
          type: string
          format: uuid
        linked_alerts:
          type: array
          items:
            type: string
    esper_cloud_api_UpdateAlertChannelsV1:
      type: object
      properties:
        id:
          type: integer
        properties:
          type: object
          properties:
            to_address:
              type: string
              format: email
        name:
          type: string
        type:
          type: string
          description: format of alert. e.g. email
        created_on:
          type: string
          format: date-time
        updated_on:
          type: string
          format: date-time
        enterprise:
          type: string
          format: uuid
    esper_cloud_api_AlarmRule:
      type: object
      properties:
        id:
          type: string
          format: uuid
        enterprise:
          type: string
          format: uuid
        devices:
          properties:
            id:
              type: string
              format: uuid
            device_name:
              type: string
            alias_name:
              type: string
              nullable: true
        groups:
          type: array
          items:
            type: string
        name:
          type: string
        description:
          type: string
        metric:
          type: string
        conditions:
          properties:
            value:
              type: number
              format: double
            unit:
              type: string
            comparator:
              type: string
            toggle_state:
              type: boolean
        action_emails:
          type: array
          items:
            type: string
            format: email
        actions:
          type: array
          items:
            type: string
        alert_channels:
          type: array
          items:
            type: string
        created_on:
          type: string
          format: date-time
        updated_on:
          type: string
          format: date-time
        is_active:
          type: boolean
        realert_interval:
          type: integer
        repeat_times:
          type: integer
        trigger_count:
          type: integer
        daily_trigger_count:
          type: integer
    esper_cloud_api_UpdateAlarmRule:
      type: object
      required:
        - enterprise
        - name
        - metric
        - conditions
        - realert_interval
      properties:
        id:
          type: string
          format: uuid
        enterprise:
          type: string
          format: uuid
        devices:
          type: array
          items:
            format: string
        groups:
          type: array
          items:
            type: string
        name:
          type: string
        description:
          type: string
        metric:
          type: string
        conditions:
          properties:
            value:
              type: number
              format: double
            unit:
              type: string
            comparator:
              type: string
            toggle_state:
              type: boolean
        action_emails:
          type: array
          items:
            type: string
            format: email
        actions:
          type: array
          items:
            type: string
        alert_channels:
          type: array
          items:
            type: string
        created_on:
          type: string
          format: date-time
        updated_on:
          type: string
          format: date-time
        is_active:
          type: boolean
        realert_interval:
          type: integer
        repeat_times:
          type: integer
        trigger_count:
          type: integer
        daily_trigger_count:
          type: integer
    esper_cloud_api_AlarmHistory:
      type: object
      properties:
        device_name:
          type: string
        device_id:
          type: string
          format: uuid
        group_id:
          type: array
          items:
            format: string
          description: lists group id's in uuid format
        group_name:
          type: string
        alert_time:
          type: string
          format: date-time
        latest_seen:
          type: string
          format: date-time
    esper_cloud_api_Wallpaper:
      type: object
      properties:
        id:
          type: string
          format: uuid
        enterprise:
          type: string
          format: uuid
        image_file:
          type: string
          format: url
        thumbnail:
          type: string
          format: url
        orientation:
          type: string
        is_active:
          type: boolean
        created_on:
          type: string
          format: date-time
        updated_on:
          type: string
          format: date-time
    esper_cloud_api_TileIcon:
      type: object
      properties:
        id:
          type: string
          format: uuid
        category:
          type: string
        icon_file:
          type: string
          format: url
        device_model:
          type: string
        custom:
          type: boolean
        created_on:
          type: string
          format: date-time
        updated_on:
          type: string
          format: date-time
    esper_cloud_api_ApplyTileIcon:
      type: object
      properties:
        icon:
          type: string
          format: uuid
          nullable: true
        apply_mode:
          type: string
          enum:
            - devices
            - all_devices
            - groups
            - device_model
          default: devices
        device_model:
          type: string
          nullable: true
        devices:
          type: array
          items:
            format: string
        groups:
          type: array
          items:
            type: string
    esper_cloud_api_DeviceLocations:
      type: object
      properties:
        id:
          type: integer
        latitude:
          type: number
          format: double
        longitude:
          type: number
          format: double
        altitude:
          type: number
          format: double
        city:
          type: string
        status:
          type: string
        country:
          type: string
        zipcode:
          type: integer
        last_updated_on:
          type: string
          format: date-time
        device:
          type: string
          format: url
        enterprise:
          type: string
          format: url
    esper_cloud_api_SecurityStatesEnum:
      type: integer
      format: int32
      description: |
        Following are the Security States and their description

        ```
          * 1 = SECURE
          * 10 = LOW_RISK
          * 20 = MEDIUM_RISK
          * 30 = HIGH_RISK
          * 100 = DEVICE_STATE_UNSPECIFIED
        ```
      enum:
        - 1
        - 10
        - 20
        - 30
        - 100
    esper_cloud_api_DeviceTiles:
      type: object
      properties:
        id:
          type: integer
        device:
          type: object
          properties:
            id:
              type: string
              format: uuid
            groups:
              type: array
              items:
                type: object
                properties:
                  id:
                    type: string
                    format: uuid
                  name:
                    type: string
                  url:
                    type: string
                    format: url
            device_name:
              type: string
            state:
              type: integer
            tags:
              type: string
              nullable: true
            device_type:
              type: string
            serial:
              type: string
            imeis:
              type: object
            android_version:
              type: integer
            eea_version:
              type: string
            manufacturer:
              type: string
            api_level:
              type: integer
            template_name:
              type: string
            dpc_version:
              type: string
            alias_name:
              type: string
            provisioned_on:
              type: string
              format: date-time
            geofence_id:
              type: string
              format: uuid
        network_info:
          type: object
          properties:
            __faust:
              type: object
              properties:
                ns:
                  type: string
            mobileIPv4:
              type: string
              nullable: true
            mobileIPv6:
              type: string
              nullable: true
            networkType:
              type: string
              nullable: true
            numberOfSim:
              type: integer
            simOperator:
              type: array
              items:
                type: string
            signalStrength:
              type: string
              nullable: true
            networkOperator:
              type: array
              items:
                type: string
            mobileNetworkStatus:
              type: string
            currentActiveConnection:
              type: string
        model:
          type: string
        location:
          type: object
          nullable: true
        battery_level:
          type: number
          format: double
        security_state:
          type: string
        security_reason:
          type: string
        security_advise:
          type: string
        wifi_ssid:
          type: string
          nullable: true
        updated_on:
          type: string
          format: date-time
        created_on:
          type: string
          format: date-time
        is_active:
          type: boolean
        is_gms:
          type: boolean
        status_id:
          type: integer
          nullable: true
        serial_no:
          type: string
        android_version:
          type: integer
        eea_version:
          type: string
        dpc_version:
          type: string
        location_city:
          type: string
        network_type:
          type: string
        enterprise:
          type: string
          format: url
        icon:
          type: string
          nullable: true
    esper_cloud_api_StatusMetrics:
      type: object
      properties:
        active:
          type: integer
        in_active:
          type: integer
        low_risk:
          type: integer
        high_risk:
          type: integer
        medium_risk:
          type: integer
        secure:
          type: integer
        low_battery:
          type: integer
        under_provisioning:
          type: integer
        recently_added:
          type: integer
        unspecified:
          type: integer
        total_devices_under_risk:
          type: integer
    esper_cloud_api_DeviceStatusReport:
      type: object
      properties:
        device_id:
          type: string
          format: uuid
        device_name:
          type: string
        alias_name:
          type: string
          nullable: true
        device_model:
          type: string
        device_brand:
          type: string
        android_version:
          type: string
        serial_number:
          type: string
        is_new:
          type: boolean
        last_known_location:
          type: string
        days_active:
          type: integer
        status:
          type: string
          description: choices- ACTIVE / INACTIVE / DISABLED
        inactive_since_three_days:
          type: boolean
    esper_cloud_api_GroupReport:
      type: object
      properties:
        group_id:
          type: string
          format: uuid
        group_name:
          type: string
        group_path:
          type: string
        active_devices:
          type: integer
        inactive_devices:
          type: integer
        registered_devices:
          type: integer
        new_devices:
          type: integer
        disabled_devices:
          type: integer
    esper_cloud_api_Subscription:
      type: object
      properties:
        id:
          type: integer
        email_ids:
          type: array
          items:
            type: string
            format: email
        is_subscribed:
          type: boolean
        created_on:
          type: string
          format: date-time
        updated_on:
          type: string
          format: date-time
    esper_cloud_api_StatusMetricsV2:
      type: object
      properties:
        last_seen:
          type: object
          properties:
            less_than_30_minutes:
              type: integer
            less_than_1_day:
              type: integer
            greater_than_1_day:
              type: integer
        low_risk:
          type: integer
        high_risk:
          type: integer
        medium_risk:
          type: integer
        secure:
          type: integer
        low_battery:
          type: integer
        under_provisioning:
          type: integer
        recently_added:
          type: integer
        unspecified:
          type: integer
        total_devices_under_risk:
          type: integer
    esper_cloud_api_TokenRenewV0:
      type: object
      properties:
        id:
          title: Token id
          type: string
          description: Id of the token
          format: integer
          readOnly: true
        user:
          title: User id
          type: string
          description: Id of the user resource
          readOnly: true
        enterprise:
          title: Enterprise id
          type: string
          description: Id of the enterprise resource
          format: uuid
          readOnly: true
        token:
          title: API Token
          type: string
          description: API token for accessing esper APIs
          readOnly: true
        expires_at:
          title: API token expiry
          type: string
          description: Date and time of when your API token will get expired
          format: date-time
          readOnly: true
        developerapp:
          title: Developer app id
          type: string
          description: >-
            Id of the developer app resource that you created using the esper
            dev console
          format: uuid
          readOnly: true
        scope:
          title: Scope of API token
          type: string
          description: This defines what access scopes your API token has
          readOnly: true
        created_on:
          title: Created on
          type: string
          description: Date and time of when this resource was created
          format: date-time
          readOnly: true
        updated_on:
          title: Updated on
          type: string
          description: Date and time of when this resource was updated
          format: date-time
          readOnly: true
    esper_cloud_api_V0CommandStatus:
      type: object
      properties:
        id:
          title: Id
          type: string
          description: Unique command identifier
          format: uuid
          readOnly: true
        request:
          title: Request Id
          type: string
          description: Request Id associated with this command
          format: uuid
          readOnly: true
        command:
          title: info about the command
          type: string
        command_args:
          type: object
          description: arguments in command
        issued_by:
          type: object
          properties:
            id:
              type: integer
            username:
              type: string
        device:
          title: AndroidDevice
          type: string
          description: Device associated with this command
          format: url
          readOnly: true
        state:
          type: string
          description: Current state of the command
          enum:
            - Command Queued
            - Command Initiated
            - Command Acknowledged
            - Command In Progress
            - Command TimeOut
            - Command Success
            - Command Failure
            - Command Scheduled
            - Command Cancelled
        reason:
          type: string
          description: details briefing the reason for current command state
        requeue_value:
          type: integer
          description: >-
            indicates the command's requeue count for the device, which is
            limited to a maximum of 3 retries.
        created_on:
          title: Created on
          type: string
          description: Timestamp of command creation
          format: date-time
          readOnly: true
        updated_on:
          title: Updated on
          type: string
          description: Last updated timestamp of command
          format: date-time
          readOnly: true
    esper_cloud_api_Geofence:
      required:
        - latitude
        - longitude
        - name
      type: object
      properties:
        id:
          title: Geofence id
          type: string
          description: id of the geofence
          format: uuid
          readOnly: true
        name:
          title: Geofence name
          type: string
          description: Name of the geofence
        description:
          title: Geofence description
          type: string
          description: A description about the geofence
        enterprise:
          title: Enterprise id
          type: string
          description: id of the enterprise resource
          format: uuid
          readOnly: true
        latitude:
          title: Geofence latitude
          type: string
          description: Latitude corresponding to the geofence
          format: decimal
        longitude:
          title: Geofence longitude
          type: string
          description: Longitude corresponding to the geofence
          format: decimal
        radius:
          title: Geofence radius
          type: integer
          description: The radius within which the geofence should be applied
        radius_unit:
          title: Unit of radius
          type: string
          description: The unit in which the radius is taken, eg - kilometers, meters etc
          enum:
            - KILOMETERS
            - METERS
            - MILES
        device_actions:
          title: Device Actions
          type: array
          description: The actions to be performed on the device
          items:
            type: string
            enum:
              - LOCK_DOWN
              - BEEP
        device_count:
          title: Device count
          type: integer
          description: Number of devices
          readOnly: true
        created_by:
          title: Created by
          type: string
          description: The user who created the geofence
          readOnly: true
        created_on:
          title: Creation date and time
          type: string
          description: Date and time of when the geofence was created
          format: date-time
          readOnly: true
        updated_on:
          title: Updation date and time
          type: string
          description: Date and time of when the geofence was updated
          format: date-time
          readOnly: true
    esper_cloud_api_GeofenceUpdate:
      type: object
      properties:
        name:
          title: Geofence name
          type: string
          description: Name of the geofence
        description:
          title: Geofence description
          type: string
          description: A description about the geofence
        latitude:
          title: Geofence latitude
          type: string
          description: Latitude corresponding to the geofence
          format: decimal
        longitude:
          title: Geofence longitude
          type: string
          description: Longitude corresponding to the geofence
          format: decimal
        radius:
          title: Geofence radius
          type: integer
          description: The radius within which the geofence should be applied
        radius_unit:
          title: Unit of radius
          type: string
          description: The unit in which the radius is taken, eg - kilometers, meters etc
          enum:
            - KILOMETERS
            - METERS
            - MILES
        device_actions:
          title: Device Actions
          type: array
          description: The actions to be performed on the device
          items:
            type: string
            enum:
              - LOCK_DOWN
              - BEEP
    esper_cloud_api_GeofenceCreate:
      type: object
      properties:
        name:
          title: Geofence name
          type: string
          description: Name of the geofence
        description:
          title: Geofence description
          type: string
          description: A description about the geofence
        latitude:
          title: Geofence latitude
          type: string
          description: Latitude corresponding to the geofence
          format: decimal
        longitude:
          title: Geofence longitude
          type: string
          description: Longitude corresponding to the geofence
          format: decimal
        radius:
          title: Geofence radius
          type: integer
          description: The radius within which the geofence should be applied
        radius_unit:
          title: Unit of radius
          type: string
          description: The unit in which the radius is taken, eg - kilometers, meters etc
          enum:
            - KILOMETERS
            - METERS
            - MILES
        device_actions:
          title: Device Actions
          type: array
          description: The actions to be performed on the device
          items:
            type: string
            enum:
              - LOCK_DOWN
              - BEEP
        devices:
          title: List of device ids
          type: array
          description: List of ids of devices on which the geofence is to be applied
          items:
            type: string
    esper_cloud_api_EnterpriseV1:
      required:
        - id
        - name
        - short_code
      type: object
      properties:
        id:
          title: Id
          type: string
          description: Id of the enterprise
          format: uuid
          readOnly: true
        name:
          title: Name
          maxLength: 255
          minLength: 1
          type: string
          description: Name of the enterprise
        short_code:
          title: Short code
          maxLength: 10
          minLength: 1
          type: string
          description: >-
            A short 10-char representation of the enterprise, separated by
            hyphens. Field is optional, as system will auto-generate a value if
            none is provided.
          readOnly: true
        registered_name:
          title: Registered name of the enterprise
          maxLength: 255
          minLength: 1
          type: string
          description: Registered Name of the enterprise
        registered_address:
          title: Registered address
          maxLength: 255
          minLength: 1
          type: string
          description: Registered address of the enterprise.
        location:
          title: Enterprise location
          maxLength: 255
          minLength: 1
          type: string
          description: City, State, Country location of the enterprise
        zipcode:
          title: Enterprise zipcode
          maxLength: 8
          minLength: 1
          type: string
          description: Zip code of enterprise location
        contact_person:
          title: Contact person
          maxLength: 255
          minLength: 1
          type: string
          description: Person who is the point of contact for the enterprise
          nullable: true
        contact_number:
          title: Contact number
          maxLength: 20
          minLength: 1
          type: string
          description: Contact number of the enterprise
          nullable: true
        contact_email:
          title: Contact email
          maxLength: 254
          minLength: 1
          type: string
          description: Contact email address of the enterprise
          format: email
        wifi_lte_toggle_flag:
          title: Enable data saver mode
          type: boolean
          description: Will only be available if feature is enabled
        emm:
          title: Google EMM
          type: object
          properties:
            google_enterprise_id:
              type: string
          description: >-
            This field will have details about emm enrollment if the enterprise
            is emm enrolled
          nullable: true
          readOnly: true
        created_on:
          title: Created on
          type: string
          description: Date and time of when this resource was created
          format: date-time
          readOnly: true
        updated_on:
          title: Updated on
          type: string
          description: Date and time of when this resource was updated
          format: date-time
          readOnly: true
    esper_cloud_api_EnterpriseUpdateV1:
      type: object
      properties:
        id:
          title: Id
          type: string
          description: Id of the enterprise
          format: uuid
          readOnly: true
        name:
          title: Enterprise Name
          maxLength: 255
          minLength: 1
          type: string
          description: Name of the enterprise
        registered_name:
          title: Registered name
          maxLength: 255
          minLength: 1
          type: string
          description: Registered Name of the enterprise
        registered_address:
          title: Registered address
          maxLength: 255
          minLength: 1
          type: string
          description: Registered address of the enterprise.
        location:
          title: Enterprise location
          maxLength: 255
          minLength: 1
          type: string
          description: City, State, Country location of the enterprise
        zipcode:
          title: Enterprise zipcode
          maxLength: 8
          minLength: 1
          type: string
          description: Description of the enterprise
        contact_person:
          title: Contact person
          maxLength: 255
          minLength: 1
          type: string
          description: Person who is the point of contact for the enterprise
          nullable: true
        contact_number:
          title: Contact number
          maxLength: 20
          minLength: 1
          type: string
          description: Contact number of the enterprise
          nullable: true
        contact_email:
          title: Contact email
          maxLength: 254
          minLength: 1
          type: string
          description: Contact email address of the enterprise
          format: email
        wifi_lte_toggle_flag:
          title: Enable data saver mode
          type: boolean
          description: Will only be available if feature is enabled
    esper_cloud_api_ApplicationVersionV1:
      title: Application Version V1
      type: object
      properties:
        id:
          title: Id
          type: string
          format: uuid
          readOnly: true
        version_code:
          title: Version code
          maxLength: 50
          minLength: 1
          type: string
        build_number:
          title: Build number
          maxLength: 100
          minLength: 1
          type: string
          nullable: true
        hash_string:
          title: Hash string
          type: string
        min_sdk_version:
          title: Min sdk version
          maxLength: 10
          minLength: 1
          type: string
          nullable: true
        target_sdk_version:
          title: Target sdk version
          maxLength: 10
          minLength: 1
          type: string
          nullable: true
        icon_url:
          title: Url for the icon
          type: string
          format: url
        release_name:
          title: Name of the release
          type: string
    esper_cloud_api_ApplicationV1:
      required:
        - application_name
        - enterprise
        - package_name
      type: object
      properties:
        id:
          title: Id
          type: string
          format: uuid
          readOnly: true
        latest_version:
          $ref: '#/components/schemas/esper_cloud_api_ApplicationVersionV1'
        application_name:
          title: Application name
          maxLength: 255
          minLength: 1
          type: string
        package_name:
          title: Package name
          maxLength: 255
          minLength: 1
          type: string
          readOnly: true
        is_hidden:
          title: Is hidden
          type: boolean
        enterprise:
          title: Enterprise
          type: string
          format: url
    esper_cloud_api_AppVersionV1:
      title: Application Version V1
      required:
        - enterprise
        - version_code
      type: object
      properties:
        id:
          title: Id
          type: string
          format: uuid
          readOnly: true
        installed_count:
          title: Installed count
          type: integer
          readOnly: true
        is_g_play:
          title: Is google play
          type: boolean
        app_file:
          title: App file url
          type: string
          format: url
          nullable: true
        app_icon:
          title: App icon url
          type: string
          format: url
          nullable: true
        version_code:
          title: Version code
          maxLength: 50
          minLength: 1
          type: string
          nullable: true
        build_number:
          title: Build number
          maxLength: 100
          minLength: 1
          type: string
          nullable: true
        min_sdk_version:
          title: Minimum sdk version
          maxLength: 10
          minLength: 1
          type: string
          nullable: true
        enterprise:
          title: Enterprise URL
          type: string
          format: url
        application:
          title: Application URL
          type: string
          format: url
        release_name:
          title: Name of the release
          maxLength: 255
          type: string
          nullable: true
        release_comments:
          title: Release comments
          type: string
          nullable: true
        approval_status:
          title: Approval Status
          maxLength: 50
          type: string
          default: APPROVED
          enum:
            - AVAILABLE
            - ACCEPTED
            - APPROVED
            - REJECTED
        release_date:
          title: Release date
          type: string
          format: date-time
        size_in_mb:
          title: Size in mb
          type: number
        is_default:
          title: Is default
          type: boolean
          default: false
        created_on:
          title: Created on
          type: string
          format: date-time
          readOnly: true
    esper_cloud_api_TokenInfoV1:
      required:
        - enterprise
        - id
      type: object
      properties:
        id:
          title: Id
          type: string
          description: Token id
          format: integer
          readOnly: true
        enterprise:
          title: Enterprise id
          type: string
          description: Id of the enterprise resource
          format: uuid
          readOnly: true
        user:
          title: User id
          type: string
          description: Id of the user resource
          readOnly: true
        developer_app:
          title: Developer app id
          type: string
          description: >-
            Id of the developer app resource that you created using the esper
            dev console
          format: uuid
          readOnly: true
        source_refresh_token:
          title: Refresh token
          type: string
          description: The refresh token is used to refresh your expired API token
          readOnly: true
        token:
          title: API Token
          type: string
          description: API token for accessing esper APIs
          readOnly: true
        expires_on:
          title: API token expiry
          type: string
          description: Date and time of when your API token will get expired
          format: date-time
          readOnly: true
        scope:
          title: Scope of API token
          type: array
          description: This defines what access scopes does your API token has
          readOnly: true
          items:
            type: string
        created_on:
          title: Created on
          type: string
          description: Date and time of when this resource was created
          format: date-time
          readOnly: true
        updated_on:
          title: Updated on
          type: string
          description: Date and time of when this resource was updated
          format: date-time
          readOnly: true
    esper_cloud_api_Group:
      type: object
      properties:
        id:
          title: ID
          type: string
          format: uuid
        name:
          title: Group Name
          type: string
        path:
          title: Group Path
          type: string
        device_count:
          type: integer
    esper_cloud_api_UserProfile:
      title: UserProfileInfo
      type: object
      properties:
        id:
          title: ID
          type: integer
        enterprise_user_id:
          title: Enterprise User ID
          type: string
        authn_user_id:
          title: AuthN User ID
          type: string
          format: uuid
        authn_connection_id:
          title: AuthN Connection ID
          type: string
          format: uuid
        authz_role_id:
          title: AuthZ Role ID
          type: string
          format: uuid
        role:
          title: Role
          type: string
          enum:
            - Shoonya Admin
            - Enterprise Admin
            - Enterprise User
            - Viewer
            - Group Admin
            - Group Viewer
        enterprise:
          title: Enterprise ID
          type: string
          format: uuid
        is_customer:
          title: Is Customer
          type: boolean
        is_endpoint_creator:
          title: Is Endpoint Creator
          type: boolean
        created_on:
          title: Created On
          type: string
          format: date-time
        updated_on:
          title: Updated On
          type: string
          format: date-time
        setup_wizard_complete:
          title: Setup Wizard Complete
          type: boolean
        default_password_changed:
          title: Default Password Changed
          type: boolean
        is_developer:
          title: Is Developer
          type: boolean
        can_factory_reset:
          title: Can Factory Reset
          type: boolean
        groups:
          title: Groups
          type: array
          items:
            type: object
            $ref: '#/components/schemas/esper_cloud_api_Group'
    esper_cloud_api_AuthenticationToken:
      title: AuthenticationToken
      type: object
      properties:
        id:
          title: ID
          type: integer
        token:
          title: Token
          type: string
        is_active:
          title: Is Active
          type: boolean
        updated_on:
          title: Updated On
          type: string
          format: date-time
    esper_cloud_api_EMM:
      title: UserEMM
      type: object
      properties:
        id:
          title: ID
          type: integer
        user:
          title: User ID
          type: integer
        account_identifier:
          title: Account Identifier
          type: string
        account_type:
          title: Account Type
          type: string
        display_name:
          title: Display Name
          type: string
        google_user_id:
          title: Google User ID
          type: string
        google_enterprise:
          title: Google Enterprise
          type: integer
        is_active:
          title: Is Active
          type: boolean
        created_on:
          title: Created On
          type: string
          format: date-time
        updated_on:
          title: Updated On
          type: string
          format: date-time
        authentication_token:
          title: Authentication Token
          type: object
          $ref: '#/components/schemas/esper_cloud_api_AuthenticationToken'
          readOnly: true
    esper_cloud_api_User:
      title: UserInfo
      type: object
      properties:
        id:
          title: ID
          type: integer
        username:
          title: User name
          type: string
        email:
          title: Email
          type: string
          format: email
        first_name:
          title: First name
          type: string
        last_name:
          title: Last name
          type: string
        full_name:
          title: Last name
          type: string
        is_staff:
          type: boolean
          readOnly: true
        is_superuser:
          type: boolean
          readOnly: true
        is_active:
          title: Is user active
          type: boolean
        profile:
          title: User Profile
          type: object
          $ref: '#/components/schemas/esper_cloud_api_UserProfile'
        emm:
          title: EMM details
          type: object
          $ref: '#/components/schemas/esper_cloud_api_EMM'
          readOnly: true
        last_login:
          title: Last login
          type: string
        token:
          title: Token
          type: string
        has_emm:
          title: Has EMM
          type: boolean
        is_email_verified:
          title: Is Email Verified
          type: boolean
    esper_cloud_api_TenantUserInviteResponse:
      title: TenantUserInviteResponse
      type: object
      properties:
        id:
          title: id
          type: string
        email:
          title: email
          type: string
          format: email
        tenant_id:
          title: id of the tenant
          type: string
        idp_invite_id:
          title: id of the idp invitation
          type: string
        meta:
          title: meta data of user
          type: object
        connection_id:
          title: connection id
          type: string
        send_invitation_email:
          title: send invitation email
          type: boolean
        created_at:
          title: created at
          type: string
          format: date-time
        updated_at:
          title: updated at
          type: string
          format: date-time
    esper_cloud_api_GenericErrorResponse:
      type: object
      properties:
        status:
          type: integer
          format: int32
          description: Either 'status' or 'code' will be present, but not both.
        code:
          type: integer
          format: int32
          description: Either 'status' or 'code' will be present, but not both.
        error:
          type: string
          description: Either 'error' or 'errors' will be present, but not both.
        errors:
          type: array
          items:
            type: string
          description: Either 'error' or 'errors' will be present, but not both.
        message:
          title: Message describing the error
          type: string
    esper_cloud_api_TenantUserInviteMeta:
      title: TenantUserInviteMeta
      type: object
      properties:
        email:
          title: email
          type: string
          format: email
        profile:
          title: profile details
          type: object
          properties:
            role:
              title: role
              type: string
              enum:
                - Enterprise Admin
                - Viewer
                - Group Admin
                - Group Viewer
                - Support
                - AuthZ Role User
            enterprise:
              title: tenant id
              type: string
              format: uuid
            groups:
              title: >-
                groups associated. required only if role is Group Admin or Group
                Viewer or AuthZ User Role
              type: array
              items:
                type: string
                format: uuid
            authz_role_id:
              title: custom role id. required only if role is AuthZ Role User
              type: string
              format: uuid
          required:
            - role
            - enterprise
      required:
        - email
        - profile
    esper_cloud_api_TenantUserInviteRequest:
      title: TenantUserInviteRequest
      type: object
      properties:
        email:
          title: email
          type: string
          format: email
        meta:
          title: meta data of user
          type: object
          $ref: '#/components/schemas/esper_cloud_api_TenantUserInviteMeta'
        connection_id:
          title: connection id
          type: string
      required:
        - email
        - meta
    esper_cloud_api_TenantUserInviteCreateResponse:
      title: TenantUserInviteResponse
      type: object
      properties:
        id:
          title: id
          type: string
        email:
          title: email
          type: string
          format: email
        tenant_id:
          title: id of the tenant
          type: string
        idp_invite_id:
          title: id of the idp invitation
          type: string
        meta:
          title: meta data of user
          type: object
        connection_id:
          title: connection id
          type: string
        send_invitation_email:
          title: send invitation email
          type: boolean
        invitation_url:
          title: invitation URL
          type: string
        created_at:
          title: created at
          type: string
          format: date-time
        updated_at:
          title: updated at
          type: string
          format: date-time
    esper_cloud_api_UserList:
      title: User
      type: object
      properties:
        id:
          title: ID
          type: integer
        username:
          title: User name
          type: string
        email:
          title: Email
          type: string
          format: email
        first_name:
          title: First name
          type: string
        last_name:
          title: Last name
          type: string
        full_name:
          title: Last name
          type: string
        is_staff:
          type: boolean
          readOnly: true
        is_superuser:
          type: boolean
          readOnly: true
        is_active:
          title: Is user active
          type: boolean
        profile:
          title: User Profile
          type: object
          $ref: '#/components/schemas/esper_cloud_api_UserProfile'
        emm:
          title: EMM details
          type: object
          $ref: '#/components/schemas/esper_cloud_api_EMM'
          readOnly: true
        last_login:
          title: Last login
          type: string
        token:
          title: Token
          type: string
        has_emm:
          title: Has EMM
          type: boolean
    esper_cloud_api_UserProfileCreate:
      title: UserProfile
      type: object
      properties:
        role:
          title: Role
          type: string
          enum:
            - Shoonya Admin
            - Enterprise Admin
            - Enterprise User
            - Viewer
            - Group Admin
            - Group Viewer
        groups:
          title: Groups
          type: array
          items:
            type: string
        enterprise:
          title: Enterprise ID
          type: string
          format: uuid
        is_customer:
          title: Is Customer
          type: boolean
        is_endpoint_creator:
          title: Is Endpoint Creator
          type: boolean
        setup_wizard_complete:
          title: Setup Wizard Complete
          type: boolean
        default_password_changed:
          title: Default Password Changed
          type: boolean
        is_developer:
          title: Is Developer
          type: boolean
        can_factory_reset:
          title: Can Factory Reset
          type: boolean
    esper_cloud_api_UserCreate:
      required:
        - username
        - profile
      title: UserCreate
      type: object
      properties:
        username:
          title: User name
          type: string
        password:
          title: Password
          type: string
        first_name:
          title: First name
          type: string
        last_name:
          title: Last name
          type: string
        is_active:
          title: Is user active
          type: boolean
        email:
          title: Email
          type: string
          format: email
        profile:
          title: User Profile
          type: object
          $ref: '#/components/schemas/esper_cloud_api_UserProfileCreate'
    esper_cloud_api_UserUpdate:
      title: UserUpdation
      type: object
      properties:
        username:
          title: User name
          type: string
        password:
          title: Password
          type: string
        first_name:
          title: First name
          type: string
        last_name:
          title: Last name
          type: string
        is_active:
          title: Is user active
          type: boolean
        email:
          title: Email
          type: string
          format: email
        profile:
          title: User Profile
          type: object
          $ref: '#/components/schemas/esper_cloud_api_UserProfileCreate'
    esper_cloud_api_UpdateDifferentUserRequest:
      type: object
      properties:
        authz_role_id:
          title: Custom role id. Required only if role is AuthZ Role User
          type: string
          format: uuid
        can_factory_reset:
          title: If user should be able to factory reset or not
          type: boolean
        has_all_group_access:
          title: >-
            If user has access to all groups or not. Required only if role is
            AuthZ Role User
          type: boolean
        groups:
          title: >-
            List of group IDs. Can be empty if has_all_group_access is True or
            if the user role is not Group Admin/Group Viewer
          type: array
          items:
            type: string
        role:
          title: Role. Role should be AuthZ Role User for custom role
          type: string
          enum:
            - Shoonya Admin
            - Enterprise Admin
            - Enterprise User
            - Viewer
            - Group Admin
            - Group Viewer
            - AuthZ Role User
      required:
        - role
        - groups
    esper_cloud_api_UpdateOwnUserRequest:
      type: object
      properties:
        first_name:
          title: first name
          type: string
      required:
        - first_name
    esper_cloud_api_UserGroups:
      type: object
      properties:
        group_ids:
          type: array
          items:
            type: string
            format: uuid
        has_all_group_access:
          type: boolean
    esper_cloud_api_ConnectivitySection:
      title: Connectivity
      type: object
      properties:
        sms_disabled:
          type: boolean
        enable_bluetooth:
          type: boolean
        wifi_state:
          type: boolean
        nfc_beam_disabled:
          type: boolean
        ethernet_settings:
          type: object
          description: Ethernet settings to configure ethernet certificate
          required:
            - ethernet_auth_mode
          properties:
            ethernet_auth_mode:
              type: string
              description: |
                Auth Mode options
                ```
                * EAP_TLS: Ethernet auth mode is EAP_TLS
                * NONE: Default Value, if NONE then other fields are option
                ```
              enum:
                - EAP_TLS
                - NONE
            ethernet_ca_cert_alias:
              type: string
              description: It is mandatory field if Auth Mode is “EAP_TLS”.
            ethernet_client_cert_alias:
              type: string
              description: It is mandatory field if Auth Mode is “EAP_TLS”.
            ethernet_eap_identity:
              type: string
              description: It is mandatory field if Auth Mode is “EAP_TLS”.
        wifi_settings:
          type: array
          items:
            type: object
            properties:
              wifi_ssid:
                type: string
              wifi_password:
                type: string
              wifi_security_type:
                type: string
                enum:
                  - NONE
                  - WAP
                  - WEP
                  - EAP
                  - WPA2
                  - SAE
              wifi_phase2_auth:
                type: string
                enum:
                  - NONE
                  - PAP
                  - MSCHAP
                  - MSCHAPV2
                  - GTC
                  - SIM
                  - AKA
                  - AKA_PRIME
              wifi_eap_method:
                type: string
                enum:
                  - PEAP
                  - TLS
                  - TTLS
                  - PWD
                  - NONE
                  - SIM
                  - AKA
                  - AKA_PRIME
              identity:
                type: string
              anonymous_identity:
                type: string
              domain:
                type: string
              hidden:
                type: boolean
        incoming_numbers_with_tags:
          type: array
          items:
            type: object
            properties:
              number:
                type: string
              tags:
                type: array
                items:
                  type: string
        outgoing_numbers_with_tags:
          type: array
          items:
            type: object
            properties:
              number:
                type: string
              tags:
                type: array
                items:
                  type: string
        section_type:
          title: Type
          type: string
          enum:
            - Inherited
            - Independent
        locked:
          title: Locked
          description: Locked
          type: boolean
    esper_cloud_api_SoundSection:
      title: Sound
      type: object
      properties:
        alarm_volume:
          type: integer
        notification_volume:
          type: integer
        music_volume:
          type: integer
        ring_volume:
          type: integer
        section_type:
          title: Type
          type: string
          enum:
            - Inherited
            - Independent
        locked:
          title: Locked
          description: Locked
          type: boolean
    esper_cloud_api_DisplayBrandingSection:
      title: Display
      type: object
      properties:
        screenshot_disabled:
          type: boolean
        status_bar_disabled:
          type: boolean
        rotation_state:
          type: string
          enum:
            - AUTO
            - LANDSCAPE_ONLY
            - POTRAIT_ONLY
            - INVERTED_PORTRAIT_ONLY
            - INVERTED_LANDSCAPE_ONLY
        brightness_scale:
          type: integer
        wallpapers:
          type: array
          items:
            type: object
            properties:
              wallpaper:
                type: string
                format: uuid
              wallpaper_url:
                type: string
                readOnly: true
              thumbnail_url:
                type: string
                readOnly: true
              orientation:
                type: string
              screen_types:
                type: array
                items:
                  type: string
                  enum:
                    - LOCKSCREEN
                    - HOMESCREEN
              orientations:
                type: array
                items:
                  type: string
                  enum:
                    - PORTRAIT
                    - LANDSCAPE
        section_type:
          title: Type
          type: string
          enum:
            - Inherited
            - Independent
        locked:
          title: Locked
          description: Locked
          type: boolean
    esper_cloud_api_HardwareSettingsSection:
      title: Hardware
      type: object
      properties:
        gps_state:
          type: string
          enum:
            - LOCATION_MODE_HIGH_ACCURACY
            - LOCATION_MODE_SENSORS_ONLY
            - LOCATION_MODE_BATTERY_SAVING
            - LOCATION_MODE_OFF
            - LOCATION_MODE_ON
        usb_file_transfer_disabled:
          type: boolean
        tethering_disabled:
          type: boolean
        camera_disabled:
          type: boolean
        usb_connectivity_disabled:
          type: boolean
        section_type:
          title: Type
          type: string
          enum:
            - Inherited
            - Independent
        locked:
          title: Locked
          description: Locked
          type: boolean
    esper_cloud_api_DateTimeSection:
      title: Date Time
      type: object
      properties:
        timezone_string:
          type: string
        device_locale:
          type: string
        date_time_config_disabled:
          type: boolean
        section_type:
          title: Type
          type: string
          enum:
            - Inherited
            - Independent
        locked:
          title: Locked
          description: Locked
          type: boolean
    esper_cloud_api_SettingsAppSection:
      title: Settings App
      type: object
      properties:
        enable_android_settings_app:
          type: boolean
        settings_access_level:
          type: string
          enum:
            - NONE
            - SHOONYA
            - SYSTEM
        esper_settings_app:
          type: object
          properties:
            only_dock_accessible:
              type: boolean
            admin_mode_password:
              type: string
            esper_settings_app_policy:
              type: object
              properties:
                flashlight:
                  type: string
                wifi:
                  type: string
                auto_rotation:
                  type: string
                reboot:
                  type: string
                kiosk_app_selection:
                  type: string
                esper_branding:
                  type: string
                factory_reset:
                  type: string
                about:
                  type: string
                display:
                  type: string
                sound:
                  type: string
                keyboard:
                  type: string
                input_selection:
                  type: string
                accessibility:
                  type: string
                mobile_data:
                  type: string
                bluetooth:
                  type: string
                language:
                  type: string
                time_and_date:
                  type: string
                clear_app_data:
                  type: string
                storage:
                  type: string
                data_roaming:
                  type: string
                wifi_tethering:
                  type: string
                airplane_mode:
                  type: string
                accessibility_reset_to_default:
                  type: string
                accessibility_high_contrast_text:
                  type: string
                accessibility_cc_deuteranomaly:
                  type: string
                accessibility_cc_protanomaly:
                  type: string
                accessibility_cc_tritanomaly:
                  type: string
                accessibility_mono_audio:
                  type: string
                accessibility_display_size:
                  type: string
                accessibility_talkback:
                  type: string
                accessibility_text_to_speech:
                  type: string
        config_json:
          type: object
        section_type:
          title: Type
          type: string
          enum:
            - Inherited
            - Independent
        locked:
          title: Locked
          description: Locked
          type: boolean
    esper_cloud_api_SystemUpdatesSection:
      title: System Updates
      type: object
      properties:
        locked:
          title: Locked
          description: Locked
          type: boolean
        section_type:
          title: Type
          type: string
          enum:
            - Inherited
            - Independent
        type:
          title: Type
          description: Type
          type: string
          enum:
            - TYPE_POSTPONE
            - TYPE_INSTALL_AUTOMATIC
            - TYPE_INSTALL_WINDOWED
            - TYPE_INSTALL_DISABLED
        maintenance_start:
          type: integer
        maintenance_end:
          type: integer
    esper_cloud_api_GoogleServicesSection:
      title: Google Services
      type: object
      properties:
        disable_play_store:
          type: boolean
        google_assistant_disabled:
          type: boolean
        managed_google_play_disabled:
          type: boolean
        max_account:
          type: integer
        emails:
          type: array
          items:
            type: string
        domains:
          type: array
          items:
            type: string
        frp_googles:
          type: array
          items:
            type: object
            properties:
              google_id:
                type: string
              email:
                type: string
              type:
                type: string
                enum:
                  - USER
                  - ADMIN
        section_type:
          title: Type
          type: string
          enum:
            - Inherited
            - Independent
        locked:
          title: Locked
          description: Locked
          type: boolean
    esper_cloud_api_SecuritySection:
      title: Security
      type: object
      properties:
        password_quality:
          type: string
          enum:
            - PASSWORD_QUALITY_ALPHABETIC
            - PASSWORD_QUALITY_ALPHANUMERIC
            - PASSWORD_QUALITY_UNSPECIFIED
            - PASSWORD_QUALITY_COMPLEX
            - PASSWORD_QUALITY_BIOMETRIC_WEAK
            - PASSWORD_QUALITY_NUMERIC
        minimum_password_length:
          type: integer
        adb_disabled:
          type: boolean
        safe_boot_disabled:
          type: boolean
        screen_off_timeout:
          type: integer
        factory_reset_disabled:
          type: boolean
        keyguard_disabled:
          type: boolean
        section_type:
          title: Type
          type: string
          enum:
            - Inherited
            - Independent
        locked:
          title: Locked
          description: Locked
          type: boolean
    esper_cloud_api_ApplicationSection:
      title: Application
      type: object
      properties:
        app_mode:
          type: string
          enum:
            - KIOSK
            - MULTI_APP
        launch_on_start:
          type: string
        start_on_boot:
          type: string
          nullable: true
        launcher_less_dpc:
          type: boolean
        disable_local_app_install:
          type: boolean
        app_uninstall_disabled:
          type: boolean
        permission_policy:
          type: string
          enum:
            - PERMISSION_POLICY_AUTO_GRANT
            - PERMISSION_POLICY_PROMPT
            - PERMISSION_POLICY_AUTO_DENY
        locked:
          title: Locked
          description: Locked
          type: boolean
        preload_apps:
          type: array
          items:
            type: object
            properties:
              package_name:
                type: string
              state:
                type: string
                enum:
                  - SHOW
                  - HIDE
                  - DISABLED
                  - LAUNCHABLE_BUT_HIDDEN
        apps:
          type: array
          items:
            type: object
            properties:
              version_codes:
                type: array
                items:
                  type: string
                readOnly: true
              is_g_play:
                type: boolean
                readOnly: true
              app_version:
                type: string
                format: uuid
              app_version_url:
                type: string
                readOnly: true
              hash_string:
                type: string
                readOnly: true
              package_name:
                type: string
                readOnly: true
              download_url:
                type: string
                readOnly: true
              installation_rule:
                type: string
                enum:
                  - DURING
                  - POST
              state:
                type: string
                enum:
                  - SHOW
                  - HIDE
                  - DISABLED
                  - LAUNCHABLE_BUT_HIDDEN
              managed_config:
                type: object
        section_type:
          title: Type
          type: string
          enum:
            - Inherited
            - Independent
    esper_cloud_api_ContentSection:
      title: Content
      type: object
      properties:
        files:
          type: array
          items:
            type: object
            properties:
              file:
                type: integer
              file_url:
                type: string
                readOnly: true
              hash:
                type: string
                readOnly: true
              url:
                type: string
                readOnly: true
              destination_path:
                type: string
        section_type:
          title: Type
          type: string
          enum:
            - Inherited
            - Independent
        locked:
          type: boolean
    esper_cloud_api_BlueprintRevision:
      title: Blueprint
      type: object
      properties:
        id:
          type: string
          format: uuid
          readOnly: true
        revision:
          type: string
          readOnly: true
        created_by:
          type: string
          readOnly: true
        current:
          type: boolean
          readOnly: true
        type:
          type: string
          enum:
            - Independent
            - Inherited
        comments:
          type: string
        locked:
          type: boolean
        connectivity:
          $ref: '#/components/schemas/esper_cloud_api_ConnectivitySection'
        sound:
          $ref: '#/components/schemas/esper_cloud_api_SoundSection'
        display_branding:
          $ref: '#/components/schemas/esper_cloud_api_DisplayBrandingSection'
        hardware_settings:
          $ref: '#/components/schemas/esper_cloud_api_HardwareSettingsSection'
        date_time:
          $ref: '#/components/schemas/esper_cloud_api_DateTimeSection'
        settings_app:
          $ref: '#/components/schemas/esper_cloud_api_SettingsAppSection'
        system_updates:
          $ref: '#/components/schemas/esper_cloud_api_SystemUpdatesSection'
        google_services:
          $ref: '#/components/schemas/esper_cloud_api_GoogleServicesSection'
        security:
          $ref: '#/components/schemas/esper_cloud_api_SecuritySection'
        application:
          $ref: '#/components/schemas/esper_cloud_api_ApplicationSection'
        content:
          $ref: '#/components/schemas/esper_cloud_api_ContentSection'
        created_on:
          title: Created on
          description: Date and time of when the group was created
          type: string
          format: date-time
          readOnly: true
    esper_cloud_api_Blueprint:
      title: Blueprint
      type: object
      properties:
        id:
          type: string
          format: uuid
          readOnly: true
        name:
          type: string
        description:
          type: string
        locked:
          type: boolean
        group:
          type: string
          format: uuid
        latest_revision:
          $ref: '#/components/schemas/esper_cloud_api_BlueprintRevision'
        created_on:
          type: string
          format: date-time
          readOnly: true
        updated_on:
          type: string
          format: date-time
          readOnly: true
    esper_cloud_api_UniqueIdentifier:
      title: UniqueIdentifier
      type: object
      properties:
        unique_id:
          title: Unique identifier
          type: string
        type:
          title: Unique identifier type
          type: string
          enum:
            - IMEI1
            - IMEI2
            - SERIAL
            - MEI
            - WIFI_MAC_ID
            - ETHERNET_MAC_ID
    esper_cloud_api_DirectoryRecord:
      title: DirectoryRecord
      type: object
      properties:
        id:
          title: Directory Record ID
          type: string
        name:
          title: Device name
          type: string
        online_status:
          type: string
          enum:
            - ONLINE
            - OFFLINE
            - NONE
        alias:
          title: Alias name
          type: string
        tags:
          title: Tags
          type: array
          items:
            type: string
        group_id:
          title: Group ID
          type: string
          format: uuid
        device_id:
          title: Device ID
          type: string
          format: uuid
        approval_status:
          title: Approval Status
          type: string
          enum:
            - WAITING_FOR_APPROVAL
            - APPROVED
            - REJECTED
            - BLOCKED
        provisioned_on:
          title: Provisioned on
          type: string
          format: date-time
          readOnly: true
        unique_identifiers:
          title: Unique Identifiers
          type: array
          items:
            type: object
            allOf:
              - $ref: '#/components/schemas/esper_cloud_api_UniqueIdentifier'
    esper_cloud_api_UniqueIdentifierCreate:
      title: UniqueIdentifierCreate
      type: object
      properties:
        unique_id:
          title: Unique identifier
          type: string
        type:
          title: Unique identifier type
          type: integer
          enum:
            - 0
            - 1
            - 2
            - 3
            - 4
            - 5
          description: |
            Following are the valid Unique Identifier Types:

            ```
            IMEI1 = 0
            IMEI2 = 1
            SERIAL = 2
            MEI = 3
            WIFI_MAC_ID = 4
            ETHERNET_MAC_ID = 5
            ```
    esper_cloud_api_DirectoryRecordCreate:
      title: DirectoryRecordCreate
      type: object
      properties:
        unique_identifiers:
          title: Unique Identifiers
          type: array
          items:
            type: object
            allOf:
              - $ref: '#/components/schemas/esper_cloud_api_UniqueIdentifierCreate'
        group_id:
          title: Group ID
          type: string
          format: uuid
        alias:
          title: Alias name
          type: string
        tags:
          title: Tags
          type: array
          items:
            type: string
    esper_cloud_api_DirectoryRecordUpdate:
      title: DirectoryRecordUpdate
      type: object
      properties:
        unique_identifiers:
          title: Unique Identifiers
          type: array
          items:
            type: object
            allOf:
              - $ref: '#/components/schemas/esper_cloud_api_UniqueIdentifierCreate'
        group_id:
          title: Group ID
          type: string
          format: uuid
        alias:
          title: Alias name
          type: string
        tags:
          title: Tags
          type: array
          items:
            type: string
    esper_cloud_api_CustomConnectionList:
      title: CustomConnectionList
      type: object
      properties:
        name:
          title: name
          type: string
        strategy:
          title: strategy
          enum:
            - samlp
            - oidc
          description: |
            Strategy:
             * `samlp` - SAML connection
             * `oidc` - OIDC connection
        is_default:
          title: is default
          type: boolean
    esper_cloud_api_CustomConnectionsListResponse:
      title: CustomConnectionsListResponse
      type: object
      properties:
        connection_id:
          title: connection id
          type: string
        connection:
          type: object
          $ref: '#/components/schemas/esper_cloud_api_CustomConnectionList'
    esper_cloud_api_CustomConnectionConfigResponse:
      title: CustomConnectionConfigResponse
      type: object
      properties:
        sign_in_url:
          title: Sign in url
          type: string
          format: url
          description: Required for SAML connection
        disable_sign_out:
          title: Disable sign out
          type: boolean
        sign_out_url:
          title: Sign out url
          type: string
          format: url
        x509_certificate:
          title: x509 certificate
          type: string
          description: Required for SAML connection
        issuer_url:
          title: Issuer url
          type: string
          format: url
          description: Required for OIDC connection
        client_id:
          title: client id
          type: string
          description: Required for OIDC connection
    esper_cloud_api_CustomConnectionRequest:
      title: CustomConnectionRequest
      type: object
      properties:
        display_name:
          title: display name
          type: string
        strategy:
          title: strategy
          enum:
            - samlp
            - oidc
          description: |
            Strategy:
             * `samlp` - SAML connection
             * `oidc` - OIDC connection
        config:
          type: object
          $ref: '#/components/schemas/esper_cloud_api_CustomConnectionConfigResponse'
    esper_cloud_api_CustomConnectionResponse:
      title: CustomConnectionResponse
      type: object
      properties:
        id:
          title: id
          type: string
        name:
          title: name
          type: string
        display_name:
          title: display name
          type: string
        strategy:
          title: strategy
          enum:
            - samlp
            - oidc
          description: |
            Strategy:
             * `samlp` - SAML connection
             * `oidc` - OIDC connection
        service_provider_acs_url:
          title: service provider ACS url
          type: string
          format: url
        service_provider_entity_id:
          title: service provider entity id
          type: string
        service_provider_logout_url:
          title: service provider logout url
          type: string
        signing_certificate_link:
          title: signing certificate link
          type: string
        callback_url:
          title: callback url
          type: string
          format: url
        config:
          type: object
          $ref: '#/components/schemas/esper_cloud_api_CustomConnectionConfigResponse'
    esper_cloud_api_RoleResponse:
      type: object
      properties:
        id:
          type: string
        name:
          type: string
        description:
          type: string
        role_type:
          type: integer
    esper_cloud_api_Role:
      type: object
      properties:
        name:
          type: string
        description:
          type: string
    esper_cloud_api_ScopeResponse:
      type: object
      properties:
        id:
          type: string
        name:
          type: string
        description:
          type: string
        scope_type:
          type: integer
    esper_cloud_api_PersonalAccessTokenGetResponse:
      title: PersonalAccessTokenGetResponse
      type: object
      properties:
        count:
          type: integer
        personal_access_tokens:
          type: array
          items:
            type: object
            properties:
              id:
                type: string
                format: uuid
                description: The unique identifier of the token.
              name:
                type: string
                description: The name of the token.
              description:
                type: string
                description: A description of the token.
              created_at:
                type: string
                format: timestamp
                description: Timestamp indicating when the token was created.
              updated_at:
                type: string
                format: timestamp
                description: Timestamp indicating when the token was updated.
              prefix:
                type: string
                description: The token prefix.
              token:
                type: string
                description: The token value.
              expiry_at:
                type: integer
                description: exipy date for token, -1 indicates no expiry.
              legacy_token_id:
                type: integer
                description: token id corresponding to legacy system
              legacy_developer_app_id:
                type: string
                description: developer app id corresponding to legacy system
    esper_cloud_api_PersonalAccessTokenCreateResponse:
      title: PersonalAccessTokenCreateResponse
      type: object
      properties:
        id:
          type: string
          format: uuid
          description: Unique ID for the generated token.
        name:
          type: string
          description: Name for the token.
        description:
          type: string
          description: Description for the token.
        created_at:
          type: string
          format: timestamp
          description: Timestamp indicating when the token was created.
        updated_at:
          type: string
          format: timestamp
          description: Timestamp indicating when the token was last updated.
        token:
          type: string
          description: The generated access token value.
        prefix:
          type: string
          description: Prefix for the generated token value.
        expiry_at:
          type: integer
          description: exipy date for token.
    esper_cloud_api_PersonalAccessTokenUpdateResponse:
      title: PersonalAccessTokenUpdateResponse
      type: object
      properties:
        id:
          type: string
          format: uuid
          description: Unique ID for the generated token.
        name:
          type: string
          description: Name for the token.
        description:
          type: string
          description: Description for the token.
        created_at:
          type: string
          format: timestamp
          description: Timestamp indicating when the token was created.
        updated_at:
          type: string
          format: timestamp
          description: Timestamp indicating when the token was last updated.
        token:
          type: string
          description: The generated access token value.
        prefix:
          type: string
          description: Prefix for the generated token value.
        expiry_at:
          type: integer
          description: exipy date for token.
        legacy_token_id:
          type: integer
          description: token id corresponding to legacy system
        legacy_developer_app_id:
          type: string
          description: developer app id corresponding to legacy system
    esper_cloud_api_UsersListResponse:
      title: UsersListResponse
      type: object
      properties:
        user_id:
          title: user id
          type: string
        tenant_id:
          title: tenant id
          type: string
          format: uuid
        partner_id:
          title: partner id
          type: string
          format: uuid
        email:
          title: email
          type: string
        name:
          title: name
          type: string
        connection_id:
          title: connection id
          type: string
        created_at:
          title: created_at
          type: string
          format: timestamp
        updated_at:
          title: updated_at
          type: string
          format: timestamp
    blueprints_apply_policy:
      type: string
      enum:
        - ALWAYS APPLY
        - IGNORE
        - PROVISION ONLY
    blueprints_device_mode_settings:
      type: object
      properties:
        apply_policy:
          $ref: '#/components/schemas/blueprints_apply_policy'
        device_mode:
          type: string
          enum:
            - KIOSK
            - MULTI APP
    blueprints_launcher_settings:
      type: object
      properties:
        apply_policy:
          $ref: '#/components/schemas/blueprints_apply_policy'
        launcher:
          type: string
          enum:
            - ESPER
            - DEFAULT
      required:
        - apply_policy
        - launcher
    blueprints_local_app_install_settings:
      type: object
      properties:
        apply_policy:
          $ref: '#/components/schemas/blueprints_apply_policy'
        allow_local_app_install:
          type: boolean
      required:
        - apply_policy
        - allow_local_app_install
    blueprints_app_uninstall_settings:
      type: object
      properties:
        apply_policy:
          $ref: '#/components/schemas/blueprints_apply_policy'
        allow_app_uninstallation:
          type: boolean
      required:
        - apply_policy
        - allow_app_uninstallation
    blueprints_app_permission_policy_settings:
      type: object
      properties:
        apply_policy:
          $ref: '#/components/schemas/blueprints_apply_policy'
        permission_policy:
          type: string
          enum:
            - ALLOW AUTOMATICALLY
            - DENY
            - ASK USER
      required:
        - apply_policy
        - permission_policy
    blueprints_wifi_settings:
      type: object
      properties:
        apply_policy:
          $ref: '#/components/schemas/blueprints_apply_policy'
        allow_wifi:
          type: boolean
        wifi_state:
          type: string
          enum:
            - ENABLE
            - DISABLE
      required:
        - apply_policy
        - allow_wifi
        - wifi_state
    blueprints_drift_policy:
      type: string
      enum:
        - IGNORE
        - LOG ONLY
        - MINOR
        - MAJOR
        - CRITICAL
      default: IGNORE
      description: 'Allowed values: IGNORE, LOG ONLY, MINOR, MAJOR, CRITICAL'
    blueprints_bluetooth_settings:
      type: object
      properties:
        apply_policy:
          $ref: '#/components/schemas/blueprints_apply_policy'
        allow_bluetooth:
          type: boolean
        bluetooth_state:
          type: string
          enum:
            - ENABLE
            - DISABLE
        drift_policy:
          $ref: '#/components/schemas/blueprints_drift_policy'
      required:
        - apply_policy
        - allow_bluetooth
    blueprints_sms_settings:
      type: object
      properties:
        apply_policy:
          $ref: '#/components/schemas/blueprints_apply_policy'
        allow_sms:
          type: boolean
      required:
        - apply_policy
        - allow_sms
    blueprints_nfc_settings:
      type: object
      properties:
        apply_policy:
          $ref: '#/components/schemas/blueprints_apply_policy'
        allow_nfc:
          type: boolean
      required:
        - apply_policy
        - allow_nfc
    blueprints_incoming_numbers_settings:
      type: object
      properties:
        apply_policy:
          $ref: '#/components/schemas/blueprints_apply_policy'
        allow_all_numbers:
          type: boolean
        allowed_numbers:
          type: array
          items:
            type: string
        tags:
          type: array
          items:
            type: string
      required:
        - apply_policy
        - allow_all_numbers
    blueprints_outgoing_numbers_settings:
      type: object
      properties:
        apply_policy:
          $ref: '#/components/schemas/blueprints_apply_policy'
        allow_all_numbers:
          type: boolean
        allow_ussd_codes:
          type: boolean
          default: false
        allowed_numbers:
          type: array
          items:
            type: string
        tags:
          type: array
          items:
            type: string
      required:
        - apply_policy
        - allow_all_numbers
    blueprints_ethernet_settings:
      type: object
      properties:
        apply_policy:
          $ref: '#/components/schemas/blueprints_apply_policy'
        auth_mode:
          type: string
          enum:
            - NONE
            - EAP-TLS
        ca_cert_alias:
          type: string
        client_cert_alias:
          type: string
        eap_identity:
          type: string
      required:
        - apply_policy
    blueprints_adb_settings:
      type: object
      properties:
        apply_policy:
          $ref: '#/components/schemas/blueprints_apply_policy'
        allow_adb:
          type: boolean
      required:
        - apply_policy
        - allow_adb
    blueprints_safe_boot_settings:
      type: object
      properties:
        apply_policy:
          $ref: '#/components/schemas/blueprints_apply_policy'
        allow_safe_boot:
          type: boolean
      required:
        - apply_policy
        - allow_safe_boot
    blueprints_factory_reset_settings:
      type: object
      properties:
        apply_policy:
          $ref: '#/components/schemas/blueprints_apply_policy'
        allow_factory_reset:
          type: boolean
      required:
        - apply_policy
        - allow_factory_reset
    blueprints_screen_timeout_settings:
      type: object
      properties:
        apply_policy:
          $ref: '#/components/schemas/blueprints_apply_policy'
        screentimeout_value:
          type: integer
      required:
        - apply_policy
        - screentimeout_value
    blueprints_lock_screen_settings:
      type: object
      properties:
        apply_policy:
          $ref: '#/components/schemas/blueprints_apply_policy'
        password_quality:
          type: string
          enum:
            - NONE
            - ALPHABETIC
            - NUMERIC
            - ALPHANUMERIC
            - COMPLEX
            - BIOMETRIC_WEAK
        minimum_password_length:
          type: integer
          nullable: true
        allow_keyguard:
          type: boolean
      required:
        - apply_policy
        - password_quality
        - allow_keyguard
    blueprints_brightness_settings:
      type: object
      properties:
        apply_policy:
          $ref: '#/components/schemas/blueprints_apply_policy'
        brightness_value:
          type: string
    blueprints_screen_orientation_settings:
      type: object
      properties:
        apply_policy:
          $ref: '#/components/schemas/blueprints_apply_policy'
        orientation_type:
          type: string
          enum:
            - PORTRAIT
            - LANDSCAPE
            - INVERTED PORTRAIT
            - INVERTED LANDSCAPE
            - AUTO
    blueprints_screenshot_settings:
      type: object
      properties:
        apply_policy:
          $ref: '#/components/schemas/blueprints_apply_policy'
        allow_screenshot:
          type: boolean
    blueprints_notification_bar_settings:
      type: object
      properties:
        apply_policy:
          $ref: '#/components/schemas/blueprints_apply_policy'
        allow_notification_bar:
          type: boolean
    blueprints_wallpaper_settings:
      type: object
      properties:
        homescreen:
          type: object
          properties:
            apply_policy:
              $ref: '#/components/schemas/blueprints_apply_policy'
            portrait:
              type: object
              properties:
                wallpaper_id:
                  type: string
            landscape:
              type: object
              properties:
                wallpaper_id:
                  type: string
        lockscreen:
          type: object
          properties:
            apply_policy:
              $ref: '#/components/schemas/blueprints_apply_policy'
            portrait:
              type: object
              properties:
                wallpaper_id:
                  type: string
    blueprints_esper_settings_apps_settings:
      type: object
      properties:
        apply_policy:
          $ref: '#/components/schemas/blueprints_apply_policy'
        allow_dock:
          type: boolean
        admin_mode_password:
          type: string
        allow_esper_settings_app:
          type: boolean
        settings:
          type: object
          properties:
            flashlight:
              type: string
              enum:
                - NONE
                - USER
                - ADMIN
                - BOTH
            wifi:
              type: string
              enum:
                - NONE
                - USER
                - ADMIN
                - BOTH
            auto_rotation:
              type: string
              enum:
                - NONE
                - USER
                - ADMIN
                - BOTH
            reboot:
              type: string
              enum:
                - NONE
                - USER
                - ADMIN
                - BOTH
            clear_app_data:
              type: string
              enum:
                - NONE
                - USER
                - ADMIN
                - BOTH
            kiosk_app_selection:
              type: string
              enum:
                - NONE
                - USER
                - ADMIN
                - BOTH
            esper_branding:
              type: string
              enum:
                - NONE
                - USER
                - ADMIN
                - BOTH
            factory_reset:
              type: string
              enum:
                - NONE
                - USER
                - ADMIN
                - BOTH
            about:
              type: string
              enum:
                - NONE
                - USER
                - ADMIN
                - BOTH
            display:
              type: string
              enum:
                - NONE
                - USER
                - ADMIN
                - BOTH
            sound:
              type: string
              enum:
                - NONE
                - USER
                - ADMIN
                - BOTH
            keyboard:
              type: string
              enum:
                - NONE
                - USER
                - ADMIN
                - BOTH
            input_selection:
              type: string
              enum:
                - NONE
                - USER
                - ADMIN
                - BOTH
            accessibility:
              type: string
              enum:
                - NONE
                - USER
                - ADMIN
                - BOTH
            accessibility_reset_to_default:
              type: string
              enum:
                - NONE
                - USER
                - ADMIN
                - BOTH
            accessibility_high_contrast_text:
              type: string
              enum:
                - NONE
                - USER
                - ADMIN
                - BOTH
            accessibility_cc_deuteranomaly:
              type: string
              enum:
                - NONE
                - USER
                - ADMIN
                - BOTH
            accessibility_cc_protanomaly:
              type: string
              enum:
                - NONE
                - USER
                - ADMIN
                - BOTH
            accessibility_cc_tritanomaly:
              type: string
              enum:
                - NONE
                - USER
                - ADMIN
                - BOTH
            accessibility_mono_audio:
              type: string
              enum:
                - NONE
                - USER
                - ADMIN
                - BOTH
            accessibility_display_size:
              type: string
              enum:
                - NONE
                - USER
                - ADMIN
                - BOTH
            accessibility_font_scale:
              type: string
              enum:
                - NONE
                - USER
                - ADMIN
                - BOTH
            accessibility_talkback:
              type: string
              enum:
                - NONE
                - USER
                - ADMIN
                - BOTH
            accessibility_text_to_speech:
              type: string
              enum:
                - NONE
                - USER
                - ADMIN
                - BOTH
            mobile_data:
              type: string
              enum:
                - NONE
                - USER
                - ADMIN
                - BOTH
            bluetooth:
              type: string
              enum:
                - NONE
                - USER
                - ADMIN
                - BOTH
            language:
              type: string
              enum:
                - NONE
                - USER
                - ADMIN
                - BOTH
            time_and_date:
              type: string
              enum:
                - NONE
                - USER
                - ADMIN
                - BOTH
            storage:
              type: string
              enum:
                - NONE
                - USER
                - ADMIN
                - BOTH
            data_roaming:
              type: string
              enum:
                - NONE
                - USER
                - ADMIN
                - BOTH
            wifi_tethering:
              type: string
              enum:
                - NONE
                - USER
                - ADMIN
                - BOTH
            airplane_mode:
              type: string
              enum:
                - NONE
                - USER
                - ADMIN
                - BOTH
      required:
        - dock_accessibitly_settings
        - admin_mode_password_settings
        - settings
    blueprints_android_settings_app_settings:
      type: object
      properties:
        apply_policy:
          $ref: '#/components/schemas/blueprints_apply_policy'
        allow_android_settings_app:
          type: boolean
      required:
        - allow_android_settings_app
    blueprints_customized_device_level_json_settings:
      type: object
      properties:
        apply_policy:
          $ref: '#/components/schemas/blueprints_apply_policy'
        customized_json:
          type: object
      required:
        - customized_json
    blueprints_google_services_settings:
      type: object
      properties:
        afw_account_settings:
          type: object
          properties:
            apply_policy:
              $ref: '#/components/schemas/blueprints_apply_policy'
            allow_afw_account_addition:
              type: boolean
          required:
            - apply_policy
            - allow_afw_account_addition
        personal_accounts_settings:
          type: object
          properties:
            apply_policy:
              $ref: '#/components/schemas/blueprints_apply_policy'
            personal_accounts_limit_value:
              type: integer
          required:
            - apply_policy
            - personal_accounts_limit_value
        play_store_settings:
          type: object
          properties:
            apply_policy:
              $ref: '#/components/schemas/blueprints_apply_policy'
            allow_playstore:
              type: boolean
          required:
            - apply_policy
            - allow_playstore
        google_assitant_settings:
          type: object
          properties:
            apply_policy:
              $ref: '#/components/schemas/blueprints_apply_policy'
            allow_google_assistant:
              type: boolean
          required:
            - apply_policy
            - allow_google_assistant
        factory_reset_protection_settings:
          type: object
          properties:
            apply_policy:
              $ref: '#/components/schemas/blueprints_apply_policy'
            google_id:
              type: string
            email:
              type: string
          required:
            - apply_policy
            - google_id
            - email
      required:
        - afw_account_settings
        - personal_accounts_settings
        - play_store_settings
        - google_assitant_settings
        - factory_reset_protection_settings
    blueprints_external_device_settings:
      type: object
      properties:
        apply_policy:
          $ref: '#/components/schemas/blueprints_apply_policy'
        allow_external_device_mount:
          type: boolean
    blueprints_usb_tethering_settings:
      type: object
      properties:
        apply_policy:
          $ref: '#/components/schemas/blueprints_apply_policy'
        allow_usb_tethering:
          type: boolean
    blueprints_file_transfer_settings:
      type: object
      properties:
        apply_policy:
          $ref: '#/components/schemas/blueprints_apply_policy'
        allow_file_transfer:
          type: boolean
    blueprints_camera_settings:
      type: object
      properties:
        apply_policy:
          $ref: '#/components/schemas/blueprints_apply_policy'
        allow_camera_access:
          type: boolean
    blueprints_location_settings:
      type: object
      properties:
        apply_policy:
          $ref: '#/components/schemas/blueprints_apply_policy'
        allow_location:
          type: boolean
    blueprints_sound_settings:
      type: object
      properties:
        alarm_settings:
          type: object
          properties:
            apply_policy:
              $ref: '#/components/schemas/blueprints_apply_policy'
            alarm_volume:
              type: integer
        music_settings:
          type: object
          properties:
            apply_policy:
              $ref: '#/components/schemas/blueprints_apply_policy'
            music_volume:
              type: integer
        ringtone_settings:
          type: object
          properties:
            apply_policy:
              $ref: '#/components/schemas/blueprints_apply_policy'
            ringtone_volume:
              type: integer
        notification_settings:
          type: object
          properties:
            apply_policy:
              $ref: '#/components/schemas/blueprints_apply_policy'
            notification_volume:
              type: integer
        voice_call_settings:
          type: object
          properties:
            apply_policy:
              $ref: '#/components/schemas/blueprints_apply_policy'
            voice_call_volume:
              type: integer
    blueprints_system_updates_settings:
      type: object
      properties:
        apply_policy:
          $ref: '#/components/schemas/blueprints_apply_policy'
        system_update_policy_type:
          type: string
          enum:
            - UPDATE AUTOMATICALLY
            - POSTPONE INSTALLATION
            - WINDOWED INSTALLATION
            - DISABLE UPDATE
            - DEFAULT UPDATE
        maintenance_start:
          type: string
        maintenance_end:
          type: string
    blueprints_time_date_settings:
      type: object
      properties:
        apply_policy:
          $ref: '#/components/schemas/blueprints_apply_policy'
        allow_edit_time_date:
          type: boolean
    blueprints_timezone_settings:
      type: object
      properties:
        apply_policy:
          $ref: '#/components/schemas/blueprints_apply_policy'
        timezone:
          type: string
    blueprints_language_settings:
      type: object
      properties:
        apply_policy:
          $ref: '#/components/schemas/blueprints_apply_policy'
        device_locale:
          type: string
    blueprints_strict_wifi_synchronization_settings:
      type: object
      properties:
        apply_policy:
          $ref: '#/components/schemas/blueprints_apply_policy'
        allow_strict_wifi_synchronization:
          type: boolean
    blueprints_strict_app_synchronization_settings:
      type: object
      properties:
        apply_policy:
          $ref: '#/components/schemas/blueprints_apply_policy'
        allow_strict_app_synchronization:
          type: boolean
    blueprints_app:
      type: object
      properties:
        app_id:
          type: string
        app_version_id:
          type: string
        package_name:
          type: string
        installation_rule:
          type: string
          enum:
            - POST PROVISIONING
            - DURING PROVISIONING
        state:
          type: string
          enum:
            - SHOW
            - HIDE
            - DISABLE
            - LAUNCHABLE_BUT_HIDDEN
        managed_config:
          type: object
        type:
          type: string
          enum:
            - PRELOADED
            - ENTERPRISE
            - PLAYSTORE
        auto_update_mode:
          type: string
          enum:
            - autoUpdateDefault
            - autoUpdateHighPriority
            - autoUpdatePostponed
      required:
        - app_id
        - app_version_id
        - package_name
        - installation_rule
        - state
        - type
        - auto_update_mode
    blueprints_apps:
      type: array
      items:
        $ref: '#/components/schemas/blueprints_app'
    blueprints_file:
      type: object
      properties:
        file_id:
          type: integer
          description: File identifier from Content Management
        destination_path:
          type: string
      required:
        - file_id
        - destination_path
        - tags
    blueprints_files:
      type: array
      items:
        $ref: '#/components/schemas/blueprints_file'
    blueprints_wifi_network:
      type: object
      properties:
        wifi_network_id:
          type: string
        certificate_file_path:
          type: string
          example: /storage/emulated/0/Documents
        certificate_file_password:
          type: string
          example: abc
      required:
        - wifi_network_id
    blueprints_wifi_networks:
      type: array
      items:
        $ref: '#/components/schemas/blueprints_wifi_network'
    blueprints_saved_ap_settings:
      type: object
      properties:
        apply_policy:
          $ref: '#/components/schemas/blueprints_apply_policy'
        use_only_saved_ap:
          type: boolean
      required:
        - apply_policy
        - use_only_saved_ap
    blueprints_mac_address_randomization_settings:
      type: object
      properties:
        apply_policy:
          $ref: '#/components/schemas/blueprints_apply_policy'
        allow_mac_address_randomization:
          type: boolean
    blueprints_esper_edgebox_settings:
      type: object
      properties:
        apply_policy:
          $ref: '#/components/schemas/blueprints_apply_policy'
        allow_esper_edgebox:
          type: boolean
    blueprints_app_layout_setting:
      type: object
      properties:
        apply_policy:
          $ref: '#/components/schemas/blueprints_apply_policy'
        brand_logo_position:
          type: string
          enum:
            - BOTTOM_LEFT
            - BOTTOM_RIGHT
            - TOP_LEFT
            - TOP_RIGHT
        device_name_position:
          type: string
          enum:
            - BOTTOM_LEFT
            - BOTTOM_RIGHT
            - TOP_LEFT
            - TOP_RIGHT
        app_icon_size:
          type: string
          enum:
            - SMALL_ICON
            - MEDIUM_ICON
            - LARGE_ICON
            - DEFAULT_ICON
            - CUSTOM_ICON
        app_name_size:
          type: string
          enum:
            - SMALL_TEXT
            - MEDIUM_TEXT
            - LARGE_TEXT
            - DEFAULT_TEXT
            - CUSTOM_TEXT
        device_name_and_id_display_policy:
          type: string
          enum:
            - NONE
            - DEFAULT
            - DEVICE_ID_ONLY
            - ALIAS_NAME_ONLY
            - DEVICE_ID_AND_ALIAS_NAME
        device_name_size:
          type: string
          enum:
            - SMALL_TEXT
            - MEDIUM_TEXT
            - LARGE_TEXT
            - DEFAULT_TEXT
            - CUSTOM_TEXT
        device_alias_size:
          type: string
          enum:
            - SMALL_TEXT
            - MEDIUM_TEXT
            - LARGE_TEXT
            - DEFAULT_TEXT
            - CUSTOM_TEXT
        custom_app_icon_size:
          type: integer
          minimum: 20
          maximum: 100
        custom_device_name_size:
          type: integer
          minimum: 20
          maximum: 100
        custom_device_alias_size:
          type: integer
          minimum: 20
          maximum: 100
        custom_app_name_size:
          type: integer
          minimum: 20
          maximum: 100
    blueprints_app_icon:
      type: object
      properties:
        type:
          type: string
          enum:
            - SINGLE_APP
        name:
          type: string
    blueprints_app_order_setting:
      type: object
      properties:
        apply_policy:
          $ref: '#/components/schemas/blueprints_apply_policy'
        app_order_list:
          type: array
          items:
            $ref: '#/components/schemas/blueprints_app_icon'
    blueprints_datawedge_settings:
      type: object
      description: DataWedge barcode scanning configuration for Zebra devices.
      properties:
        apply_policy:
          $ref: '#/components/schemas/blueprints_apply_policy'
        config_mode:
          type: string
          enum:
            - NONE
            - UPLOAD
            - CONTENT_MANAGEMENT
          default: NONE
        files:
          $ref: '#/components/schemas/blueprints_files'
    blueprints_mx_config_settings:
      type: object
      description: >-
        MX Config settings — supports file upload, content management, and XML
        paste.
      properties:
        apply_policy:
          $ref: '#/components/schemas/blueprints_apply_policy'
        config_mode:
          type: string
          enum:
            - NONE
            - UPLOAD
            - CONTENT_MANAGEMENT
            - PASTE_XML
          default: NONE
        files:
          $ref: '#/components/schemas/blueprints_files'
        xml_content:
          type: string
          nullable: true
    blueprints_oem_config_options:
      type: object
      description: >
        OEM Config options — multi-mode input. Exactly one of files /
        json_content / manual_configuration is populated depending on
        config_mode; the rest must be empty/null.
      properties:
        config_mode:
          type: string
          enum:
            - NONE
            - PASTE_JSON
            - UPLOAD_JSON_FILE
            - MANUAL_CONFIGURATION
            - CONTENT_MANAGEMENT
          default: NONE
        files:
          $ref: '#/components/schemas/blueprints_files'
        json_content:
          type: string
          nullable: true
        manual_configuration:
          type: object
          nullable: true
          additionalProperties: true
    blueprints_oem_config_settings:
      type: object
      description: OEM Config settings with version picker and configuration options.
      properties:
        apply_policy:
          $ref: '#/components/schemas/blueprints_apply_policy'
        allow_oem_config:
          type: boolean
          default: false
        oem_config_type:
          type: string
          enum:
            - NONE
            - LEGACY_ZEBRA_OEMCONFIG
            - ZEBRA_OEMCONFIG_POWERED_BY_MX
          default: NONE
        oem_config_options:
          $ref: '#/components/schemas/blueprints_oem_config_options'
    blueprints_oem_settings:
      type: object
      description: >-
        Container for all OEM subsystem settings (DataWedge, MX Config, OEM
        Config).
      properties:
        datawedge_settings:
          $ref: '#/components/schemas/blueprints_datawedge_settings'
        mx_config_settings:
          $ref: '#/components/schemas/blueprints_mx_config_settings'
        oem_config_settings:
          $ref: '#/components/schemas/blueprints_oem_config_settings'
    blueprints_advanced_configurations:
      type: object
      description: >
        OEM-specific advanced configurations for AIDC devices. Currently
        supports Zebra (DataWedge, MX Config, OEM Config).
      properties:
        oem_manufacturer:
          type: string
          nullable: true
          enum:
            - ZEBRA
        oem_settings:
          $ref: '#/components/schemas/blueprints_oem_settings'
    blueprints_settings:
      type: object
      properties:
        device_mode_settings:
          $ref: '#/components/schemas/blueprints_device_mode_settings'
        launcher_settings:
          $ref: '#/components/schemas/blueprints_launcher_settings'
        local_app_install_settings:
          $ref: '#/components/schemas/blueprints_local_app_install_settings'
        app_uninstall_settings:
          $ref: '#/components/schemas/blueprints_app_uninstall_settings'
        app_permission_policy_settings:
          $ref: '#/components/schemas/blueprints_app_permission_policy_settings'
        wifi_settings:
          $ref: '#/components/schemas/blueprints_wifi_settings'
        bluetooth_settings:
          $ref: '#/components/schemas/blueprints_bluetooth_settings'
        sms_settings:
          $ref: '#/components/schemas/blueprints_sms_settings'
        nfc_settings:
          $ref: '#/components/schemas/blueprints_nfc_settings'
        incoming_numbers_settings:
          $ref: '#/components/schemas/blueprints_incoming_numbers_settings'
        outgoing_numbers_settings:
          $ref: '#/components/schemas/blueprints_outgoing_numbers_settings'
        ethernet_settings:
          $ref: '#/components/schemas/blueprints_ethernet_settings'
        adb_settings:
          $ref: '#/components/schemas/blueprints_adb_settings'
        safe_boot_settings:
          $ref: '#/components/schemas/blueprints_safe_boot_settings'
        factory_reset_settings:
          $ref: '#/components/schemas/blueprints_factory_reset_settings'
        screen_timeout_settings:
          $ref: '#/components/schemas/blueprints_screen_timeout_settings'
        lock_screen_settings:
          $ref: '#/components/schemas/blueprints_lock_screen_settings'
        brightness_settings:
          $ref: '#/components/schemas/blueprints_brightness_settings'
        screen_orientation_settings:
          $ref: '#/components/schemas/blueprints_screen_orientation_settings'
        screenshot_settings:
          $ref: '#/components/schemas/blueprints_screenshot_settings'
        notification_bar_settings:
          $ref: '#/components/schemas/blueprints_notification_bar_settings'
        wallpaper_settings:
          $ref: '#/components/schemas/blueprints_wallpaper_settings'
        esper_settings_apps_settings:
          $ref: '#/components/schemas/blueprints_esper_settings_apps_settings'
        android_settings_app_settings:
          $ref: '#/components/schemas/blueprints_android_settings_app_settings'
        customized_device_level_json_settings:
          $ref: >-
            #/components/schemas/blueprints_customized_device_level_json_settings
        google_services_settings:
          $ref: '#/components/schemas/blueprints_google_services_settings'
        external_device_settings:
          $ref: '#/components/schemas/blueprints_external_device_settings'
        usb_tethering_settings:
          $ref: '#/components/schemas/blueprints_usb_tethering_settings'
        file_transfer_settings:
          $ref: '#/components/schemas/blueprints_file_transfer_settings'
        camera_settings:
          $ref: '#/components/schemas/blueprints_camera_settings'
        location_settings:
          $ref: '#/components/schemas/blueprints_location_settings'
        sound_settings:
          $ref: '#/components/schemas/blueprints_sound_settings'
        system_updates_settings:
          $ref: '#/components/schemas/blueprints_system_updates_settings'
        time_date_settings:
          $ref: '#/components/schemas/blueprints_time_date_settings'
        timezone_settings:
          $ref: '#/components/schemas/blueprints_timezone_settings'
        language_settings:
          $ref: '#/components/schemas/blueprints_language_settings'
        strict_wifi_synchronization_settings:
          $ref: '#/components/schemas/blueprints_strict_wifi_synchronization_settings'
        strict_app_synchronization_settings:
          $ref: '#/components/schemas/blueprints_strict_app_synchronization_settings'
        apps:
          $ref: '#/components/schemas/blueprints_apps'
        files:
          $ref: '#/components/schemas/blueprints_files'
        wifi_networks:
          $ref: '#/components/schemas/blueprints_wifi_networks'
        saved_ap_settings:
          $ref: '#/components/schemas/blueprints_saved_ap_settings'
        mac_address_randomization_settings:
          $ref: '#/components/schemas/blueprints_mac_address_randomization_settings'
        esper_edgebox_settings:
          $ref: '#/components/schemas/blueprints_esper_edgebox_settings'
        app_layout_setting:
          $ref: '#/components/schemas/blueprints_app_layout_setting'
        app_order_setting:
          $ref: '#/components/schemas/blueprints_app_order_setting'
        advanced_configurations:
          $ref: '#/components/schemas/blueprints_advanced_configurations'
    blueprints_kiosk_mode_settings:
      type: object
      properties:
        app_id:
          type: string
        app_type:
          type: string
          enum:
            - VPP
            - TENANT_IOS
            - ESPER_IOS
            - WEBCLIP
            - PRELOADED
        disable_device_rotation:
          type: boolean
          default: false
        disable_screen_timeout:
          type: boolean
          default: true
    blueprints_local_app_install_settings_ios:
      type: object
      properties:
        apply_policy:
          $ref: '#/components/schemas/blueprints_apply_policy'
        allow_local_app_install:
          type: boolean
          default: true
      required:
        - apply_policy
        - allow_local_app_install
    blueprints_app_uninstall_settings_ios:
      type: object
      properties:
        apply_policy:
          $ref: '#/components/schemas/blueprints_apply_policy'
        allow_app_uninstallation:
          type: boolean
          default: true
      required:
        - apply_policy
        - allow_app_uninstallation
    blueprints_bluetooth_settings_ios:
      type: object
      properties:
        apply_policy:
          $ref: '#/components/schemas/blueprints_apply_policy'
        edit_bluetooth:
          type: boolean
          default: true
      required:
        - apply_policy
        - edit_bluetooth
    blueprints_nfc_settings_ios:
      type: object
      properties:
        apply_policy:
          $ref: '#/components/schemas/blueprints_apply_policy'
        allow_nfc:
          type: boolean
          default: true
      required:
        - apply_policy
        - allow_nfc
    blueprints_factory_reset_settings_ios:
      type: object
      properties:
        apply_policy:
          $ref: '#/components/schemas/blueprints_apply_policy'
        allow_factory_reset:
          type: boolean
          default: true
      required:
        - apply_policy
        - allow_factory_reset
    blueprints_screenshot_settings_ios:
      type: object
      properties:
        apply_policy:
          $ref: '#/components/schemas/blueprints_apply_policy'
        allow_screenshot:
          type: boolean
          default: true
    blueprints_custom_device_level_profile_settings_ios:
      type: object
      properties:
        apply_policy:
          $ref: '#/components/schemas/blueprints_apply_policy'
        custom_profile:
          type: string
          nullable: true
      required:
        - customized_profile
    blueprints_siri_settings_ios:
      type: object
      properties:
        apply_policy:
          $ref: '#/components/schemas/blueprints_apply_policy'
        allow_siri:
          type: boolean
          default: true
      required:
        - apply_policy
        - allow_siri
    blueprints_tethering_settings_ios:
      type: object
      properties:
        apply_policy:
          $ref: '#/components/schemas/blueprints_apply_policy'
        edit_hotspot:
          type: boolean
          default: true
    blueprints_camera_settings_ios:
      type: object
      properties:
        apply_policy:
          $ref: '#/components/schemas/blueprints_apply_policy'
        allow_camera_access:
          type: boolean
          default: true
    blueprints_hide_preloaded_apps_settings_ios:
      type: object
      properties:
        apply_policy:
          $ref: '#/components/schemas/blueprints_apply_policy'
        hide_preloaded_apps:
          type: boolean
          default: true
    blueprints_time_date_settings_ios:
      type: object
      properties:
        apply_policy:
          $ref: '#/components/schemas/blueprints_apply_policy'
        force_automatic_time_date:
          type: boolean
          default: false
    blueprints_wifi_network_ios:
      type: object
      properties:
        wifi_network_id:
          type: string
      required:
        - wifi_network_id
    blueprints_wifi_networks_ios:
      type: array
      items:
        $ref: '#/components/schemas/blueprints_wifi_network_ios'
    blueprints_ios_app:
      type: object
      properties:
        app_id:
          type: string
        app_version_id:
          type: string
        state:
          type: string
          enum:
            - SHOW
        app_type:
          type: string
          enum:
            - VPP
            - TENANT_IOS
            - ESPER_IOS
            - WEBCLIP
            - PRELOADED
        base64_app_config:
          type: string
        auto_update:
          type: boolean
          default: false
          description: >-
            Enable automatic updates for the app. Only allowed when app_type is
            VPP.
      required:
        - app_id
        - app_version_id
        - state
        - app_type
    blueprints_ios_apps:
      type: array
      items:
        $ref: '#/components/schemas/blueprints_ios_app'
    blueprints_provisioning_profile_ios:
      type: object
      properties:
        profile_id:
          type: string
          format: uuid
        profile_version_id:
          type: string
          format: uuid
      required:
        - profile_id
        - profile_version_id
    blueprints_provisioning_profiles_ios:
      type: array
      items:
        $ref: '#/components/schemas/blueprints_provisioning_profile_ios'
    blueprints_ios_wallpaper_settings:
      type: object
      properties:
        homescreen:
          type: object
          properties:
            apply_policy:
              $ref: '#/components/schemas/blueprints_apply_policy'
            portrait:
              type: object
              properties:
                wallpaper_id:
                  type: string
        lockscreen:
          type: object
          properties:
            apply_policy:
              $ref: '#/components/schemas/blueprints_apply_policy'
            portrait:
              type: object
              properties:
                wallpaper_id:
                  type: string
    blueprints_web_content_setting_ios:
      type: object
      properties:
        apply_policy:
          $ref: '#/components/schemas/blueprints_apply_policy'
        url_blocklist:
          type: array
          items:
            type: string
        url_allowlist:
          type: array
          items:
            type: string
    blueprints_defer_os_updates:
      type: object
      properties:
        apply_policy:
          $ref: '#/components/schemas/blueprints_apply_policy'
        defer_os_updates_delay:
          type: integer
          minimum: 0
          maximum: 90
    blueprints_iosSettings:
      type: object
      properties:
        kiosk_app:
          $ref: '#/components/schemas/blueprints_kiosk_mode_settings'
        device_mode_settings:
          $ref: '#/components/schemas/blueprints_device_mode_settings'
        local_app_install_settings:
          $ref: '#/components/schemas/blueprints_local_app_install_settings_ios'
        app_uninstall_settings:
          $ref: '#/components/schemas/blueprints_app_uninstall_settings_ios'
        bluetooth_settings:
          $ref: '#/components/schemas/blueprints_bluetooth_settings_ios'
        nfc_settings:
          $ref: '#/components/schemas/blueprints_nfc_settings_ios'
        factory_reset_settings:
          $ref: '#/components/schemas/blueprints_factory_reset_settings_ios'
        screenshot_settings:
          $ref: '#/components/schemas/blueprints_screenshot_settings_ios'
        custom_device_level_profile_settings:
          $ref: >-
            #/components/schemas/blueprints_custom_device_level_profile_settings_ios
        siri_settings:
          $ref: '#/components/schemas/blueprints_siri_settings_ios'
        tethering_settings:
          $ref: '#/components/schemas/blueprints_tethering_settings_ios'
        camera_settings:
          $ref: '#/components/schemas/blueprints_camera_settings_ios'
        hide_preloaded_apps_settings:
          $ref: '#/components/schemas/blueprints_hide_preloaded_apps_settings_ios'
        time_date_settings:
          $ref: '#/components/schemas/blueprints_time_date_settings_ios'
        wifi_networks:
          $ref: '#/components/schemas/blueprints_wifi_networks_ios'
        apps:
          $ref: '#/components/schemas/blueprints_ios_apps'
        provisioning_profiles:
          $ref: '#/components/schemas/blueprints_provisioning_profiles_ios'
        wallpaper_settings:
          $ref: '#/components/schemas/blueprints_ios_wallpaper_settings'
        web_content_settings:
          $ref: '#/components/schemas/blueprints_web_content_setting_ios'
        defer_os_updates:
          $ref: '#/components/schemas/blueprints_defer_os_updates'
        strict_wifi_synchronization_settings:
          $ref: '#/components/schemas/blueprints_strict_wifi_synchronization_settings'
    blueprints_tvos_kiosk_mode_settings:
      type: object
      description: >-
        Kiosk app configuration for tvOS. WEBCLIP and PRELOADED types are not
        allowed.
      properties:
        app_id:
          type: string
          format: uuid
        app_type:
          type: string
          enum:
            - VPP
            - TENANT_IOS
            - ESPER_IOS
      required:
        - app_id
        - app_type
    blueprints_wifi_access_points_tvos:
      type: object
      properties:
        apply_policy:
          $ref: '#/components/schemas/blueprints_apply_policy'
    blueprints_tvos_app:
      type: object
      description: >-
        App configuration for tvOS devices. WEBCLIP apps are not supported on
        tvOS.
      properties:
        app_id:
          type: string
          format: uuid
        app_version_id:
          type: string
          format: uuid
        state:
          type: string
          enum:
            - SHOW
        app_type:
          type: string
          enum:
            - VPP
            - TENANT_IOS
            - ESPER_IOS
            - PRELOADED
        base64_app_config:
          type: string
        auto_update:
          type: boolean
          default: false
          description: >-
            Enable automatic updates for the app. Only allowed when app_type is
            VPP.
      required:
        - app_id
        - app_version_id
        - state
        - app_type
    blueprints_tvos_apps:
      type: array
      items:
        $ref: '#/components/schemas/blueprints_tvos_app'
    blueprints_tvosSettings:
      type: object
      description: Configuration settings specific to tvOS (Apple TV) devices
      properties:
        device_mode_settings:
          $ref: '#/components/schemas/blueprints_device_mode_settings'
        kiosk_app:
          $ref: '#/components/schemas/blueprints_tvos_kiosk_mode_settings'
        custom_device_level_profile_settings:
          $ref: >-
            #/components/schemas/blueprints_custom_device_level_profile_settings_ios
        hide_preloaded_apps_settings:
          $ref: '#/components/schemas/blueprints_hide_preloaded_apps_settings_ios'
        time_date_settings:
          $ref: '#/components/schemas/blueprints_time_date_settings_ios'
        wifi_access_points:
          $ref: '#/components/schemas/blueprints_wifi_access_points_tvos'
        wifi_networks:
          $ref: '#/components/schemas/blueprints_wifi_networks_ios'
        apps:
          $ref: '#/components/schemas/blueprints_tvos_apps'
        provisioning_profiles:
          $ref: '#/components/schemas/blueprints_provisioning_profiles_ios'
        defer_os_updates:
          $ref: '#/components/schemas/blueprints_defer_os_updates'
        strict_wifi_synchronization_settings:
          $ref: '#/components/schemas/blueprints_strict_wifi_synchronization_settings'
    blueprints_shellScriptLinux:
      type: object
      properties:
        apply_policy:
          $ref: '#/components/schemas/blueprints_apply_policy'
        script:
          type: string
          description: The shell script to be executed.
        interpreter:
          type: string
          description: The interpreter to use for the script (e.g., bash).
        alias:
          type: string
          description: A user-friendly name or alias for the script.
        description:
          type: string
          description: A description of what the script does.
      required:
        - apply_policy
        - script
        - interpreter
        - alias
    blueprints_customShellScriptsMultiple:
      type: object
      properties:
        shell_scripts:
          type: array
          items:
            $ref: '#/components/schemas/blueprints_shellScriptLinux'
    blueprints_customActionLinux:
      type: object
      description: >-
        Reference to a custom action to be applied on Linux devices within a
        blueprint.
      properties:
        id:
          type: string
          format: uuid
          description: The UUID of the custom action to apply.
        options_key:
          type: string
          format: uuid
          description: The UUID of the specific option key within the Custom Action to use.
        apply_policy:
          $ref: '#/components/schemas/blueprints_apply_policy'
      required:
        - id
        - options_key
        - apply_policy
    blueprints_customActionsMultipleLinux:
      type: object
      description: Collection of custom actions to be applied on Linux devices.
      properties:
        custom_actions:
          type: array
          description: List of custom actions to apply to Linux devices.
          items:
            $ref: '#/components/schemas/blueprints_customActionLinux'
    blueprints_linuxFile:
      type: object
      properties:
        file_id:
          type: integer
        destination_path:
          type: string
          example: /tmp
      required:
        - file_id
        - destination_path
    blueprints_linuxFiles:
      type: array
      items:
        $ref: '#/components/schemas/blueprints_linuxFile'
    blueprints_linuxSettings:
      type: object
      description: Configuration settings specific to Linux devices in a blueprint
      properties:
        custom_shell_scripts_multiple:
          $ref: '#/components/schemas/blueprints_customShellScriptsMultiple'
        custom_actions_multiple:
          $ref: '#/components/schemas/blueprints_customActionsMultipleLinux'
        files:
          $ref: '#/components/schemas/blueprints_linuxFiles'
    blueprints_active_hours_settings_windows:
      type: object
      description: >-
        Windows active hours configuration for controlling update installation
        timing
      properties:
        active_hours_start:
          type: object
          description: Start time for active hours
          properties:
            apply_policy:
              $ref: '#/components/schemas/blueprints_apply_policy'
            time:
              type: integer
              minimum: 0
              maximum: 23
              default: 8
              description: Start hour in 24-hour format (0-23)
          required:
            - apply_policy
            - time
        active_hours_end:
          type: object
          description: End time for active hours
          properties:
            apply_policy:
              $ref: '#/components/schemas/blueprints_apply_policy'
            time:
              type: integer
              minimum: 0
              maximum: 23
              default: 17
              description: End hour in 24-hour format (0-23)
          required:
            - apply_policy
            - time
      required:
        - active_hours_start
        - active_hours_end
    blueprints_windows_app:
      type: object
      properties:
        app_id:
          type: string
        app_version_id:
          type: string
        state:
          type: string
          enum:
            - SHOW
        app_type:
          type: string
          enum:
            - TENANT_WINDOWS
            - ESPER_WINDOWS
            - TENANT_WINDOWS_EXE
            - TENANT_WINDOWS_UWP
        base64_app_config:
          type: string
      required:
        - app_id
        - app_version_id
        - state
        - app_type
    blueprints_windows_apps:
      type: array
      items:
        $ref: '#/components/schemas/blueprints_windows_app'
    blueprints_auto_update_settings_windows:
      type: object
      description: Windows automatic updates configuration
      properties:
        apply_policy:
          $ref: '#/components/schemas/blueprints_apply_policy'
        auto_update_type:
          type: string
          enum:
            - NOTIFY_DOWNLOAD
            - AUTO_INSTALL_AND_NOTIFY_RESTART
            - DEFAULT
            - SCHEDULED_INSTALL_AND_RESTART
            - AUTO_INSTALL_AND_RESTART_FORCED
            - 'OFF'
          default: DEFAULT
          description: >-
            Type of automatic update behavior, mapped to the Windows CSP
            Update/AllowAutoUpdate. NOTIFY_DOWNLOAD notifies before downloading;
            AUTO_INSTALL_AND_NOTIFY_RESTART auto-installs and notifies to
            schedule a restart; DEFAULT auto-installs and restarts (system
            default); SCHEDULED_INSTALL_AND_RESTART auto-installs and restarts
            at a scheduled time; AUTO_INSTALL_AND_RESTART_FORCED auto-installs
            and restarts without end-user control; OFF disables automatic
            updates.
      required:
        - apply_policy
        - auto_update_type
    blueprints_background_script_settings:
      type: object
      required:
        - id
      properties:
        id:
          type: string
          format: uuid
          description: Identifier of the background script registered in the tenant.
        apply_policy:
          type: string
          enum:
            - ALWAYS APPLY
            - IGNORE
            - PROVISION ONLY
          default: ALWAYS APPLY
    blueprints_background_scripts_windows:
      type: array
      maxItems: 5
      items:
        $ref: '#/components/schemas/blueprints_background_script_settings'
    blueprints_custom_policy_setting:
      type: object
      required:
        - apply_policy
        - is_atomic
        - b64_csp_payload
        - alias
      properties:
        apply_policy:
          type: string
          enum:
            - ALWAYS APPLY
            - IGNORE
            - PROVISION ONLY
          default: ALWAYS APPLY
        is_atomic:
          type: boolean
          default: false
        b64_csp_payload:
          type: string
          maxLength: 87382
          description: Base64-encoded CSP (SyncML/OMA-DM) payload.
        alias:
          type: string
          maxLength: 100
        description:
          type: string
          maxLength: 300
    blueprints_custom_policies_windows:
      type: array
      maxItems: 5
      items:
        $ref: '#/components/schemas/blueprints_custom_policy_setting'
    blueprints_powerShellScriptWindows:
      type: object
      properties:
        apply_policy:
          $ref: '#/components/schemas/blueprints_apply_policy'
        script:
          type: string
          description: The PowerShell script to be executed.
        interpreter:
          type: string
          maxLength: 255
          description: The interpreter to use for the script (e.g., powershell).
        alias:
          type: string
          maxLength: 100
          description: A user-friendly name or alias for the script.
        description:
          type: string
          maxLength: 300
          description: A description of what the script does.
      required:
        - apply_policy
        - script
        - interpreter
        - alias
    blueprints_customShellScriptsMultipleWindows:
      type: object
      properties:
        shell_scripts:
          type: array
          maxItems: 10
          items:
            $ref: '#/components/schemas/blueprints_powerShellScriptWindows'
    blueprints_defer_os_updates_windows:
      type: object
      description: >-
        Windows OS updates deferral configuration with separate quality and
        feature update controls
      properties:
        quality_updates:
          type: object
          description: Quality updates deferral settings
          properties:
            apply_policy:
              $ref: '#/components/schemas/blueprints_apply_policy'
            defer_days:
              type: integer
              minimum: 0
              maximum: 30
              default: 0
              description: Number of days to defer quality updates
          required:
            - apply_policy
            - defer_days
        feature_updates:
          type: object
          description: Feature updates deferral settings
          properties:
            apply_policy:
              $ref: '#/components/schemas/blueprints_apply_policy'
            defer_days:
              type: integer
              minimum: 0
              maximum: 365
              default: 0
              description: Number of days to defer feature updates
          required:
            - apply_policy
            - defer_days
      required:
        - quality_updates
        - feature_updates
    blueprints_windows_kiosk_win32_single_app_config:
      type: object
      description: Win32 single-app kiosk configuration. Defaults applied if not provided.
      properties:
        name:
          type: string
          description: Name of the kiosk profile
        desktop_app_path:
          type: string
          description: Absolute path to the kiosk desktop app executable (required)
        auto_launch:
          type: boolean
          default: true
          description: Automatically launch the app
        auto_launch_arguments:
          type: string
          default: ''
          description: Arguments passed to the app on launch
        hide_taskbar:
          type: boolean
          default: true
          description: Hide Windows taskbar
        hide_start_recommended_section:
          type: boolean
          default: true
          description: Hide Recommended section from Start menu
        hide_power_button:
          type: boolean
          default: false
          description: Hide power button in Start menu
    blueprints_windows_kiosk_uwp_single_app_config:
      type: object
      description: >
        UWP single-app kiosk configuration. app_id must match an entry in
        windows.apps with app_type TENANT_WINDOWS_UWP.
      required:
        - app_id
      properties:
        app_id:
          type: string
          format: uuid
          description: >-
            UUID of the UWP app. Must be present in windows.apps with app_type
            TENANT_WINDOWS_UWP.
    blueprints_windows_kiosk_settings:
      type: object
      description: >
        Windows kiosk configuration. kiosk_type determines the kiosk mechanism:
        CONFIGURATION uses Windows Assigned Access, SHELL_LAUNCHER uses Shell
        Launcher. Exactly one of win32_single_app_config or
        uwp_single_app_config must be set when kiosk_settings is present.
        kiosk_type defaults to CONFIGURATION if omitted (backward compatible
        with pre-existing blueprints).
      properties:
        kiosk_type:
          type: string
          enum:
            - CONFIGURATION
            - SHELL_LAUNCHER
          default: CONFIGURATION
          description: >
            Kiosk mechanism to use. CONFIGURATION uses Windows Assigned Access;
            SHELL_LAUNCHER uses Shell Launcher. Defaults to CONFIGURATION if
            omitted.
        win32_single_app_config:
          $ref: >-
            #/components/schemas/blueprints_windows_kiosk_win32_single_app_config
        uwp_single_app_config:
          $ref: '#/components/schemas/blueprints_windows_kiosk_uwp_single_app_config'
    blueprints_pause_os_updates_windows:
      type: object
      description: Windows pause OS updates configuration
      properties:
        apply_policy:
          $ref: '#/components/schemas/blueprints_apply_policy'
        pause_os_updates:
          type: boolean
          default: false
          description: Whether to pause OS updates
      required:
        - apply_policy
        - pause_os_updates
    blueprints_scheduled_install_settings_windows:
      type: object
      description: >-
        Windows scheduled install configuration. Only valid when
        auto_update_type is SCHEDULED_INSTALL_AND_RESTART or
        AUTO_INSTALL_AND_RESTART_FORCED. Each sub-field is optional — omitting
        it leaves the corresponding Windows default in effect (3 AM, every day,
        every week).
      properties:
        scheduled_install_day:
          type: object
          description: >-
            Day of the week for scheduled install. Maps to
            Update/ScheduledInstallDay CSP.
          properties:
            apply_policy:
              $ref: '#/components/schemas/blueprints_apply_policy'
            day:
              type: string
              enum:
                - EVERY_DAY
                - SUNDAY
                - MONDAY
                - TUESDAY
                - WEDNESDAY
                - THURSDAY
                - FRIDAY
                - SATURDAY
              nullable: true
          required:
            - apply_policy
        scheduled_install_week:
          type: object
          description: >-
            Week of the month for scheduled install. Maps to
            Update/ScheduledInstall*Week CSPs.
          properties:
            apply_policy:
              $ref: '#/components/schemas/blueprints_apply_policy'
            week:
              type: string
              enum:
                - ALL
                - FIRST
                - SECOND
                - THIRD
                - FOURTH
              nullable: true
          required:
            - apply_policy
        scheduled_install_time:
          type: object
          description: >-
            Hour of day for scheduled install (0 = 12 AM, 23 = 11 PM). Maps to
            Update/ScheduledInstallTime CSP.
          properties:
            apply_policy:
              $ref: '#/components/schemas/blueprints_apply_policy'
            time:
              type: integer
              minimum: 0
              maximum: 23
              nullable: true
          required:
            - apply_policy
    blueprints_unenrollment_settings_windows:
      type: object
      properties:
        apply_policy:
          $ref: '#/components/schemas/blueprints_apply_policy'
        allow_unenrollment_from_device:
          type: boolean
      required:
        - apply_policy
        - allow_unenrollment_from_device
    blueprints_windows_wallpaper_settings:
      type: object
      description: >-
        Configuration for Windows desktop wallpaper settings including
        homescreen and lockscreen backgrounds. Uses landscape orientation only.
      properties:
        homescreen:
          type: object
          description: Wallpaper settings for the Windows desktop homescreen
          properties:
            apply_policy:
              $ref: '#/components/schemas/blueprints_apply_policy'
            landscape:
              type: object
              description: Landscape wallpaper configuration
              properties:
                wallpaper_id:
                  type: string
                  format: uuid
                  nullable: true
                  description: Unique identifier for the wallpaper resource
        lockscreen:
          type: object
          description: Wallpaper settings for the Windows lock screen
          properties:
            apply_policy:
              $ref: '#/components/schemas/blueprints_apply_policy'
            landscape:
              type: object
              description: Landscape wallpaper configuration
              properties:
                wallpaper_id:
                  type: string
                  format: uuid
                  nullable: true
                  description: Unique identifier for the wallpaper resource
    blueprints_wifi_network_windows:
      type: object
      properties:
        wifi_network_id:
          type: string
      required:
        - wifi_network_id
    blueprints_wifi_networks_windows:
      type: array
      items:
        $ref: '#/components/schemas/blueprints_wifi_network_windows'
    blueprints_windowsSettings:
      type: object
      properties:
        active_hours_settings:
          $ref: '#/components/schemas/blueprints_active_hours_settings_windows'
        apps:
          $ref: '#/components/schemas/blueprints_windows_apps'
        auto_update_settings:
          $ref: '#/components/schemas/blueprints_auto_update_settings_windows'
        background_scripts:
          $ref: '#/components/schemas/blueprints_background_scripts_windows'
        bluetooth_settings:
          $ref: '#/components/schemas/blueprints_bluetooth_settings'
        camera_settings:
          $ref: '#/components/schemas/blueprints_camera_settings'
        custom_policies:
          $ref: '#/components/schemas/blueprints_custom_policies_windows'
        custom_shell_scripts_multiple:
          $ref: '#/components/schemas/blueprints_customShellScriptsMultipleWindows'
        device_mode_settings:
          $ref: '#/components/schemas/blueprints_device_mode_settings'
        defer_os_updates:
          $ref: '#/components/schemas/blueprints_defer_os_updates_windows'
        factory_reset_settings:
          $ref: '#/components/schemas/blueprints_factory_reset_settings'
        kiosk_settings:
          $ref: '#/components/schemas/blueprints_windows_kiosk_settings'
        pause_os_updates:
          $ref: '#/components/schemas/blueprints_pause_os_updates_windows'
        scheduled_install_settings:
          $ref: '#/components/schemas/blueprints_scheduled_install_settings_windows'
        timezone_settings:
          $ref: '#/components/schemas/blueprints_timezone_settings'
        unenrollment_settings:
          $ref: '#/components/schemas/blueprints_unenrollment_settings_windows'
        wallpaper_settings:
          $ref: '#/components/schemas/blueprints_windows_wallpaper_settings'
        wifi_networks:
          $ref: '#/components/schemas/blueprints_wifi_networks_windows'
    blueprints_settingsV2:
      type: object
      properties:
        android:
          $ref: '#/components/schemas/blueprints_settings'
        ios:
          $ref: '#/components/schemas/blueprints_iosSettings'
        tvos:
          $ref: '#/components/schemas/blueprints_tvosSettings'
        linux:
          $ref: '#/components/schemas/blueprints_linuxSettings'
        windows:
          $ref: '#/components/schemas/blueprints_windowsSettings'
    blueprints_BlueprintV2:
      type: object
      properties:
        id:
          type: string
          format: uuid
          readOnly: true
        name:
          type: string
          description: Name of the blueprint
        description:
          type: string
          description: Description of the blueprint
        comments:
          type: string
          description: Comments on the blueprint
        version_number:
          type: integer
          readOnly: true
        version_id:
          type: string
          format: uuid
          readOnly: true
        minor_version_number:
          type: integer
          readOnly: true
        publish:
          type: boolean
          readOnly: true
        settings:
          $ref: '#/components/schemas/blueprints_settingsV2'
        created_by:
          type: string
          description: ID of the user who created the blueprint
          readOnly: true
        updated_by:
          type: string
          description: ID of the user who updated the blueprint
          readOnly: true
        created_at:
          type: string
          format: date-time
          readOnly: true
        updated_at:
          type: string
          format: date-time
          readOnly: true
    blueprints_BlueprintV2Put:
      allOf:
        - $ref: '#/components/schemas/blueprints_BlueprintV2'
        - type: object
          properties:
            publish:
              type: boolean
              description: |
                Field to indicate whether to publish the blueprint
              readOnly: false
    blueprints_customActionBase:
      type: object
      properties:
        name:
          type: string
          minLength: 1
          maxLength: 50
          description: Custom Action name
        type:
          type: string
          enum:
            - button
            - toggle
            - radio
            - dropdown
          description: The UI component type for this custom action
        state:
          type: string
          enum:
            - draft
            - active
            - inactive
          description: >-
            The current operational state of the custom action. Only active
            custom actions can be deployed to Linux devices.
        position_in_blueprints:
          type: string
          enum:
            - none
            - blueprints_apps_and_configuration
            - blueprints_connectivity
            - blueprints_device_security
            - blueprints_display_and_branding
            - blueprints_esper_settings
            - blueprints_scripts
            - blueprints_files
            - blueprints_platform_services
            - blueprints_hardware_settings
            - blueprints_sound
            - blueprints_system_updates
            - blueprints_time_and_date
          description: The location in the blueprint where the custom action will be added
        position_in_device_settings:
          type: string
          enum:
            - none
            - device_quick_settings
          description: >-
            The location in the device's Quick Actions where the custom action
            will be added
        properties:
          type: object
          description: Object for the description, info_message, and tooltip_message.
      required:
        - name
        - type
        - state
        - position_in_blueprints
        - position_in_device_settings
        - properties
    blueprints_platformScriptResponse:
      type: object
      properties:
        script_id:
          type: string
          format: uuid
          description: Script identifier stored in external storage
      required:
        - script_id
    blueprints_options_response:
      type: object
      properties:
        label:
          type: string
          description: Label shown on the UI
        key:
          type: string
          format: uuid
          description: Unique key identifier for the option
        scripts:
          type: object
          description: >-
            Platform-specific script references. Currently only Linux platform
            is supported. Platform key must be lowercase "linux".
          properties:
            linux:
              $ref: '#/components/schemas/blueprints_platformScriptResponse'
          required:
            - linux
          additionalProperties: false
      required:
        - label
        - key
        - scripts
    blueprints_CustomActionRead:
      allOf:
        - $ref: '#/components/schemas/blueprints_customActionBase'
        - type: object
          properties:
            id:
              type: string
              format: uuid
              description: Unique identifier for the custom action
            options:
              type: array
              items:
                $ref: '#/components/schemas/blueprints_options_response'
              description: List of options for the custom action
            created_at:
              type: string
              format: date-time
              description: When the custom action was created
            updated_at:
              type: string
              format: date-time
              description: When the custom action was last updated
            created_by:
              type: integer
              description: User ID who created the custom action
            updated_by:
              type: integer
              description: User ID who last updated the custom action
          required:
            - id
            - options
            - created_at
            - updated_at
            - created_by
            - updated_by
    blueprints_platformScriptRequest:
      type: object
      properties:
        script:
          type: string
          description: The script content to be executed on Linux devices
        interpreter:
          type: string
          maxLength: 255
          description: >-
            Interpreter used to run the script. Default is "bash" if not
            specified. Common values include "bash", "sh", "python", "python3"
          default: bash
      required:
        - script
        - interpreter
    blueprints_optionsRequest:
      type: object
      properties:
        label:
          type: string
          description: Label shown on the UI
        key:
          type: string
          format: uuid
          description: Unique key identifier for the option
        scripts:
          type: object
          description: >-
            Platform-specific scripts. Currently only Linux platform is
            supported. Platform key must be lowercase "linux".
          properties:
            linux:
              $ref: '#/components/schemas/blueprints_platformScriptRequest'
          required:
            - linux
          additionalProperties: false
      required:
        - label
        - key
        - scripts
    blueprints_CustomActionCreate:
      allOf:
        - $ref: '#/components/schemas/blueprints_customActionBase'
        - type: object
          properties:
            options:
              type: array
              items:
                $ref: '#/components/schemas/blueprints_optionsRequest'
              description: List of options for the custom action
          required:
            - options
    blueprints_CustomActionUpdate:
      type: object
      properties:
        name:
          type: string
          minLength: 1
          maxLength: 50
          description: Custom action name
        type:
          type: string
          enum:
            - button
            - toggle
            - radio
            - dropdown
          description: The UI component type for this custom action
        state:
          type: string
          enum:
            - draft
            - active
            - inactive
          description: The current operational state of the custom action
        position_in_blueprints:
          type: string
          enum:
            - none
            - blueprints_apps_and_configuration
            - blueprints_connectivity
            - blueprints_device_security
            - blueprints_display_and_branding
            - blueprints_esper_settings
            - blueprints_scripts
            - blueprints_files
            - blueprints_platform_services
            - blueprints_hardware_settings
            - blueprints_sound
            - blueprints_system_updates
            - blueprints_time_and_date
          description: The location in the blueprint where the custom action will be added
        position_in_device_settings:
          type: string
          enum:
            - none
            - device_quick_settings
          description: >-
            The location in the device's Quick Actions where the custom action
            will be added
        properties:
          type: object
          description: >-
            Object for the description, info_message, and tooltip_message.
            Replaces the existing properties.
        options:
          type: array
          items:
            $ref: '#/components/schemas/blueprints_optionsRequest'
          description: A new list of options to replace the existing ones
      description: Update a custom action. All fields are optional.
    blueprints_platformScript:
      type: object
      properties:
        script:
          type: string
          description: The script content
        interpreter:
          type: string
          description: Interpreter used to run the script
      required:
        - script
        - interpreter
    blueprints_BackgroundScriptRead:
      type: object
      properties:
        id:
          type: string
          format: uuid
          description: Unique identifier for the background script
        name:
          type: string
          description: Name of the background script
        interpreter:
          type: string
          description: Interpreter used to run the script
        always_run:
          type: boolean
          description: Whether the script runs continuously
        frequency_in_mins:
          type: integer
          nullable: true
          description: Interval in minutes between script executions
        timeout_in_mins:
          type: integer
          description: Maximum runtime in minutes before the script is terminated.
        description:
          type: string
          description: Description of the background script. Empty string if not set.
        created_at:
          type: string
          format: date-time
          description: When the background script was created
        updated_at:
          type: string
          format: date-time
          description: When the background script was last updated
        created_by:
          type: integer
          description: User ID who created the background script
        updated_by:
          type: integer
          description: User ID who last updated the background script
      required:
        - id
        - name
        - interpreter
        - always_run
        - timeout_in_mins
        - created_at
        - updated_at
        - created_by
        - updated_by
    blueprints_BackgroundScriptCreate:
      type: object
      properties:
        name:
          type: string
          minLength: 1
          maxLength: 50
          description: Name of the background script
        script:
          type: string
          description: The script content to be executed on devices
        interpreter:
          type: string
          maxLength: 50
          default: powershell
          description: >-
            Interpreter used to run the script. Currently only 'powershell' is
            supported.
        always_run:
          type: boolean
          description: >-
            Whether the script runs continuously. When true, frequency_in_mins
            must be null.
        frequency_in_mins:
          type: integer
          nullable: true
          description: >-
            Interval in minutes between script executions. Required when
            always_run is false, must be null when always_run is true.
        timeout_in_mins:
          type: integer
          minimum: 1
          default: 60
          description: >-
            Maximum runtime in minutes before the script is terminated. Must be
            > 0. Defaults to 60 if omitted.
        description:
          type: string
          maxLength: 300
          nullable: true
          description: Optional description for the background script. Max 300 characters.
      required:
        - name
        - script
        - always_run
    blueprints_BackgroundScriptDetailRead:
      allOf:
        - $ref: '#/components/schemas/blueprints_BackgroundScriptRead'
        - type: object
          properties:
            script:
              type: string
              description: The script content fetched from S3
          required:
            - script
    pipelines_Pipeline:
      type: object
      properties:
        id:
          type: string
          readOnly: true
        enterprise_id:
          type: string
          readOnly: true
        name:
          type: string
        description:
          type: string
        is_active:
          type: boolean
        is_valid:
          type: boolean
        is_visible:
          type: boolean
        is_archived:
          type: boolean
        is_default:
          type: boolean
        timeout_seconds:
          type: number
          format: int32
        created_by:
          type: number
          format: int32
        updated_by:
          type: number
          format: int32
        created_at:
          type: string
          format: date-time
        updated_at:
          type: string
          format: date-time
      required:
        - name
        - created_by
        - updated_by
    pipelines_Pipeline_POST:
      type: object
      properties:
        name:
          type: string
        description:
          type: string
        is_default:
          type: boolean
          default: false
        is_active:
          type: boolean
          default: true
        timeout_seconds:
          type: number
          format: int32
          default: 86400
      required:
        - name
    pipelines_Error_400_Bad_Data:
      type: object
      properties:
        code:
          type: integer
          format: int32
          default: 400
        message:
          type: string
        content:
          type: object
      required:
        - code
        - message
    pipelines_Error_401_Unauthorized:
      type: object
      properties:
        code:
          type: integer
          format: int32
          default: 401
        message:
          type: string
        content:
          type: object
      required:
        - code
        - message
    pipelines_Pipeline_PUT:
      type: object
      properties:
        name:
          type: string
        description:
          type: string
        is_active:
          type: boolean
        is_default:
          type: boolean
        timeout_seconds:
          type: number
          format: int32
    pipelines_Stage:
      type: object
      properties:
        id:
          type: string
          readOnly: true
        enterprise_id:
          type: string
          readOnly: true
        pipeline_id:
          type: string
        description:
          type: string
        name:
          type: string
        timeout_seconds:
          type: number
          format: int32
        created_by:
          type: number
          format: int32
        updated_by:
          type: number
          format: int32
        created_at:
          type: string
          format: date-time
        updated_at:
          type: string
          format: date-time
    pipelines_Stage_POST:
      type: object
      properties:
        name:
          type: string
        description:
          type: string
        timeout_seconds:
          type: number
          format: int32
      required:
        - name
    pipelines_Stage_PUT:
      type: object
      properties:
        name:
          type: string
        description:
          type: string
        timeout_seconds:
          type: number
          format: int32
    pipelines_TargetList:
      type: object
      properties:
        id:
          type: string
          readOnly: true
        pipeline_id:
          type: string
        name:
          type: string
        target_list_type:
          type: string
        created_by:
          type: number
          format: int32
        updated_by:
          type: number
          format: int32
        created_at:
          type: string
          format: date-time
        updated_at:
          type: string
          format: date-time
    pipelines_StageTargetList_POST:
      type: object
      properties:
        target_list_id:
          type: string
          format: uuid
      required:
        - target_list_id
    pipelines_OperationList:
      type: object
      properties:
        id:
          type: string
          readOnly: true
        pipeline_id:
          type: string
        stage_id:
          type: string
        name:
          type: string
        description:
          type: string
        created_by:
          type: number
          format: int32
        updated_by:
          type: number
          format: int32
        created_at:
          type: string
          format: date-time
        updated_at:
          type: string
          format: date-time
    pipelines_OperationList_POST:
      type: object
      properties:
        name:
          type: string
        description:
          type: string
        pipeline_id:
          type: string
          format: uuid
      required:
        - name
    pipelines_TargetList_POST:
      type: object
      properties:
        name:
          type: string
        target_list_type:
          type: string
          enum:
            - DEVICES
            - GROUPS
            - COLLECTIONS
      required:
        - name
        - target_list_type
    pipelines_Target:
      type: object
      properties:
        id:
          type: string
          readOnly: true
        pipeline_id:
          type: string
          format: uuid
        device_id:
          type: string
          format: uuid
        device_name:
          type: string
        device_alias:
          type: string
        is_active:
          type: boolean
        created_by:
          type: number
          format: int32
        updated_by:
          type: number
          format: int32
        created_at:
          type: string
          format: date-time
        updated_at:
          type: string
          format: date-time
    pipelines_Target_POST:
      type: object
      properties:
        device_id:
          type: string
          format: uuid
        device_alias:
          type: string
        device_name:
          type: string
        is_active:
          type: boolean
      required:
        - device_id
        - device_name
    pipelines_Target_PUT:
      type: object
      properties:
        device_name:
          type: string
        is_active:
          type: boolean
    pipelines_Error_500_Internal_Server_Error:
      type: object
      properties:
        code:
          type: integer
          format: int32
          default: 500
        message:
          type: string
        content:
          type: object
      required:
        - code
        - message
    pipelines_TargetListDeviceGroup:
      type: object
      properties:
        id:
          type: string
          readOnly: true
        device_group_id:
          type: string
        target_list_id:
          type: string
        created_by:
          type: number
          format: int32
        updated_by:
          type: number
          format: int32
        created_at:
          type: string
          format: date-time
        updated_at:
          type: string
          format: date-time
    pipelines_TargetListDeviceGroups_POST:
      type: object
      properties:
        device_group_id:
          type: string
          format: uuid
          description: UUID of the Device Group
    pipelines_Device:
      type: object
      properties:
        id:
          type: string
          format: uuid
          description: UUID of the Device
        device_name:
          type: string
          description: Name of the device
        serial:
          type: string
          description: Device serial number
        template_name:
          type: string
          description: Device template name
        manufacturer:
          type: string
          description: Manufacturer of the Device
        android_version:
          type: string
          description: Version number of android
        api_level:
          type: string
          description: Device api level
        is_gms:
          type: boolean
          description: Is this a gms device
        is_active:
          type: boolean
        model:
          type: string
          description: Device model number
        alias_name:
          type: string
          description: Device alias
        esper_client:
          type: string
    pipelines_Operation:
      type: object
      properties:
        id:
          type: string
          readOnly: true
        operation_list_id:
          type: string
        pipeline_id:
          type: string
        operation_type:
          type: string
        args:
          type: string
        created_by:
          type: number
          format: int32
        updated_by:
          type: number
          format: int32
        created_at:
          type: string
          format: date-time
        updated_at:
          type: string
          format: date-time
    pipelines_Operation_POST:
      type: object
      properties:
        args:
          type: object
          description: Arguments for the operation
        operation_type:
          type: string
          enum:
            - LOCK
            - REBOOT
            - SET_NEW_POLICY
            - UPDATE_HEARTBEAT
            - REQUEST_BUGREPORT
            - REQUEST_DPCLOG
            - ADD_TO_WHITELIST
            - REMOVE_FROM_WHITELIST
            - SET_APP_PERMISSION
            - WIPE
            - CAPTURE_SCREENSHOT
            - SET_WIFI_STATE
            - SET_BLUETOOTH_STATE
            - SET_ROTATION_STATE
            - SET_GPS_STATE
            - SET_BRIGHTNESS_SCALE
            - SET_STREAM_VOLUME
            - SET_SCREEN_OFF_TIMEOUT
            - SET_ADB_STATE
            - INITIATE_OFFER
            - INSTALL
            - SIMPLE_INSTALL
            - UNINSTALL
            - REFRESH_APPLIST
            - UPDATE_LATEST_DPC
            - NOTIFY_OTA
            - CLEAR_APP_DATA
            - SET_GEO_FENCE
            - SET_KIOSK_APP
            - SET_DEVICE_LOCKDOWN_STATE
            - SET_TIMEZONE
            - SET_APP_STATE
            - ADD_WIFI_AP
            - REMOVE_WIFI_AP
            - UPDATE_WIFI_AP
            - UPDATE_DEVICE_CONFIG
            - INITIATE_CONFERENCE_CALL
            - ADD_OVERRIDE_APN
            - SYNC_CONTENT
            - SET_WALLPAPER
    pipelines_PipelineRun:
      type: object
      properties:
        id:
          type: string
          readOnly: true
        enterprise_id:
          type: string
          readOnly: true
        run_number:
          type: integer
          format: int32
          readOnly: true
        pipeline_id:
          type: string
        pipeline_name:
          type: string
        status:
          type: string
          enum:
            - pending
            - queued
            - processing
            - running
            - waiting
            - complete
            - success
            - failure
            - cancelled
            - invalid
            - timeout
        status_meta:
          type: object
        created_by:
          type: number
          format: int32
        updated_by:
          type: number
          format: int32
        created_at:
          type: string
          format: date-time
        updated_at:
          type: string
          format: date-time
        started_at:
          type: string
          format: date-time
        ended_at:
          type: string
          format: date-time
    pipelines_PipelineRun_POST:
      type: object
    pipelines_PipelineRun_PUT:
      type: object
      properties:
        status:
          type: string
          enum:
            - pending
            - queued
            - processing
            - running
            - waiting
            - complete
            - success
            - failure
            - cancelled
            - invalid
            - timeout
    pipelines_StageRun:
      type: object
      properties:
        id:
          type: string
          readOnly: true
        enterprise_id:
          type: string
          readOnly: true
        pipeline_id:
          type: string
        pipeline_run_id:
          type: string
        stage_id:
          type: string
        stage_meta:
          type: object
          properties:
            name:
              type: string
            description:
              type: string
            created_by:
              type: number
              format: int32
        status:
          type: string
          enum:
            - pending
            - queued
            - processing
            - running
            - complete
            - success
            - failure
            - cancelled
            - invalid
            - timeout
        created_by:
          type: number
          format: int32
        updated_by:
          type: number
          format: int32
        created_at:
          type: string
          format: date-time
        updated_at:
          type: string
          format: date-time
        started_at:
          type: string
          format: date-time
        ended_at:
          type: string
          format: date-time
    pipelines_StageRunOperation:
      type: object
      properties:
        id:
          type: string
          readOnly: true
        operation_type:
          type: string
        args:
          type: string
        created_by:
          type: number
          format: int32
        updated_by:
          type: number
          format: int32
        created_at:
          type: string
          format: date-time
        updated_at:
          type: string
          format: date-time
    pipelines_TargetRun:
      type: object
      properties:
        id:
          type: string
          readOnly: true
        target_id:
          type: string
          format: uuid
        device_id:
          type: string
          format: uuid
        device_alias:
          type: string
          format: uuid
        stage_run_id:
          type: string
          format: uuid
        stage_run_operation_id:
          type: string
          format: uuid
        command_id:
          type: string
        command_status:
          type: string
        command_meta:
          type: object
        status:
          type: string
          enum:
            - pending
            - queued
            - processing
            - dispatched
            - running
            - complete
            - success
            - failure
            - cancelled
            - timeout
            - invalid
        created_by:
          type: number
          format: int32
        updated_by:
          type: number
          format: int32
        created_at:
          type: string
          format: date-time
        updated_at:
          type: string
          format: date-time
        started_at:
          type: string
          format: date-time
        ended_at:
          type: string
          format: date-time
    pipelines_TargetRun_POST:
      type: object
      properties:
        target_id:
          type: string
          format: uuid
        device_name:
          type: string
        device_alias:
          type: string
      required:
        - target_id
    pipelines_TargetRun_PUT:
      type: object
      properties:
        status:
          type: string
          enum:
            - pending
            - queued
            - processing
            - dispatched
            - running
            - complete
            - success
            - failure
            - cancelled
            - invalid
        device_name:
          type: string
    pipelines_CommandResponse:
      type: object
      properties:
        target_run_id:
          type: string
          format: uuid
        operation_id:
          type: string
          format: uuid
        enterprise_id:
          type: string
          format: uuid
        command:
          type: string
        command_type:
          type: string
          default: DEVICE
        device_type:
          type: string
          default: all
        device_id:
          type: string
          format: uuid
        schedule:
          type: string
          default: IMMEDIATE
        args:
          type: object
        request_id:
          type: string
          format: uuid
        request_status:
          type: string
        request_status_reason:
          type: string
    pipelines_AndroidCommandRequest:
      type: object
    pipelines_CommandRequest_PUT:
      type: object
      properties:
        request_status:
          type: string
          enum:
            - cancelled
    pipelines_Error:
      type: object
      properties:
        code:
          type: integer
          format: int32
        message:
          type: string
        content:
          type: object
      required:
        - code
        - message
    pipelines_Health:
      type: object
      properties:
        service:
          type: string
        component:
          type: string
        hostname:
          type: string
      required:
        - service
        - component
        - hostname
    device_DeviceStateEnumAndroid:
      type: integer
      format: int32
      description: >
        The following are the device states and their descriptions:

        ```

        * 0 = Device State is Unspecified

        * 1 = Online

        * 20 = Disabled (device has been factory reset or removed from the Esper
        Dashboard)

        * 30 = Beginning Provisioning

        * 40 = Configuring Google Play (still provisioning)

        * 50 = Applying Policies and Installing Applications (still
        provisioning)

        * 60 = Offline

        * 70 = Device is undergoing a Factory Reset (reset started from
        Dashboard)

        * 80 = Device Onboarding in Progress

        * 90 = Device Onboarding Failed

        * 100 = Device Onboarded in Esper

        * 110 = Android For Work Account added

        * 120 = Apps installed

        * 130 = Branding Processed

        * 140 = Permission Policy Processed

        * 150 = Device Policy Processed

        * 160 = Device Settings Processed

        * 170 = Security Policy Processed

        * 180 = Phone Policy Processed

        * 190 = Custom Settings Processed

        * 200 = Device is Registered

        ```
      enum:
        - 0
        - 1
        - 20
        - 30
        - 40
        - 50
        - 60
        - 70
        - 80
        - 90
        - 100
        - 110
        - 120
        - 130
        - 140
        - 150
        - 160
        - 170
        - 180
        - 190
        - 200
    device_HardwareInfo:
      type: object
      properties:
        brand:
          type: string
          description: The brand of the device
        model:
          type: string
          description: The model of the device
        model_number:
          type: string
          description: The model number of the device
        serial:
          type: string
          description: The serial number of the device
        manufacturer:
          type: string
          description: The manufacturer number of the device
        hardware:
          type: string
          description: The hardware information of the device
        device_baseband_version:
          type: string
          description: The device baseband version of the device
    device_FoundationInfo:
      type: object
      properties:
        major_version:
          type: string
          description: The foundation OS build major version of the device
        minor_version:
          type: string
          description: The foundation OS build minor version of the device
        build_number:
          type: string
          description: The foundation OS build number of the device
        project_name:
          type: string
          description: The foundation project name of the device
        build_flavor:
          type: string
          description: The foundation OS build flavor of the device
        variant:
          type: string
          description: The foundation variant of the device
        foundation_device_model_id:
          type: string
          description: The foundation device model id of the device
    device_AirwaveInfo:
      type: object
      properties:
        build_number:
          type: integer
          description: The airwave OS build number of the device
        tenant_model_id:
          type: string
          description: The airwave tenant model id of the device
        build_id:
          type: string
          description: The airwave build id of the device
        esper_ota_manager_version_code:
          type: integer
          description: The Esper OTA Manager version code
        esper_ota_manager_version_name:
          type: string
          description: The Esper OTA Manager version name
    device_SoftwareInfo:
      type: object
      properties:
        os_version:
          type: string
          description: The OS version number of the device
        os_build_number:
          type: string
          description: The OS build number of the device
        bootloader_version:
          type: string
          description: The bootloader version of the device
        security_path_level:
          type: string
          description: The security path level of the device
        device_kernel_version:
          type: string
          description: The kernel version of the device
        eea_version:
          type: string
          description: EEA (Esper Enterprise Android) version
        esper_agent_info:
          type: object
          properties:
            version_code:
              type: string
              description: Esper agent version code
            version_name:
              type: string
              description: Esper agent version name
        foundation_info:
          $ref: '#/components/schemas/device_FoundationInfo'
        airwave_info:
          $ref: '#/components/schemas/device_AirwaveInfo'
    device_NetworkInfo:
      type: object
      properties:
        imei1:
          type: string
          description: The IMEI number of the device
        imei2:
          type: string
          description: The IMEI number of the device
        wifi_mac_address:
          type: string
          description: The wifi mac address of the device
        ethernet_mac_address:
          type: string
          description: The ethernet mac address of the device
        iccid1:
          type: string
          description: The ICCID number of the device
        iccid2:
          type: string
          description: The ICCID number of the device
        phone_number_1:
          type: string
          description: The phone number of the device
        phone_number_2:
          type: string
          description: The phone number of the device
        network_type:
          type: string
          description: The network type of the device
          enum:
            - CELLULAR
            - ETHERNET
            - WI-FI
            - OTHER
    device_MemoryInfo:
      type: object
      properties:
        total_ram:
          type: string
          description: Total ram capacity for the device
        total_internal_storage:
          type: string
          description: The total internal storage capacity of the device
        units:
          type: string
          description: The units used for the storage capacity
        internal_storage_binary_prefix:
          type: string
          description: (Specific to Android devices)
    device_NetworkStats:
      type: object
      properties:
        current_active_connection:
          type: string
          description: The current active connection type
        wifi_network_info:
          type: object
          properties:
            wifi_ssid:
              type: string
              description: The SSID of the WiFi network
        cellular_network_info:
          type: object
          properties:
            network_type:
              type: string
              description: The network type of the cellular network - null, 2G, 3G, 4G LTE
    device_LocationStats:
      type: object
      properties:
        altitude:
          type: string
          description: The altitude value
        latitude:
          type: string
          description: The latitude value
        longitude:
          type: string
          description: The longitude value
    device_BlueprintInfo:
      type: object
      properties:
        assigned_blueprint_id:
          type: string
          description: Assigned blueprint id of the device
        current_blueprint_id:
          type: string
          description: Current blueprint id of the blueprint assigned to the device
        current_blueprint_version_id:
          type: string
          description: Current Version id of the blueprint assigned to the device
        blueprint_upgrade_status:
          type: string
          description: The status of the blueprint upgrade on the device
          enum:
            - UPGRADABLE
            - UPGRADE_INITIATED
            - UPGRADE_FAILED
            - UPGRADED
            - NOT_UPGRADABLE
            - NOT_APPLICABLE
    device_AndroidDevice:
      type: object
      properties:
        id:
          type: string
          format: uuid
          readOnly: true
        name:
          type: string
          description: Esper generated name for the device
        alias:
          type: string
          description: Alias/alternate name for the device
        os:
          type: string
          description: Operating system for the device
          enum:
            - Android
        state:
          $ref: '#/components/schemas/device_DeviceStateEnumAndroid'
        platform:
          type: string
          description: Platform for the device
          enum:
            - ANDROID
        serial:
          type: string
          description: Serial number the device
        os_version:
          type: string
          description: OS version the device
        global_device_id:
          type: string
          description: Esper generated unique id for the device
        tenant_id:
          type: string
          format: uuid
          readOnly: true
        group_id:
          type: string
          format: uuid
          readOnly: true
        onboarded_on:
          type: string
          format: date-time
        provisioned_on:
          type: string
          format: date-time
        hardware_info:
          $ref: '#/components/schemas/device_HardwareInfo'
        software_info:
          $ref: '#/components/schemas/device_SoftwareInfo'
        network_info:
          $ref: '#/components/schemas/device_NetworkInfo'
        memory_info:
          $ref: '#/components/schemas/device_MemoryInfo'
        network_stats:
          $ref: '#/components/schemas/device_NetworkStats'
        'location_stats:':
          $ref: '#/components/schemas/device_LocationStats'
        blueprint_info:
          $ref: '#/components/schemas/device_BlueprintInfo'
        battery_stats:
          type: object
          properties:
            battery_level:
              type: number
              description: Current battey level of the device
        mqtt_topic:
          type: string
          description: MQTT topic
        fcm_id:
          type: string
        is_gms:
          type: boolean
        policy:
          nullable: true
          description: Policy associated with the device
          type: object
          properties:
            policy_id:
              type: integer
            policy_name:
              type: string
        managed_by:
          type: string
          description: Whether the device is managed by blueprint or template
          enum:
            - BLUEPRINT
            - TEMPLATE
        template_name:
          nullable: true
          type: string
          description: Name of the template the device is managed by
        is_seamless:
          type: boolean
        is_esper_managed:
          type: boolean
          nullable: true
          readOnly: true
          description: Indicates if the device is Esper managed
        created_by:
          type: string
        updated_by:
          type: string
        created_at:
          type: string
          format: date-time
        updated_at:
          type: string
          format: date-time
    device_DeviceStateEnumApple:
      type: integer
      format: int32
      description: >
        The following are the device states and their descriptions:

        ```

        * 0 = Device State is Unspecified

        * 1 = Online/Active

        * 20 = Disabled (device has been factory reset or removed from the Esper
        Dashboard)

        * 70 = Device is undergoing a Factory Reset (reset started from
        Dashboard)

        * 80 = Device Onboarding in Progress

        * 90 = Device Onboarding Failed

        * 100 = Device Onboarded in Esper

        * 200 = Device is Registered

        ```
      enum:
        - 0
        - 1
        - 20
        - 70
        - 80
        - 90
        - 100
        - 200
    device_AppModeMeta:
      type: object
      nullable: true
      minProperties: 1
      description: App mode configuration for the device (kiosk / multi-app)
      properties:
        is_kiosk:
          type: boolean
          nullable: true
          description: Whether the device is in kiosk mode
        app_id:
          type: string
          format: uuid
          description: >-
            Application UUID identifier for kiosk mode. For Android, this is the
            DeviceApp UUID (not available for older DPCs).
        app_type:
          type: string
          description: Application type for kiosk mode
          enum:
            - TENANT_IOS
            - ESPER_IOS
            - VPP
            - WEBCLIP
            - ESPER_ANDROID
            - ESPER_WINDOWS
            - TENANT_WINDOWS
            - ESPER_LINUX
            - TENANT_WINDOWS_EXE
            - TENANT_ANDROID
            - GOOGLE_ANDROID
            - PRELOADED_ANDROID
            - TENANT_WINDOWS_UWP
        disable_device_rotation:
          type: boolean
          nullable: true
          description: >-
            Disable device rotation sensing while in kiosk mode (iOS only). Only
            meaningful alongside one of is_kiosk / app_id / app_type — a payload
            containing only disable_device_rotation is rejected.
        disable_screen_timeout:
          type: boolean
          nullable: true
          description: >-
            Disable screen timeout while in kiosk mode (Apple only). Only
            meaningful alongside one of is_kiosk / app_id / app_type — a payload
            containing only disable_screen_timeout is rejected.
        kiosk_mode_type:
          type: string
          description: >-
            Kiosk configuration mode. Currently only supported on Windows
            devices. Requires is_kiosk to be true.
          enum:
            - SHELL_LAUNCHER
            - CONFIGURATION
        application_path:
          type: string
          description: >-
            WIN32 executable path for the kiosk app. Only applicable when
            kiosk_mode_type is SHELL_LAUNCHER or CONFIGURATION with a WIN32 app.
        application_args:
          type: string
          description: Command-line arguments for the WIN32 kiosk app.
      anyOf:
        - required:
            - is_kiosk
        - required:
            - app_id
        - required:
            - app_type
      allOf:
        - anyOf:
            - not:
                required:
                  - application_path
            - required:
                - kiosk_mode_type
        - anyOf:
            - not:
                required:
                  - application_args
            - required:
                - kiosk_mode_type
    device_AppleDevice:
      type: object
      properties:
        id:
          type: string
          format: uuid
          readOnly: true
        name:
          type: string
          description: Esper generated name for the device
        alias:
          type: string
          description: Alias/alternate name for the device
        os:
          type: string
          description: Operating system for the device
          enum:
            - iOS
            - iPadOS
            - tvOS
        state:
          $ref: '#/components/schemas/device_DeviceStateEnumApple'
        platform:
          type: string
          description: Platform for the device
          enum:
            - APPLE
        serial:
          type: string
          description: Serial number the device
        os_version:
          type: string
          description: OS version the device
        global_device_id:
          type: string
          description: Esper generated unique id for the device
        tenant_id:
          type: string
          format: uuid
          readOnly: true
        group_id:
          type: string
          format: uuid
          readOnly: true
        hardware_info:
          $ref: '#/components/schemas/device_HardwareInfo'
        software_info:
          $ref: '#/components/schemas/device_SoftwareInfo'
        network_info:
          $ref: '#/components/schemas/device_NetworkInfo'
        memory_info:
          $ref: '#/components/schemas/device_MemoryInfo'
        blueprint_info:
          $ref: '#/components/schemas/device_BlueprintInfo'
        udid:
          type: string
          description: UDID as provided by apple
        dep_profile:
          type: string
          description: DEP profile applied to device
        dep_profile_push_time:
          type: string
          format: date-time
        dep_profile_assign_time:
          type: string
          format: date-time
        dep_profile_status:
          type: string
          description: DEP profile applied to device
          enum:
            - empty
            - assigned
            - pushed
            - removed
        enrolment_info:
          type: object
          properties:
            enrolment_id:
              type: string
              description: The per-enrollment identifier for the device
            enrolment_user_id:
              type: string
              description: The per-enrollment identifier for the user
        last_seen:
          type: string
          format: date-time
        tokens:
          type: object
          properties:
            push_magic:
              type: string
            push_token:
              type: string
            device_token:
              type: string
        device_source:
          type: string
          description: Source of device onboarding
          enum:
            - ABM
            - NON_ABM
        is_supervised:
          type: boolean
        is_ddm_enabled:
          type: boolean
          description: Whether Declarative Device Management is enabled for this device
        managed_by:
          type: string
          description: Whether the device is managed by blueprint or template
          enum:
            - BLUEPRINT
        onboarded_on:
          type: string
          format: date-time
        provisioned_on:
          type: string
          format: date-time
        is_seamless:
          type: boolean
        app_mode_meta:
          nullable: true
          $ref: '#/components/schemas/device_AppModeMeta'
        created_by:
          type: string
        updated_by:
          type: string
        created_at:
          type: string
          format: date-time
        updated_at:
          type: string
          format: date-time
    device_DeviceStateEnumLinux:
      type: integer
      format: int32
      description: >
        The following are the device states and their descriptions:

        ```

        * 0 = Device State is Unspecified

        * 1 = Online/Active

        * 20 = Disabled (device has been factory reset or removed from the Esper
        Dashboard)

        * 70 = Device Wipe in Progress

        * 80 = Device Onboarding in Progress

        * 90 = Device Onboarding Failed

        * 100 = Device Onboarded in Esper

        * 200 = Device is Registered

        ```
      enum:
        - 0
        - 1
        - 20
        - 70
        - 80
        - 90
        - 100
        - 200
    device_LinuxBlueprintInfo:
      type: object
      properties:
        assigned_blueprint_id:
          type: string
          description: Assigned blueprint id of the device
        current_blueprint_id:
          type: string
          description: Current blueprint id of the blueprint assigned to the device
        current_blueprint_version_id:
          type: string
          description: Current Version id of the blueprint assigned to the device
        blueprint_upgrade_status:
          type: string
          description: The status of the blueprint upgrade on the device
          enum:
            - NOT_APPLICABLE
    device_LinuxDevice:
      type: object
      properties:
        id:
          type: string
          format: uuid
          readOnly: true
        name:
          type: string
          description: Esper generated name for the device
        os:
          type: string
          description: Operating system for the device
          enum:
            - Ubuntu
        state:
          $ref: '#/components/schemas/device_DeviceStateEnumLinux'
        platform:
          type: string
          description: Operating system for the device
          enum:
            - LINUX
        serial:
          type: string
          description: Serial number the device
        os_version:
          type: string
          description: OS version the device
        global_device_id:
          type: string
          description: Esper generated unique id for the device
        tenant_id:
          type: string
          format: uuid
          readOnly: true
        group_id:
          type: string
          format: uuid
          readOnly: true
        onboarded_on:
          type: string
          format: date-time
        provisioned_on:
          type: string
          format: date-time
        blueprint_info:
          $ref: '#/components/schemas/device_LinuxBlueprintInfo'
        managed_by:
          type: string
          description: Whether the device is managed by blueprint or template
          enum:
            - BLUEPRINT
        is_seamless:
          type: boolean
        created_by:
          type: string
        updated_by:
          type: string
        created_at:
          type: string
          format: date-time
        updated_at:
          type: string
          format: date-time
    device_DeviceStateEnumWindows:
      type: integer
      format: int32
      description: >
        The following are the device states and their descriptions:

        ```

        * 0 = Device State is Unspecified

        * 1 = Online/Active

        * 20 = Disabled (device has been factory reset or removed from the Esper
        Dashboard)

        * 70 = Device Wipe in Progress

        * 80 = Device Onboarding in Progress

        * 90 = Device Onboarding Failed

        * 100 = Device Onboarded in Esper

        * 200 = Device is Registered

        ```
      enum:
        - 0
        - 1
        - 20
        - 70
        - 80
        - 90
        - 100
        - 200
    device_WindowsHardwareInfo:
      type: object
      properties:
        brand:
          type: string
          description: Device brand
        model:
          type: string
          description: Device model
        serial:
          type: string
          description: Device serial number
        manufacturer:
          type: string
          description: Device manufacturer
        hardware:
          type: string
          description: Hardware information
    device_WindowsSoftwareInfo:
      type: object
      properties:
        supported_abi:
          type: string
          description: Supported ABI
        os_build_time:
          type: string
          description: OS build time
        os_build_number:
          type: string
          description: OS build number
        os_version:
          type: string
          description: OS version
        os:
          type: string
          description: OS name
        os_platform:
          type: string
          description: OS platform
        os_distribution:
          type: string
          description: OS distribution
        bootloader_version:
          type: string
          description: Bootloader version
        kernel_architecture:
          type: string
          description: Kernel architecture
        device_kernel_version:
          type: string
          description: Device kernel version
        last_boot_time:
          type: string
          description: Last boot time
        display_resolution:
          type: string
          description: Display resolution
        display_refresh_rate:
          type: string
          description: Display refresh rate
        host_name:
          type: string
          description: Device host name
        esper_agent_info:
          type: object
          properties:
            version_code:
              type: string
              description: Esper agent version code
            version_name:
              type: string
              description: Esper agent version name
    device_WindowsNetworkInfo:
      type: object
      properties:
        wifi_mac_address:
          type: string
          description: Wi-Fi MAC address
        ethernet_mac_address:
          type: string
          description: Ethernet MAC address
    device_WindowsMemoryInfo:
      type: object
      properties:
        total_ram:
          type: string
          description: Total RAM in bytes
        total_internal_storage:
          type: string
          description: Total internal storage in bytes
        total_swap_memory:
          type: string
          description: Total swap memory in bytes
        units:
          type: string
          description: Units used for the storage capacity
    device_WindowsDevice:
      type: object
      properties:
        id:
          type: string
          format: uuid
          readOnly: true
        name:
          type: string
          description: Esper generated name for the device
        os:
          type: string
          description: Operating system of the device
          enum:
            - Windows
        state:
          $ref: '#/components/schemas/device_DeviceStateEnumWindows'
        platform:
          type: string
          description: Operating system of the device
          enum:
            - WINDOWS
        serial:
          type: string
          description: Serial number of the device
        os_version:
          type: string
          description: OS version of the device
        global_device_id:
          type: string
          description: Windows generated unique id for the device
        tenant_id:
          type: string
          format: uuid
          readOnly: true
        group_id:
          type: string
          format: uuid
          readOnly: true
        onboarded_on:
          type: string
          format: date-time
        provisioned_on:
          type: string
          format: date-time
        blueprint_info:
          $ref: '#/components/schemas/device_BlueprintInfo'
        hardware_info:
          $ref: '#/components/schemas/device_WindowsHardwareInfo'
        software_info:
          $ref: '#/components/schemas/device_WindowsSoftwareInfo'
        network_info:
          $ref: '#/components/schemas/device_WindowsNetworkInfo'
        memory_info:
          $ref: '#/components/schemas/device_WindowsMemoryInfo'
        managed_by:
          type: string
          description: Whether the device is managed by blueprint or template
          enum:
            - BLUEPRINT
        is_seamless:
          type: boolean
        windows_config:
          type: object
          properties:
            channel_uri:
              type: string
              description: Channel URI for the device
            channel_updated_at:
              type: string
              format: date-time
              description: Last updated time of the channel URI
        app_mode_meta:
          nullable: true
          $ref: '#/components/schemas/device_AppModeMeta'
        created_by:
          type: string
        updated_by:
          type: string
        created_at:
          type: string
          format: date-time
        updated_at:
          type: string
          format: date-time
    device_Error_401_Unauthorized:
      type: object
      properties:
        code:
          type: integer
          format: int32
          default: 401
        message:
          type: string
        content:
          type: object
      required:
        - code
        - message
    device_Error_500_Internal_Server_Error:
      type: object
      properties:
        code:
          type: integer
          format: int32
          default: 500
        message:
          type: string
        content:
          type: object
      required:
        - code
        - message
    device_Error_400_Bad_Data:
      type: object
      properties:
        code:
          type: integer
          format: int32
          default: 400
        message:
          type: string
        content:
          type: object
      required:
        - code
        - message
    device_Error_404_Not_Found:
      type: object
      properties:
        code:
          type: integer
          format: int32
          default: 404
        message:
          type: string
        content:
          type: object
      required:
        - code
        - message
    device_DeviceSettings:
      type: object
      properties:
        gps_state:
          type: string
          description: GPS state of the device
          enum:
            - LOCATION_MODE_HIGH_ACCURACY
            - LOCATION_MODE_SENSORS_ONLY
            - LOCATION_MODE_BATTERY_SAVING
            - LOCATION_MODE_OFF
            - LOCATION_MODE_ON
        wifi_state:
          type: boolean
          description: WiFi state of the device
        adb_enabled:
          type: boolean
          description: ADB state of the device
        adb_timeout:
          type: integer
          description: ADB timeout value for the device
        remote_adb_enabled:
          type: boolean
          description: Remote ADB state for the device
        remote_adb_ip:
          type: string
          description: Remote ADB IP for the device
        remote_adb_port:
          type: integer
          description: Remote ADB port for the device
        audio_settings:
          type: object
          description: Different Audio types and respective values
        rotation_state:
          type: string
          description: Display rotation of the device
          enum:
            - AUTO
            - PORTRAIT_ONLY
            - LANDSCAPE_ONLY
            - INVERTED_PORTRAIT_ONLY
            - INVERTED_LANDSCAPE_ONLY
        bluetooth_state:
          type: boolean
          description: Bluetooth state of device
        brightness_scale:
          type: integer
          description: Brightess value for the device it will be in range 0 to 100
        screen_off_timeout:
          type: integer
          description: Device screen off timeout
        use_only_saved_ap:
          type: boolean
          description: Whether device is allowed to connect to only saved Wifi APs
    device_NetworkStatsV2:
      type: object
      properties:
        current_active_connection:
          type: string
          description: The current active connection type
        wifi_network_info:
          type: object
          properties:
            wifi_ssid:
              type: string
              description: The SSID of the WiFi network
            wifi_signal_strength:
              type: integer
              description: The signal strength of the WiFi network on a scale of 0 to 5
        cellular_network_info:
          type: object
          properties:
            network_type:
              type: string
              description: The network type of the cellular network - null, 2G, 3G, 4G LTE
        ip_address:
          type: array
          items:
            type: string
          description: The IP address of the device
    device_MemoryStats:
      type: object
      properties:
        available_ram:
          type: integer
          description: The available memory value
        available_internal_storage:
          type: integer
          description: The available internal storage value
        os_occupied_storage:
          type: integer
          description: The OS occupied storage value
    device_AndroidDeviceV2:
      type: object
      properties:
        id:
          type: string
          format: uuid
          readOnly: true
        name:
          type: string
          description: Esper generated name for the device
        alias:
          type: string
          description: Alias/alternate name for the device
        os:
          type: string
          description: Operating system for the device
          enum:
            - Android
        state:
          $ref: '#/components/schemas/device_DeviceStateEnumAndroid'
        platform:
          type: string
          description: Platform for the device
          enum:
            - ANDROID
        serial:
          type: string
          description: Serial number the device
        os_version:
          type: string
          description: OS version the device
        global_device_id:
          type: string
          description: Esper generated unique id for the device
        tenant_id:
          type: string
          format: uuid
          readOnly: true
        group_id:
          type: string
          format: uuid
          readOnly: true
        provisioned_on:
          type: string
          format: date-time
        tags:
          type: array
          items:
            type: string
            format: uuid
          description: Array of UUIDs representing tags associated with the device
        hardware_info:
          $ref: '#/components/schemas/device_HardwareInfo'
        software_info:
          $ref: '#/components/schemas/device_SoftwareInfo'
        network_info:
          $ref: '#/components/schemas/device_NetworkInfo'
        memory_info:
          $ref: '#/components/schemas/device_MemoryInfo'
        network_stats:
          $ref: '#/components/schemas/device_NetworkStatsV2'
        location_stats:
          $ref: '#/components/schemas/device_LocationStats'
        memory_stats:
          $ref: '#/components/schemas/device_MemoryStats'
        blueprint_info:
          $ref: '#/components/schemas/device_BlueprintInfo'
        battery_stats:
          type: object
          properties:
            battery_level:
              type: number
              description: Current battey level of the device
        mqtt_topic:
          type: string
          description: MQTT topic
        fcm_id:
          type: string
        is_gms:
          type: boolean
        dpc_version:
          nullable: true
          type: string
          description: DPC (Device Policy Controller) version / Esper agent version name
        eea_version:
          nullable: true
          type: string
          description: EEA (Esper Enterprise Android) version
        policy:
          nullable: true
          description: Policy associated with the device
          type: object
          properties:
            policy_id:
              type: integer
            policy_name:
              type: string
        managed_by:
          type: string
          description: Whether the device is managed by blueprint or template
          enum:
            - BLUEPRINT
            - TEMPLATE
        provisioned_with:
          type: string
          description: Whether the device was provisioned with blueprint or template
          enum:
            - BLUEPRINT
            - TEMPLATE
        template_name:
          nullable: true
          type: string
          description: Name of the template the device is managed by
        is_seamless:
          type: boolean
        is_esper_managed:
          type: boolean
          nullable: true
          readOnly: true
          description: Indicates if the device is Esper managed
        app_mode_meta:
          nullable: true
          $ref: '#/components/schemas/device_AppModeMeta'
        created_by:
          type: string
        updated_by:
          type: string
        created_at:
          type: string
          format: date-time
        updated_at:
          type: string
          format: date-time
    device_AppleDeviceV2:
      type: object
      properties:
        id:
          type: string
          format: uuid
          readOnly: true
        name:
          type: string
          description: Esper generated name for the device
        alias:
          type: string
          description: Alias/alternate name for the device
        os:
          type: string
          description: Operating system for the device
          enum:
            - iOS
            - iPadOS
            - tvOS
        state:
          $ref: '#/components/schemas/device_DeviceStateEnumApple'
        platform:
          type: string
          description: Platform for the device
          enum:
            - APPLE
        serial:
          type: string
          description: Serial number the device
        os_version:
          type: string
          description: OS version the device
        global_device_id:
          type: string
          description: Esper generated unique id for the device
        tenant_id:
          type: string
          format: uuid
          readOnly: true
        group_id:
          type: string
          format: uuid
          readOnly: true
        tags:
          type: array
          items:
            type: string
            format: uuid
          description: Array of UUIDs representing tags associated with the device
        hardware_info:
          $ref: '#/components/schemas/device_HardwareInfo'
        software_info:
          $ref: '#/components/schemas/device_SoftwareInfo'
        network_info:
          $ref: '#/components/schemas/device_NetworkInfo'
        memory_info:
          $ref: '#/components/schemas/device_MemoryInfo'
        blueprint_info:
          $ref: '#/components/schemas/device_BlueprintInfo'
        udid:
          type: string
          description: UDID as provided by apple
        dep_profile:
          type: string
          description: DEP profile applied to device
        dep_profile_push_time:
          type: string
          format: date-time
        dep_profile_assign_time:
          type: string
          format: date-time
        dep_profile_status:
          type: string
          description: DEP profile applied to device
          enum:
            - empty
            - assigned
            - pushed
            - removed
        enrolment_info:
          type: object
          properties:
            enrolment_id:
              type: string
              description: The per-enrollment identifier for the device
            enrolment_user_id:
              type: string
              description: The per-enrollment identifier for the user
        last_seen:
          type: string
          format: date-time
        tokens:
          type: object
          properties:
            push_magic:
              type: string
            push_token:
              type: string
            device_token:
              type: string
        is_supervised:
          type: boolean
        device_source:
          type: string
          description: Source of device onboarding
          enum:
            - ABM
            - NON_ABM
        managed_by:
          type: string
          description: Whether the device is managed by blueprint or template
          enum:
            - BLUEPRINT
        provisioned_with:
          type: string
          description: Whether the device was provisioned with blueprint or template
          enum:
            - BLUEPRINT
        provisioned_on:
          type: string
          format: date-time
        is_seamless:
          type: boolean
        is_locked_down:
          type: boolean
        is_ddm_enabled:
          type: boolean
          description: Whether Declarative Device Management is enabled for this device
        app_mode_meta:
          nullable: true
          $ref: '#/components/schemas/device_AppModeMeta'
        created_by:
          type: string
        updated_by:
          type: string
        created_at:
          type: string
          format: date-time
        memory_stats:
          type: object
          properties:
            total_memory:
              type: integer
              format: int64
              description: Total memory in bytes
            total_internal_storage:
              type: integer
              format: int64
              description: Total internal storage in bytes
            available_ram:
              type: integer
              format: int64
              description: Available RAM in bytes
            available_internal_storage:
              type: integer
              format: int64
              description: Available internal storage in bytes
        battery_stats:
          type: object
          properties:
            battery_level:
              type: number
              description: Current battery level of the device
        updated_at:
          type: string
          format: date-time
    device_LinuxDeviceV2:
      type: object
      properties:
        id:
          type: string
          format: uuid
          readOnly: true
        name:
          type: string
          description: Esper generated name for the device
        alias:
          type: string
          description: Alias/alternate name for the device
        os:
          type: string
          description: Operating system for the device
          enum:
            - ubuntu
            - Ubuntu
            - Linux
        state:
          $ref: '#/components/schemas/device_DeviceStateEnumLinux'
        platform:
          type: string
          description: Platform for the device
          enum:
            - LINUX
        serial:
          type: string
          description: Serial number the device
        os_version:
          type: string
          description: OS version the device
        global_device_id:
          type: string
          description: Esper generated unique id for the device
        tenant_id:
          type: string
          format: uuid
          readOnly: true
        group_id:
          type: string
          format: uuid
          readOnly: true
        provisioned_on:
          type: string
          format: date-time
        tags:
          type: array
          items:
            type: string
            format: uuid
          description: Array of UUIDs representing tags associated with the device
        hardware_info:
          type: object
          properties:
            brand:
              type: string
              description: Device brand
            model:
              type: string
              description: Device model
            serial:
              type: string
              description: Device serial number
            manufacturer:
              type: string
              description: Device manufacturer
            hardware:
              type: string
              description: Hardware information
        software_info:
          type: object
          properties:
            supported_abi:
              type: string
              description: Supported ABI
            os_build_time:
              type: integer
              format: int64
              description: OS build time timestamp
            os_build_number:
              type: string
              description: OS build number
            os_version:
              type: string
              description: OS version
            os:
              type: string
              description: OS name
            os_platform:
              type: string
              description: OS platform
            os_distribution:
              type: string
              description: OS distribution
            bootloader_version:
              type: string
              description: Bootloader version
            kernel_architecture:
              type: string
              description: Kernel architecture
            device_kernel_version:
              type: string
              description: Device kernel version
            last_boot_time:
              type: string
              description: Last boot time
            display_resolution:
              type: string
              description: Display resolution
            display_refresh_rate:
              type: string
              description: Display refresh rate
            esper_agent_info:
              type: object
              properties:
                version_code:
                  type: string
                  description: Esper agent version code
                version_name:
                  type: string
                  description: Esper agent version name
        network_info:
          type: object
          properties:
            wifi_mac_address:
              type: string
              description: Wi-Fi MAC address
            ethernet_mac_address:
              type: string
              description: Ethernet MAC address
        memory_info:
          type: object
          properties:
            total_ram:
              type: string
              description: Total RAM in bytes
            total_internal_storage:
              type: string
              description: Total internal storage in bytes
            total_swap_memory:
              type: string
              description: Total swap memory in bytes
            units:
              type: string
              description: Units used for the storage capacity
        network_stats:
          type: object
          properties:
            dns_servers:
              type: array
              items:
                type: string
              description: DNS servers
            default_gateway:
              type: string
              description: Default gateway
            ethernet_ip_address:
              type: string
              description: Ethernet IP address
            current_active_connection:
              type: string
              description: The current active connection type
            wifi_network_info:
              type: object
              properties:
                wifi_ssid:
                  type: string
                  description: The SSID of the WiFi network
                wifi_signal_strength:
                  type: integer
                  description: The signal strength of the WiFi network
                wifi_ip_address:
                  type: string
                  description: The IP address of the WiFi network
            ip_address:
              type: array
              items:
                type: string
              description: The IP address of the device
        memory_stats:
          type: object
          properties:
            total_memory:
              type: integer
              format: int64
              description: Total memory in bytes
            total_internal_storage:
              type: integer
              format: int64
              description: Total internal storage in bytes
            total_swap_memory:
              type: integer
              format: int64
              description: Total swap memory in bytes
            available_ram:
              type: integer
              format: int64
              description: The available memory value
            available_internal_storage:
              type: integer
              format: int64
              description: The available internal storage value
            available_swap_memory:
              type: integer
              format: int64
              description: The available swap memory value
            units:
              type: string
              description: The units used for the storage capacity
        cpu_stats:
          type: object
          properties:
            cpu_counts:
              type: integer
              description: Number of CPU cores
            cpu_cores:
              type: array
              items:
                type: number
                format: float
              description: CPU core usage percentages
            cpu_temperature:
              type: number
              format: float
              description: CPU temperature
            total_percent:
              type: number
              format: float
              description: Total CPU usage percentage
        battery_stats:
          type: object
          properties:
            battery_present:
              type: boolean
              description: Whether battery is present
            battery_state:
              type: string
              description: Battery state
            battery_energy:
              type: number
              format: float
              description: Battery energy
            battery_energy_full:
              type: number
              format: float
              description: Battery full energy
            battery_energy_full_design:
              type: number
              format: float
              description: Battery design full energy
            battery_level:
              type: number
              format: int32
              description: Battery level
            battery_technology:
              type: string
              description: Battery technology
            battery_voltage:
              type: number
              format: float
              description: Battery voltage
            battery_health:
              type: number
              format: float
              description: Battery health percentage
            battery_temperature:
              type: number
              format: float
              description: Battery temperature
        location_stats:
          type: object
          properties:
            latitude:
              type: number
              format: float
              description: Device latitude
            longitude:
              type: number
              format: float
              description: Device longitude
            altitude:
              type: number
              format: float
              description: Device altitude
            accuracy:
              type: number
              format: float
              description: Location accuracy
        blueprint_info:
          $ref: '#/components/schemas/device_LinuxBlueprintInfo'
        managed_by:
          type: string
          description: Whether the device is managed by blueprint or template
          enum:
            - BLUEPRINT
        provisioned_with:
          type: string
          description: Whether the device was provisioned with blueprint or template
          enum:
            - BLUEPRINT
        is_seamless:
          type: boolean
        last_seen:
          type: string
          format: date-time
        created_by:
          type: string
        updated_by:
          type: string
        created_at:
          type: string
          format: date-time
        updated_at:
          type: string
          format: date-time
    device_WindowsBlueprintInfo:
      type: object
      properties:
        assigned_blueprint_id:
          type: string
          description: Assigned blueprint id of the device
        current_blueprint_id:
          type: string
          description: Current blueprint id of the blueprint assigned to the device
        current_blueprint_version_id:
          type: string
          description: Current Version id of the blueprint assigned to the device
        blueprint_upgrade_status:
          type: string
          description: The status of the blueprint upgrade on the device
          enum:
            - NOT_APPLICABLE
    device_WindowsDeviceV2:
      type: object
      properties:
        id:
          type: string
          format: uuid
          readOnly: true
        name:
          type: string
          description: Esper generated name for the device
        alias:
          type: string
          description: Alias/alternate name for the device
        os:
          type: string
          description: Operating system for the device
          enum:
            - Windows
        state:
          $ref: '#/components/schemas/device_DeviceStateEnumWindows'
        platform:
          type: string
          description: Platform for the device
          enum:
            - WINDOWS
        serial:
          type: string
          description: Serial number the device
        os_version:
          type: string
          description: OS version the device
        global_device_id:
          type: string
          description: Windows generated unique id for the device
        tenant_id:
          type: string
          format: uuid
          readOnly: true
        group_id:
          type: string
          format: uuid
          readOnly: true
        provisioned_on:
          type: string
          format: date-time
        tags:
          type: array
          items:
            type: string
            format: uuid
          description: Array of UUIDs representing tags associated with the device
        hardware_info:
          $ref: '#/components/schemas/device_WindowsHardwareInfo'
        software_info:
          $ref: '#/components/schemas/device_WindowsSoftwareInfo'
        network_info:
          $ref: '#/components/schemas/device_WindowsNetworkInfo'
        memory_info:
          $ref: '#/components/schemas/device_WindowsMemoryInfo'
        network_stats:
          type: object
          properties:
            dns_servers:
              type: array
              items:
                type: string
              description: DNS servers
            default_gateway:
              type: string
              description: Default gateway
            ethernet_ip_address:
              type: string
              description: Ethernet IP address
            current_active_connection:
              type: string
              description: The current active connection type
            wifi_network_info:
              type: object
              properties:
                wifi_ssid:
                  type: string
                  description: The SSID of the WiFi network
                wifi_signal_strength:
                  type: integer
                  description: The signal strength of the WiFi network
                wifi_ip_address:
                  type: string
                  description: The IP address of the WiFi network
            ip_address:
              type: array
              items:
                type: string
              description: The IP address of the device
        memory_stats:
          type: object
          properties:
            total_memory:
              type: integer
              format: int64
              description: Total memory in bytes
            total_internal_storage:
              type: integer
              format: int64
              description: Total internal storage in bytes
            available_ram:
              type: integer
              format: int64
              description: The available memory value
            available_internal_storage:
              type: integer
              format: int64
              description: The available internal storage value
            units:
              type: string
              description: The units used for the storage capacity
        cpu_stats:
          type: object
          properties:
            cpu_counts:
              type: integer
              description: Number of CPU cores
            cpu_cores:
              type: array
              items:
                type: number
                format: float
              description: CPU core usage percentages
            cpu_temperature:
              type: number
              format: float
              description: CPU temperature
        last_seen:
          type: string
          format: date-time
          description: Last time the device was seen
        blueprint_info:
          $ref: '#/components/schemas/device_WindowsBlueprintInfo'
        battery_stats:
          type: object
          properties:
            battery_level:
              type: number
              description: Current battery level of the device
        background_scripts_stats:
          type: object
          description: >-
            Telemetry for Windows background scripts; object keys are background
            script UUIDs
          additionalProperties:
            type: object
            properties:
              current_state:
                type: string
                description: Current execution state of the background script
              script_output:
                type: string
                description: Latest script output or logs
              reason:
                type: string
                description: >-
                  Optional human-readable reason (e.g. failure or state change
                  context)
              updated_at:
                type: string
                format: date-time
                description: Last updated time of background script state on the device
        provisioned_with:
          type: string
          description: Whether the device was provisioned with blueprint or template
          enum:
            - BLUEPRINT
        is_seamless:
          type: boolean
        windows_config:
          type: object
          properties:
            channel_uri:
              type: string
              description: Channel URI for the device
            channel_updated_at:
              type: string
              format: date-time
              description: Last updated time of the channel URI
        app_mode_meta:
          nullable: true
          $ref: '#/components/schemas/device_AppModeMeta'
        created_by:
          type: string
        updated_by:
          type: string
        created_at:
          type: string
          format: date-time
        updated_at:
          type: string
          format: date-time
    device_OffsetPaginatedDeviceList:
      type: object
      description: Response format for offset-based pagination
      properties:
        count:
          type: integer
          description: Total number of devices matching the query
        previous:
          type: string
          nullable: true
          description: URL to the previous page of results
        next:
          type: string
          nullable: true
          description: URL to the next page of results
        results:
          type: array
          items:
            oneOf:
              - $ref: '#/components/schemas/device_AndroidDeviceV2'
              - $ref: '#/components/schemas/device_AppleDeviceV2'
              - $ref: '#/components/schemas/device_LinuxDeviceV2'
              - $ref: '#/components/schemas/device_WindowsDeviceV2'
    device_CursorPaginatedDeviceList:
      type: object
      description: Response format for cursor-based pagination
      properties:
        results:
          type: array
          items:
            oneOf:
              - $ref: '#/components/schemas/device_AndroidDeviceV2'
              - $ref: '#/components/schemas/device_AppleDeviceV2'
              - $ref: '#/components/schemas/device_LinuxDeviceV2'
              - $ref: '#/components/schemas/device_WindowsDeviceV2'
        next_cursor:
          type: string
          nullable: true
          description: >-
            Opaque cursor token for fetching the next page. Null if no more
            results.
          example: >-
            eyJzdiI6W3siYyI6InVwZGF0ZWRfYXQiLCJ2IjoiMjAyNi0wMy0xMVQwNzozNjowMS45NDM3NDlaIiwibyI6IkRFU0MifV0sInV2IjoiMTM5NzQwMjYtYTQzNS00ZDk5LWEyOWItM2E0Y2Y0MTZmODFhIn0=
        prev_cursor:
          type: string
          nullable: true
          description: >-
            Opaque cursor token for navigating to the previous page. Pass this
            value as the `cursor` query parameter to paginate backward. Null
            when already on the first page.
        has_more:
          type: boolean
          description: Indicates if there are more results after the current page
        has_prev:
          type: boolean
          description: Indicates if there are results before the current page
    device_EsperDeviceHeartbeat:
      type: object
      properties:
        device_id:
          type: string
          description: UUID of the device
          format: uuid
        timestamp:
          type: string
          description: Last seen time stamp of the device
          format: date-time
        status:
          type: integer
          description: >-
            Legacy field representing whether the device was last seen in the
            last 30 minutes (returns 1) or not (returns 0). 
          enum:
            - 0
            - 1
    device_DeviceLastSeen:
      type: object
      properties:
        count:
          type: integer
        prev:
          type: string
        next:
          type: string
        results:
          type: array
          items:
            $ref: '#/components/schemas/device_EsperDeviceHeartbeat'
    device_DeviceAppsResponse:
      type: object
      properties:
        id:
          type: string
          format: uuid
        device_id:
          type: string
          format: uuid
        app_id:
          type: string
          format: uuid
        app_type:
          type: string
          enum:
            - TENANT_IOS
            - ESPER_IOS
            - ESPER_WINDOWS
            - TENANT_WINDOWS
            - TENANT_WINDOWS_EXE
            - TENANT_WINDOWS_UWP
        app_version_id:
          type: string
          format: uuid
        base64_app_config:
          type: string
        auto_update:
          type: boolean
        created_at:
          type: string
          format: date-time
        updated_at:
          type: string
          format: date-time
        tenant_id:
          type: string
          format: uuid
    device_AutoInstallConstraint:
      type: object
      properties:
        charging_state_constraint:
          type: string
          description: Constraint on the device's charging state for installation.
        device_idle_state_constraint:
          type: string
          description: Constraint on the device's idle state for installation.
        network_type_constraint:
          type: string
          description: Network type required for installation.
    device_AutoInstallPolicy:
      type: object
      properties:
        auto_install_constraint:
          type: array
          items:
            $ref: '#/components/schemas/device_AutoInstallConstraint'
          description: Constraints for auto-installing the product.
        auto_install_mode:
          type: string
          description: Mode for auto-installation.
        auto_install_priority:
          type: integer
          description: Priority of the auto-installation.
    device_VariableSet:
      type: object
      properties:
        placeholder:
          type: string
          description: Placeholder key for configuration variable.
          example: $emailaddress$
        user_value:
          type: string
          description: User-provided value for the placeholder.
          example: user@example.com
    device_ManagedConfiguration:
      type: object
      properties:
        configuration_variables:
          type: object
          description: Variables used for managed configurations.
          properties:
            mcm_id:
              type: string
              description: MCM ID required for configuration management.
              example: '00982462290877382272'
            variable_set:
              type: array
              description: Set of configuration variables and their values.
              items:
                $ref: '#/components/schemas/device_VariableSet'
        kind:
          type: string
          description: Type of managed configuration.
          example: androidenterprise#managedConfiguration
    device_ProductPolicy:
      type: object
      properties:
        auto_update_mode:
          type: string
          description: Mode of auto-updating the product.
        product_id:
          type: string
          description: Unique identifier for the product.
        auto_install_policy:
          $ref: '#/components/schemas/device_AutoInstallPolicy'
        managed_configuration:
          $ref: '#/components/schemas/device_ManagedConfiguration'
    device_Policy:
      type: object
      properties:
        auto_update_policy:
          type: string
          description: Defines the auto-update policy for the device.
        device_report_policy:
          type: string
          description: Policy for device report generation.
        product_availability_policy:
          type: string
          description: Defines the product availability policy.
        product_policy:
          type: array
          items:
            $ref: '#/components/schemas/device_ProductPolicy'
    device_GoogleEMMDevice:
      type: object
      properties:
        android_id:
          type: string
          description: Unique identifier for the Android device.
        management_type:
          type: string
          description: The management type of the device (e.g., managedDevice).
        policy:
          $ref: '#/components/schemas/device_Policy'
    device_GoogleApplication:
      type: object
      properties:
        product_id:
          type: string
          description: The unique product ID in the format of app:<package_name>.
          example: app:com.android.chrome
        mcm_id:
          type: string
          description: The MCM ID if required for configuration management.
          example: mcm_12345
        app_action:
          type: string
          description: Action to be performed on the app, either 'install' or 'uninstall'.
          enum:
            - install
            - uninstall
          example: install
    device_GoogleEMMDevicePolicyRequest:
      type: object
      properties:
        applications:
          type: array
          items:
            $ref: '#/components/schemas/device_GoogleApplication'
    device_GoogleDevice:
      type: object
      properties:
        androidId:
          type: string
          description: >-
            The Google Play Services Android ID for the device encoded as a
            lowercase hex string. For example, '123456789abcdef0'.
        managementType:
          type: string
          description: >-
            The type of management applied to the device, such as 'enterprise'
            or 'work'.
    device_DevicesListResponse:
      type: object
      properties:
        device:
          type: array
          items:
            $ref: '#/components/schemas/device_GoogleDevice'
    device_GoogleAccount:
      type: object
      properties:
        tenant_id:
          type: string
          format: uuid
          description: The ID of the tenant associated with the Google account.
        google_user_id:
          type: string
          description: The unique identifier for the Google user.
        device_id:
          type: string
          format: uuid
          description: The ID of the device associated with the Google account.
        google_device_id:
          type: string
          description: The unique identifier for the Google device.
        account_identifier:
          type: string
          description: An identifier for the account.
        account_type:
          type: integer
          description: The type of the Google account.
        google_authentication_token:
          type: string
          description: The authentication token for the Google account.
        created_at:
          type: string
          format: date-time
          description: The timestamp when the Google account was created.
        updated_at:
          type: string
          format: date-time
          description: The timestamp when the Google account was last updated.
      required:
        - tenant_id
        - google_user_id
        - device_id
        - account_type
    device_GoogleAccountUpdateRequestBody:
      type: object
      properties:
        google_device_id:
          type: string
          description: Unique identifier for the Google device.
        google_user_id:
          type: string
          description: Unique identifier for the Google user.
      required:
        - google_device_id
        - google_user_id
    device_GoogleAccountUpdateResponseBody:
      type: object
      properties:
        device_id:
          type: string
          description: Unique identifier for the device.
        tenant_id:
          type: string
          description: Unique identifier for the tenant.
      required:
        - device_id
        - tenant_id
    device_Error_409_Conflict:
      type: object
      properties:
        code:
          type: integer
          format: int32
          default: 409
        message:
          type: string
        content:
          type: object
      required:
        - code
        - message
    device_OperationScheduleArgsTimeTypeEnum:
      type: string
      description: >
        The Time-Type argument, in Schedule args, is to indicate which timezone
        the Command Framework should utilize when scheduling the command.

        Following Schedule Args for Time-Type are supported:


        ```

        * CONSOLE: Use the local timezone of the user creating the schedule.

        * DEVICE: Use the local timezone of the device, to which the command is
        issued, wherever it may be.

        ```
      enum:
        - console
        - device
    device_ScheduleArgs:
      type: object
      properties:
        start_datetime:
          type: string
          format: date-time
          description: >-
            Start date and time in ISO 8601 format, including timezone (e.g.,
            2024-08-08T14:30:00Z or 2024-08-08T14:30:00+05:30).
        end_datetime:
          type: string
          format: date-time
          description: >-
            End date and time in ISO 8601 format, including timezone (e.g.,
            2024-08-08T15:30:00Z or 2024-08-08T15:30:00+05:30).
        time_type:
          $ref: '#/components/schemas/device_OperationScheduleArgsTimeTypeEnum'
        window_start_time:
          type: string
          format: date-time
          description: >-
            It is automatically populated by the time field from the request's
            start_datetime and cannot be injected via the API request body.
        window_end_time:
          type: string
          format: date-time
          description: >-
            It is automatically populated by the time field from the request's
            end_datetime and cannot be injected via the API request body.
        days:
          type: array
          items:
            type: integer
    device_OperationActivity:
      type: array
      items:
        type: object
        properties:
          operation_state:
            type: string
            enum:
              - CREATED
              - QUERY INITIATED
              - QUERY RESOLVED
              - DISPATCHING
              - DISPATCHED
              - PROCESSING
              - PROCESSED
              - SUCCESS
              - FAILURE
              - CANCELLED
          created_at:
            type: string
            format: date-time
    device_OperationStats:
      type: object
      properties:
        device_operation_statuses_count:
          type: object
          properties:
            resolved_device_count:
              type: integer
            dispatched_device_count:
              type: integer
            dispatch_failed_count:
              type: integer
            failed_device_count:
              type: integer
            success_device_count:
              type: integer
            cancelled_device_count:
              type: integer
    device_OperationWithStats:
      type: object
      properties:
        id:
          type: string
          format: uuid
        operation:
          type: string
          description: ''
          enum:
            - CONVERGE
        state:
          type: string
          description: ''
          enum:
            - CREATED
            - RESOLVING
            - RESOLVED
            - DISPATCHING
            - COMPLETED
            - FAILED
        schedule_type:
          type: string
          description: |
            Following Schedule types are supported
            ```
            * IMMEDIATE: Schedule the command to execcute Immediately
            * WINDOW: Schedule the command to execute within the given window
          enum:
            - IMMEDIATE
            - WINDOW
        schedule_args:
          $ref: '#/components/schemas/device_ScheduleArgs'
        operation_device_query:
          type: object
        arguments:
          type: object
          properties:
            converge_with_provision:
              type: boolean
            sample_key:
              type: string
            geofence_ids:
              type: array
              description: List of geofence UUIDs to apply (APPLY_GEO_FENCE).
              items:
                type: string
                format: uuid
        reason:
          type: string
        created_at:
          type: string
          format: date-time
        created_by:
          type: string
          format: uuid
        updated_at:
          type: string
          format: date-time
        updated_by:
          type: string
          format: uuid
        operation_activity:
          $ref: '#/components/schemas/device_OperationActivity'
        operation_stats:
          $ref: '#/components/schemas/device_OperationStats'
    device_Operations_POST:
      type: object
      properties:
        operation_type:
          type: string
          description: ''
          enum:
            - CONVERGE
            - INSTALL
            - UNINSTALL
            - INSTALL_APP
            - UNINSTALL_APP
            - REBOOT
            - LOCK
            - SHUT_DOWN
            - WIPE
            - ADD_EMM_ACCOUNT
            - ADD_OVERRIDE_APN
            - ADD_WIFI_AP
            - REMOVE_WIFI_AP
            - UPDATE_WIFI_AP
            - SET_ETHERNET_SETTINGS
            - SET_STATIC_IP
            - USE_ONLY_SAVED_WIFI_AP
            - ADD_TO_WHITELIST
            - REMOVE_FROM_WHITELIST
            - ALLOW_BLUETOOTH
            - ALLOW_CAMERA
            - ALLOW_FACTORY_RESET
            - ALLOW_UNENROLLMENT_FROM_DEVICE
            - DEFER_OS_UPDATES
            - PAUSE_OS_UPDATES
            - SET_OS_UPDATE_POLICY
            - APPLE_APP_UNINSTALL
            - APPLY_APP_CONFIG
            - CLEAR_APP_CACHE
            - CLEAR_APP_DATA
            - DIRECT_IOS_APP_INSTALL
            - INSTALL_CERTIFICATE
            - INSTALL_OTA
            - NOTIFY_OTA
            - REFRESH_APPLIST
            - SET_APP_NOTIFICATIONS
            - SET_APP_PERMISSION
            - SET_APP_STATE
            - SET_KIOSK_APP
            - SET_MULTI_APP_MODE
            - SET_NEW_POLICY
            - SIMPLE_INSTALL
            - SYNC_CONTENT
            - UNINSTALL_CERTIFICATE
            - VPP_APP_INSTALL
            - INSTALL_PROFILE
            - INSTALL_PROVISIONING_PROFILE
            - INSTALL_WEBCLIP
            - REMOVE_PROVISIONING_PROFILE
            - UNINSTALL_WEBCLIP
            - LIST_PROVISIONING_PROFILES
            - BEEP_DEVICE
            - CAPTURE_SCREENSHOT
            - INITIATE_CONFERENCE_CALL
            - INITIATE_OFFER
            - NOTIFY_DEVICE
            - NUDGE_DEVICE
            - REQUEST_BUGREPORT
            - REQUEST_DPCLOG
            - DEPLOY_SYSTEM_OTA
            - UPDATE_BLUEPRINT
            - UPDATE_DEVICE_CONFIG
            - UPDATE_OEM_CONFIG
            - CLEAR_PASSCODE
            - RESET_LOCKSCREEN_PASSWORD
            - SET_ADB_STATE
            - SET_DEVICE_LOCKDOWN_STATE
            - DISABLE_LOST_MODE
            - ENABLE_LOST_MODE
            - LOST_MODE_DEVICE_LOCATION
            - PLAY_LOST_MODE_SOUND
            - SET_BLUETOOTH_STATE
            - SET_BRIGHTNESS_SCALE
            - SET_DEVICE_LANGUAGE
            - SET_GEO_FENCE
            - SET_GPS_STATE
            - SET_LOCATION_SERVICE
            - SET_ROTATION_STATE
            - SET_SCREEN_OFF_TIMEOUT
            - SET_STREAM_VOLUME
            - SET_TIMEZONE
            - SET_WALLPAPER
            - SET_WIDGET
            - SET_WIFI_STATE
            - RUN_CSP_PAYLOAD
            - SET_PFN
            - COLLECT_LOGS
            - REMOTE_CONNECTION
            - REMOVE_AGENT
            - REMOVE_DEVICE
            - RUN_CUSTOM_ACTION
            - RUN_SHELL_SCRIPT
            - DECLARATIVE_MANAGEMENT
            - APPLY_GEO_FENCE
        schedule_type:
          type: string
          description: |
            Following Schedule types are supported
            ```
            * IMMEDIATE: Schedule the command to execcute Immediately
            * WINDOW: Schedule the command to execute within the given window
          enum:
            - IMMEDIATE
            - WINDOW
        schedule_args:
          $ref: '#/components/schemas/device_ScheduleArgs'
        operation_device_query:
          type: object
          description: A flexible JSON object to define device properties and filters.
          properties: {}
        arguments:
          type: object
          properties:
            converge_with_provision:
              type: boolean
            sample_key:
              type: string
            geofence_ids:
              type: array
              description: List of geofence UUIDs to apply (APPLY_GEO_FENCE).
              items:
                type: string
                format: uuid
    device_DeviceOperationActivity:
      type: object
      properties:
        device_operation_state:
          type: string
          description: The state of the device operation (e.g., queued, processing).
          example: CREATED
        created_at:
          type: string
          format: date-time
          description: The start time of the device operation state.
    device_DeviceOperationWithStats:
      type: object
      properties:
        id:
          type: string
          format: uuid
        operation_id:
          type: string
          format: uuid
        device_id:
          type: string
          format: uuid
        state:
          type: string
          enum:
            - CREATED
            - INITIATED
            - SUCCEDED
            - FAILED
        reason:
          type: string
          example: ''
        created_at:
          type: string
          format: date-time
        updated_at:
          type: string
          format: date-time
        device_operation_activity:
          type: array
          items:
            $ref: '#/components/schemas/device_DeviceOperationActivity'
    device_RemoteViewerSessionsListForTenantResponse:
      type: object
      properties:
        session_id:
          type: string
          format: uuid
        device_id:
          type: string
          format: uuid
        state:
          type: string
          enum:
            - INITIATED
            - ACKNOWLEDGED
            - ACTIVE
            - TERMINATED
            - FAILED
        reason:
          type: string
        video_quality:
          type: string
          enum:
            - STANDARD
            - DATA_SAVER
        duration:
          type: string
          format: duration
          description: >-
            Depicts the time duration (in ISO 8601 duration format) of only a
            valid elapsed session, i.e., sessions that have moved from ACTIVE
            state (where session start-time can be captured) to TERMINATED or
            FAILED state (where the session end-time can be captured).
          example: PT10M30S
        created_by:
          type: string
        updated_by:
          type: string
        created_at:
          type: string
          format: date-time
        updated_at:
          type: string
          format: date-time
        device_name:
          type: string
          description: Name of the device.
        device_alias:
          type: string
          description: Alias of the device (if any).
        device_state:
          $ref: '#/components/schemas/device_DeviceStateEnumAndroid'
    apps_management_VPPLicense:
      type: object
      properties:
        app_id:
          type: string
        assigned_count:
          type: integer
        available_count:
          type: integer
        pricing_param:
          type: string
        supported_platforms:
          type: array
          items:
            type: string
        total_count:
          type: integer
    apps_management_Error_401_Unauthorized:
      type: object
      properties:
        code:
          type: integer
          format: int32
          default: 401
        message:
          type: string
        content:
          type: object
      required:
        - code
        - message
    apps_management_Error_500_Internal_Server_Error:
      type: object
      properties:
        code:
          type: integer
          format: int32
          default: 500
        message:
          type: string
        content:
          type: object
      required:
        - code
        - message
    apps_management_ItunesAppInfoV2:
      type: object
      properties:
        app_id:
          type: string
          format: uuid
          description: App ID in UUID format
        apple_app_id:
          type: string
          description: App ID from Apple
        app_version_id:
          type: string
          format: uuid
          description: current version of the app in UUID format
        apple_app_version:
          type: string
          description: current version of the app
        app_name:
          type: string
          description: name of the app
        icon_url:
          type: string
          description: url of the app's icon
        developer:
          type: string
          description: developer of the app
        itunes_url:
          type: string
          description: URL for the app on the iTunes store
        genres:
          type: array
          items:
            type: string
            description: genre of the app
        device_families:
          type: array
          items:
            type: string
            description: devices the app is compatible with
        bundle_id:
          type: string
          description: bundle ID of the app
        price:
          type: number
          description: price of the app
        app_size:
          type: integer
          description: size of the app
        minimum_os_version:
          type: string
          description: minimum OS version required for the app
        description:
          type: string
          description: description of the app
        last_updated_date:
          type: string
          description: date the app was last updated
        pricing_param:
          type: string
          description: pricing parameter
    apps_management_Error_400_Bad_Data:
      type: object
      properties:
        code:
          type: integer
          format: int32
          default: 400
        message:
          type: string
        content:
          type: object
      required:
        - code
        - message
    apps_management_SetPreferredRegionRequest:
      type: object
      required:
        - preferred_region
      properties:
        preferred_region:
          type: string
          pattern: ^[a-zA-Z]{2}$
          description: >-
            ISO 3166-1 alpha-2 country code for the preferred App Store region
            (e.g., 'US', 'JP')
          example: US
    apps_management_Error_404_Not_Found:
      type: object
      properties:
        code:
          type: integer
          format: int32
          default: 404
        message:
          type: string
        content:
          type: object
      required:
        - code
        - message
    apps_management_TenantAppResponse:
      type: object
      properties:
        id:
          type: string
        platform:
          type: string
          enum:
            - APPLE
            - WINDOWS
        tenant_id:
          type: string
        package_name:
          type: string
        created_at:
          type: string
          format: date-time
        created_by:
          type: string
        updated_at:
          type: string
          format: date-time
        updated_by:
          type: string
    apps_management_AppUploadRequestBody:
      type: object
      properties:
        platform:
          type: string
          enum:
            - APPLE
            - WINDOWS
        file:
          type: string
          format: binary
          description: >-
            The main app binary (e.g. `.ipa`, `.msi`, `.exe`, `.msix`,
            `.msixbundle`).
    apps_management_TenantAppUploadResponse:
      type: object
      properties:
        id:
          type: string
        version_id:
          type: string
        app_name:
          type: string
        platform:
          type: string
          enum:
            - APPLE
            - WINDOWS
        tenant_id:
          type: string
        package_name:
          type: string
        created_at:
          type: string
          format: date-time
        created_by:
          type: string
        updated_at:
          type: string
          format: date-time
        updated_by:
          type: string
    apps_management_Error_403_Forbidden:
      type: object
      properties:
        code:
          type: integer
          format: int32
          default: 403
        message:
          type: string
        content:
          type: object
      required:
        - code
        - message
    apps_management_WindowsExeRegistryValidationArgs:
      type: object
      required:
        - registry_path
        - registry_key
        - registry_value
      properties:
        registry_path:
          type: string
          description: >-
            Registry path. e.g.
            HKCU:\Software\Microsoft\Windows\CurrentVersion\Uninstall\MyApp
        registry_key:
          type: string
          description: Registry value name within the path.
        registry_value:
          type: string
          description: Expected value.
    apps_management_WindowsExeFileValidationArgs:
      type: object
      required:
        - file_path
      properties:
        file_path:
          type: string
          description: File path to check.
    apps_management_TenantAppVersionResponse:
      type: object
      properties:
        id:
          type: string
        app_id:
          type: string
        app_type:
          type: string
          enum:
            - TENANT_IOS
            - TENANT_WINDOWS
            - TENANT_WINDOWS_EXE
            - TENANT_WINDOWS_UWP
        tenant_id:
          type: string
        app_name:
          type: string
        app_icon_url:
          type: string
        release_notes:
          type: string
        description:
          type: string
        file_size_in_kb:
          type: integer
        device_family:
          type: array
          items:
            type: string
        version_name:
          type: string
        build_number:
          type: string
          description: Build number of the app. Omitted when legacy_format is false.
        version_code:
          type: string
          description: >-
            Version code of the app (same as build_number). Only present when
            legacy_format is false.
        min_sdk_version:
          type: string
        created_at:
          type: string
          format: date-time
        updated_at:
          type: string
          format: date-time
        created_by:
          type: string
        updated_by:
          type: string
        is_active:
          type: boolean
          nullable: true
          description: >-
            Present only when app_type is TENANT_WINDOWS_EXE. True only when
            install_script, uninstall_script, and success_criteria are all set.
            Gates downstream install commands — a version with is_active=false
            cannot be deployed.
        success_criteria_type:
          type: string
          enum:
            - REGISTRY_VALIDATION
            - FILE_VALIDATION
          nullable: true
          description: >-
            Present only when app_type is TENANT_WINDOWS_EXE. Discriminator for
            the validation check performed after install/uninstall.
        success_criteria:
          nullable: true
          description: >-
            Present only when app_type is TENANT_WINDOWS_EXE. Contains the
            validation args. Shape depends on success_criteria_type.
          oneOf:
            - $ref: >-
                #/components/schemas/apps_management_WindowsExeRegistryValidationArgs
            - $ref: >-
                #/components/schemas/apps_management_WindowsExeFileValidationArgs
    apps_management_MsixAumid:
      type: object
      description: >-
        A single Application User Model ID (AUMID) entry exposed by an MSIX
        package.
      properties:
        application_id:
          type: string
          description: The <Application Id> from the package manifest.
        aumid:
          type: string
          description: >-
            The fully-qualified AUMID, formatted as
            PackageFamilyName!ApplicationId.
        is_default:
          type: boolean
          description: True for the first launchable entry, treated as the package default.
    apps_management_AppVersionArtifactMetadata:
      type: object
      description: |
        Type-specific attributes of an artifact. All fields are optional; only
        those relevant to the artifact's type are populated.
      properties:
        package_family_name:
          type: string
          nullable: true
          description: The dependency package's own package family name (UWP_DEPENDENCY).
        package_dependency_name:
          type: string
          nullable: true
          description: >-
            The <PackageDependency Name> declared by the main package manifest
            (UWP_DEPENDENCY).
        min_version:
          type: string
          nullable: true
          description: >-
            The minimum required version declared by the main package manifest
            (UWP_DEPENDENCY).
        version_name:
          type: string
          nullable: true
          description: >-
            The actual version of the uploaded dependency package
            (UWP_DEPENDENCY).
        architecture:
          type: string
          nullable: true
          description: >-
            The dependency package architecture, e.g. x64, x86, arm64
            (UWP_DEPENDENCY).
        cert_thumbprint:
          type: string
          nullable: true
          description: SHA1 thumbprint of the signing certificate (UWP_CERTIFICATE).
    apps_management_AppVersionArtifact:
      type: object
      description: >-
        A generic per-version artifact (e.g. a UWP framework dependency or
        signing certificate).
      properties:
        id:
          type: string
          description: The artifact row id (UUID).
        artifact_type:
          type: string
          description: >-
            The artifact discriminator (e.g. "UWP_DEPENDENCY",
            "UWP_CERTIFICATE").
        file_name:
          type: string
          nullable: true
          description: The original uploaded filename of the artifact.
        app_sha256_hash:
          type: string
          nullable: true
          description: SHA256 hash of the uploaded artifact file.
        download_url:
          type: string
          nullable: true
          description: Presigned S3 URL for downloading the artifact.
        metadata:
          nullable: true
          allOf:
            - $ref: '#/components/schemas/apps_management_AppVersionArtifactMetadata'
    apps_management_TenantAppVersionDetailResponse:
      allOf:
        - $ref: '#/components/schemas/apps_management_TenantAppVersionResponse'
        - type: object
          properties:
            app_download_url:
              type: string
              description: >-
                Presigned URL for downloading the app binary. Present for
                TENANT_IOS (IPA), TENANT_WINDOWS (MSI), and TENANT_WINDOWS_UWP
                (MSIX/MSIXBundle) app types.
            app_sha256_hash:
              type: string
              description: >-
                SHA256 hash of the app binary. Present for TENANT_IOS,
                TENANT_WINDOWS, and TENANT_WINDOWS_UWP app types.
            product_code:
              type: string
              description: MSI product code. Present only when app_type is TENANT_WINDOWS.
            install_script:
              type: string
              nullable: true
              description: >-
                PowerShell install script content. Present only when app_type is
                TENANT_WINDOWS_EXE. Null if not yet configured.
            uninstall_script:
              type: string
              nullable: true
              description: >-
                PowerShell uninstall script content. Present only when app_type
                is TENANT_WINDOWS_EXE. Null if not yet configured.
            package_format:
              type: string
              enum:
                - MSIX
                - MSIXBUNDLE
              description: >-
                Present only when app_type is TENANT_WINDOWS_UWP. Indicates
                whether the package is a single .msix or a .msixbundle.
            package_family_name:
              type: string
              nullable: true
              description: >-
                Present only when app_type is TENANT_WINDOWS_UWP. The package
                family name (PFN) derived from the manifest identity and
                publisher.
            identity_name:
              type: string
              nullable: true
              description: >-
                Present only when app_type is TENANT_WINDOWS_UWP. The <Identity
                Name> from the package manifest.
            publisher:
              type: string
              nullable: true
              description: >-
                Present only when app_type is TENANT_WINDOWS_UWP. The <Identity
                Publisher> from the package manifest.
            architecture:
              type: string
              nullable: true
              description: >-
                Present only when app_type is TENANT_WINDOWS_UWP. Package
                architecture (e.g. x64, x86, arm64, neutral).
            entry_point_type:
              type: string
              nullable: true
              description: >-
                Present only when app_type is TENANT_WINDOWS_UWP. The
                application entry point type from the manifest.
            aumids:
              type: array
              description: >-
                Present only when app_type is TENANT_WINDOWS_UWP. The
                Application User Model IDs (AUMIDs) exposed by the package,
                extracted from the manifest at ingest.
              items:
                $ref: '#/components/schemas/apps_management_MsixAumid'
            artifacts:
              type: array
              description: >-
                Present only when app_type is TENANT_WINDOWS_UWP. Per-version
                artifacts (framework dependencies, signing certificates, etc.),
                each with a presigned download URL.
              items:
                $ref: '#/components/schemas/apps_management_AppVersionArtifact'
    apps_management_WindowsExeSuccessCriteria:
      type: object
      required:
        - type
        - validation_args
      properties:
        type:
          type: string
          enum:
            - REGISTRY_VALIDATION
            - FILE_VALIDATION
          description: >
            Discriminator for the validation check performed after
            install/uninstall.

            REGISTRY_VALIDATION checks a registry key/value; FILE_VALIDATION
            checks file existence.
        validation_args:
          oneOf:
            - $ref: >-
                #/components/schemas/apps_management_WindowsExeRegistryValidationArgs
            - $ref: >-
                #/components/schemas/apps_management_WindowsExeFileValidationArgs
    apps_management_WindowsExeConfigRequest:
      type: object
      description: |
        EXE configuration. All fields are optional; omitted fields leave
        existing values unchanged.
      properties:
        install_script:
          type: string
          description: PowerShell install script body. Maximum 64 KB.
        uninstall_script:
          type: string
          description: PowerShell uninstall script body. Maximum 64 KB.
        success_criteria:
          $ref: '#/components/schemas/apps_management_WindowsExeSuccessCriteria'
    apps_management_ArtifactMutationResponse:
      type: object
      description: |
        Identifies the artifact affected by an add/delete (identity-style, like
        the app upload response) so the caller can refresh its view without a
        full re-fetch.
      properties:
        id:
          type: string
          format: uuid
          description: The affected artifact's id.
        version_id:
          type: string
          format: uuid
          description: The app version the artifact belongs to.
        tenant_id:
          type: string
          format: uuid
        artifact_type:
          type: string
          enum:
            - UWP_DEPENDENCY
            - UWP_CERTIFICATE
          description: The artifact discriminator.
        file_name:
          type: string
          nullable: true
          description: The artifact's original filename.
        metadata:
          nullable: true
          allOf:
            - $ref: '#/components/schemas/apps_management_AppVersionArtifactMetadata'
    apps_management_AppleAppStoreApp:
      type: object
      properties:
        icon:
          type: string
          format: uri
          description: URL for the app icon
          example: https://icon-url.com
        name:
          type: string
          description: Name of the app
          example: Safari
        bundle_id:
          type: string
          description: Bundle identifier for the app
          example: com.apple.mobilesafari
        file_size_in_bytes:
          type: string
          description: File size of the app in bytes
          example: '100'
        app_store_url:
          type: string
          format: uri
          description: URL to the app store listing
          example: https://apps.apple.com/us/app/
        minimum_os:
          type: string
          description: Minimum OS version required
          example: '10.0'
        release_date:
          type: string
          format: date-time
          description: Release date of the app
          example: '2021-10-25T07:00:00.000Z'
        seller_name:
          type: string
          description: Name of the seller
          example: Apple Inc.
    apps_management_AppInfo:
      type: object
      properties:
        app_id:
          type: string
          description: Unique identifier for the app.
        app_version_id:
          type: string
          description: Unique identifier for the app version.
        app_type:
          type: string
          description: Type of the app.
        tenant_id:
          type: string
          description: Identifier for the tenant.
        name:
          type: string
          description: Name of the app to show on console.
        label:
          type: string
          description: Label for the app to show on device.
        icon_url:
          type: string
          format: uri
          description: URL to the app icon.
        package_name:
          type: string
          description: Unique identifier for the app bundle.
        is_removable:
          type: boolean
          description: Indicates if the app can be removed.
        is_full_screen:
          type: boolean
          description: Indicates if the app runs in full-screen mode.
        url:
          type: string
          format: uri
          description: URL to access the app.
        file_size_in_kb:
          type: integer
          description: Size of the app in kilobytes.
        release_notes:
          type: string
          description: Release notes for the app version.
        description:
          type: string
          description: Description of the app.
        build_number:
          type: string
          description: Build number of the app. Omitted when legacy_format is false.
        version_code:
          type: string
          description: >-
            Version code of the app (same as build_number). Only present when
            legacy_format is false.
        version_name:
          type: string
          description: Version name of the app.
        min_sdk_version:
          type: string
          description: Minimum SDK version required to run the app.
        created_at:
          type: string
          format: date-time
          description: Timestamp when the app was created.
        created_by:
          type: string
          description: User who created the app entry.
        updated_at:
          type: string
          format: date-time
          description: Timestamp when the app was last updated.
        updated_by:
          type: string
          description: User who last updated the app entry.
    apps_management_Webclip:
      type: object
      properties:
        id:
          type: string
          format: uuid
          description: Unique identifier for the web clip
          example: 09811f63-e2ca-4625-97c1-081145195d67
        tenant_id:
          type: string
          format: uuid
          description: Tenant identifier
          example: 7d5fd1bf-bdf9-490b-9e32-203756a61235
        label:
          type: string
          description: Label of the web clip
          example: Google
        url:
          type: string
          format: uri
          description: URL associated with the web clip
          example: https://www.google.com/
        icon_url:
          type: string
          format: uri
          nullable: true
          description: URL for the icon of the web clip
          example: null
        target_bundle_name:
          type: string
          description: Name of the target bundle
          example: Esper
        target_bundle_id:
          type: string
          description: ID of the target bundle
          example: com.esper.io
        is_full_screen:
          type: boolean
          description: Indicates if the web clip is full screen
          example: false
        is_removable:
          type: boolean
          description: Indicates if the web clip is removable
          example: true
        created_at:
          type: string
          format: date-time
          description: Timestamp of when the web clip was created
        updated_at:
          type: string
          format: date-time
          description: Timestamp of when the web clip was last updated
        created_by:
          type: string
          description: The user who created the web clip
        updated_by:
          type: string
          description: The user who last updated the web clip
    apps_management_WebclipCreateRequest:
      type: object
      properties:
        icon:
          type: string
          format: binary
          description: Icon of the webclip
        label:
          type: string
          description: Label of the web clip which is displayed on device
          example: Example Label
        esper_name:
          type: string
          description: Name of the webclip in Esper
          example: Example Name
        url:
          type: string
          description: URL for the webclip
          example: https://example.com
        target_bundle_id:
          type: string
          description: Target bundle ID for the webclip
          example: com.example.bundle
        target_bundle_name:
          type: string
          description: Target bundle name for the webclip
          example: Example Bundle
        is_full_screen:
          type: boolean
          description: Indicates if the webclip is full screen
          example: true
        is_removable:
          type: boolean
          description: Indicates if the webclip is removable
          example: false
      required:
        - label
        - esper_name
        - url
        - target_bundle_id
        - target_bundle_name
        - is_full_screen
        - is_removable
    apps_management_Error_409_Conflict:
      type: object
      properties:
        code:
          type: integer
          format: int32
          default: 409
        message:
          type: string
        content:
          type: object
      required:
        - code
        - message
    apps_management_ProvisioningProfileUploadResponse:
      type: object
      properties:
        id:
          type: string
          format: uuid
          description: Unique identifier for the provisioning profile
        version_id:
          type: string
          format: uuid
          description: Unique identifier for this specific version of the profile
        name:
          type: string
          description: Display name of the provisioning profile
        team_identifier:
          type: string
          description: Apple Developer Team identifier
        app_identifier:
          type: string
          description: Bundle identifier of the associated app
        profile_type:
          type: string
          description: Type of profile (development, distribution, etc.)
          enum:
            - development
            - ad-hoc
            - app-store
            - enterprise
        expiration_date:
          type: string
          format: date-time
          description: When the provisioning profile expires
        tenant_id:
          type: string
          format: uuid
          description: Tenant that owns this provisioning profile
        created_at:
          type: string
          format: date-time
          description: When the provisioning profile was first created
        updated_at:
          type: string
          format: date-time
          description: When this version was last updated
        created_by:
          type: string
          description: User who created the provisioning profile
        updated_by:
          type: string
          description: User who created this version
    apps_management_ProvisioningProfileWithDownloadResponse:
      type: object
      allOf:
        - $ref: >-
            #/components/schemas/apps_management_ProvisioningProfileUploadResponse
        - type: object
          properties:
            download_url:
              type: string
              format: uri
              description: Signed URL for downloading the provisioning profile file
              example: >-
                https://s3.amazonaws.com/bucket/provisioning-profiles/profile.mobileprovision?signature=abc123
    apps_management_ProvisioningProfileUploadRequest:
      type: object
      properties:
        file:
          type: string
          format: binary
          description: Provisioning profile file (.mobileprovision)
      required:
        - file
    apps_management_ProvisioningProfileVersionWithDownloadResponse:
      type: object
      properties:
        id:
          type: string
          format: uuid
          description: Primary key and unique identifier for this version
        profile_id:
          type: string
          format: uuid
          description: Foreign key reference to the parent ProvisioningProfile
        uuid:
          type: string
          description: Apple's UUID for this specific provisioning profile version
        name:
          type: string
          description: Display name of the provisioning profile version
        sha256_hash:
          type: string
          description: SHA256 hash of the provisioning profile file for duplicate detection
        creation_date:
          type: string
          format: date-time
          description: >-
            When Apple created this provisioning profile (from .mobileprovision
            file)
        expiration_date:
          type: string
          format: date-time
          description: When this provisioning profile expires (from Apple)
        time_to_live:
          type: integer
          description: Days until expiration from creation date
        provisions_all_devices:
          type: boolean
          description: Whether this profile provisions all devices (enterprise profiles)
        is_xcode_managed:
          type: boolean
          description: Whether this profile is managed by Xcode automatically
        platforms:
          type: string
          description: JSON array of supported platforms (iOS, macOS, etc.)
        entitlements:
          type: string
          description: JSON object of app entitlements and capabilities
        developer_certificates:
          type: string
          description: JSON array of developer certificates included in this profile
        tenant_id:
          type: string
          format: uuid
          description: Tenant that owns this provisioning profile version
        created_by:
          type: string
          description: User identifier who uploaded this version
        updated_by:
          type: string
          description: User identifier who last modified this version record
        created_at:
          type: string
          format: date-time
          description: Timestamp when this version record was created in the database
        updated_at:
          type: string
          format: date-time
          description: Timestamp when this version record was last modified
        download_url:
          type: string
          format: uri
          description: Signed URL for downloading the provisioning profile file
          example: >-
            https://s3.amazonaws.com/bucket/provisioning-profiles/version.mobileprovision?signature=abc123
    apps_management_TenantPreferredRegions:
      type: object
      properties:
        tenant_id:
          type: string
          format: uuid
          description: Unique identifier for the tenant
        countries:
          type: array
          items:
            type: string
          description: List of preferred country codes
          example:
            - AU
            - IN
            - US
        created_by:
          type: string
          description: The user who created the preferred regions
        created_at:
          type: string
          format: date-time
          description: Timestamp of when the preferred regions were first created
        updated_by:
          type: string
          description: The user who last updated the preferred regions
        updated_at:
          type: string
          format: date-time
          description: Timestamp of when the preferred regions were last updated
    apps_management_SetPreferredRegionsRequest:
      type: object
      required:
        - countries
      properties:
        countries:
          type: array
          items:
            type: string
            pattern: ^[A-Z]{2}$
          description: >-
            List of ISO 3166-1 alpha-2 country codes (2-character uppercase). An
            empty array clears the tenant's preferred region preference.
          example:
            - AU
            - IN
            - US
    apps_management_EsperAppVersionResponse:
      type: object
      properties:
        id:
          type: string
        app_id:
          type: string
        app_type:
          type: string
          enum:
            - TENANT_IOS
            - ESPER_IOS
            - ESPER_ANDROID
            - ESPER_LINUX
            - ESPER_WINDOWS
        app_name:
          type: string
        app_icon_url:
          type: string
        app_download_url:
          type: string
        app_sha256_hash:
          type: string
        signature_hash:
          type: string
          description: >-
            SHA-256 fingerprint of the app's public key in uppercase hexadecimal
            with colon separators (only for Android apps)
        architecture:
          type: string
        release_notes:
          type: string
        description:
          type: string
        file_size_in_kb:
          type: integer
        device_family:
          type: array
          items:
            type: string
        version_name:
          type: string
        build_number:
          type: string
        min_sdk_version:
          type: string
        created_at:
          type: string
          format: date-time
        updated_at:
          type: string
          format: date-time
        created_by:
          type: string
        updated_by:
          type: string
    apps_management_TenantEsperAppsItem:
      type: object
      properties:
        tenant_id:
          type: string
        app_version_id:
          type: string
        app_id:
          type: string
        package_name:
          type: string
          description: Package name of the app (only shown for Android apps)
        app_sha256_hash:
          type: string
        signature_hash:
          type: string
          description: Signature hash of the app (only shown for Android apps)
        architecture:
          type: string
        app_download_url:
          type: string
        version_code:
          type: string
          description: Version code of the app (only shown for Android apps)
        created_by:
          type: string
        created_at:
          type: string
          format: date-time
    apps_management_OEMConfigSchema:
      type: object
      description: >-
        OEM config schema metadata and optional JSON schema content parsed from
        an OEM APK
      properties:
        id:
          type: string
          format: uuid
          description: Unique identifier for this schema record
        oem_type:
          type: string
          enum:
            - ZEBRA
            - HONEYWELL
            - DATALOGIC
            - SAMSUNG
            - SUNMI
          description: OEM manufacturer type
        package_name:
          type: string
          description: OEM config package name
          example: com.zebra.oemconfig.common
        version_name:
          type: string
          description: Human-readable version string from the APK manifest
          example: 11.3.3.00
        version_code:
          type: string
          description: Integer version code from the APK manifest
          example: '10'
        schema_format:
          type: string
          description: Format of the parsed schema (e.g. MANAGED_CONFIGURATIONS)
        parser_version:
          type: string
          description: Version of the internal parser that produced this schema
        is_latest:
          type: boolean
          description: >-
            Whether this is the latest active schema for this oem_type +
            package_name
        status:
          type: string
          enum:
            - ACTIVE
            - INACTIVE
          description: Status of this schema record
        schema_metadata:
          type: object
          description: Additional metadata produced by the parser (parser-specific)
        schema_json:
          type: object
          description: Full parsed schema JSON. Omitted when include_schema=false.
        created_at:
          type: string
          format: date-time
          description: Timestamp when this schema was first persisted
    commands_DeviceCommandEnum:
      type: string
      description: >
        Following commands are supported

        ```

        * ADD_TO_WHITELIST: Whitelist an installed sytem app. Requires
        `package_name` in command arguments where `package_name` is the app
        package uploaded on Esper

        * ADD_WIFI_AP : Add wifi access points for device. Requires
        `wifi_access_points` in command arguments where `wifi_access_points` is
        the data with access points

        * APPLY_APP_CONFIG : Apply app configuration for an installed app.

        * CLEAR_APP_DATA : Clear data for an installed app. Requires
        `package_name` in command arguments where `package_name` is the app
        package uploaded on Esper

        * CLEAR_APP_CACHE : Clear the cache of an installed app without removing
        its data. Requires `package_name` in command arguments where
        `package_name` is the app package uploaded on Esper. Supported on
        Android 6.0+ devices with the supervisor installed.

        * CONVERGE: Converge command for Blueprint

        * INSTALL: Install an app on a device. Requires `app_version` in command
        arguments where `app_version` is the version id of app uploaded on Esper

        * INSTALL_CERTIFICATE: Install a certificate chain in the system
        keystore of an android device. Requires `cert_file_type`,
        `cert_data_base64`, `cert_alias_name` and `cert_storage_type` in command
        arguments where `cert_file_type` must be set to "pkcs12",
        `cert_data_base64` contains the base64 encoded content of the pkcs12
        file, `cert_alias_name` is the alias name with which the certificate
        chain is supposed to be installed and `cert_storage_type` must be set to
        "system". If the pkcs12 file is password protected, the password should
        be specified in the optional parameter `cert_password`.

        * LOCK: Lock device screen, Supports Android, iOS and Windows devices.

        * REBOOT: Reboot a device. Supports Android, iOS, and Windows devices.

        * REMOVE_FROM_WHITELIST : Remove an installed system app from whitelist.
        Requires `package_name` in command arguments where `package_name` is the
        app package uploaded on Esper

        * REMOVE_WIFI_AP : Remove Wifi access points for device. Requires
        `wifi_access_points` in command arguments where `wifi_access_points` is
        the data with access points

        * UPDATE_WIFI_AP : Update Wi-Fi access point configuration on device.
        Requires `wifi_ssid` and `wifi_security_type` in command arguments.
        Device must be connected to the target SSID. Supports EAP (enterprise)
        and personal (WPA2/WPA/WEP) networks. On failure, attempts to restore
        the previous configuration. Android only.

        * SET_APP_PERMISSION : Set permission for an installed app. Requires
        `package_name`, `grant_state`, `permission` in command arguments where
        `package_name` is the app package uploaded on Esper, `grant_state`
        should be "PERMISSION_GRANT_STATE_DEFAULT",
        "PERMISSION_GRANT_STATE_DENIED", "PERMISSION_GRANT_STATE_GRANTED" and
        `permission` is a valid permission

        * SET_APP_STATE : Set the state of an app -
        SHOW/HIDE/DISABLE/LAUNCHABLE_BUT_HIDDEN. Requries `app_state` and
        `package_name` in command arguments where `app_state` is the state of
        app and `package_name` is the app package uploaded on Esper For
        LAUNCHABLE_BUT_HIDDEN: Hide an app on the home screen but allow it to be
        launched from other apps. Requires Esper agent 8.5+ and `package_name`. 

        * SET_BLUETOOTH_STATE : Set bluetooth state (ON/OFF) for device.
        Requires `bluetooth_state` in command arguments where `bluetooth_state`
        is a boolean.

        * SET_BRIGHTNESS_SCALE : Set brightness for device. Requires
        `brightness_value` in command arguments where `brightness_value` is an
        integer (1-100).

        * SET_DEVICE_LOCKDOWN_STATE : Set lockdown state for a device. Requires
        `state` and `message` in command arguments where `state` is
        LOCKED/UNLOCKED and `message` is the message to be added with command

        * SET_GPS_STATE :Set the GPS state for a device. Requires `gps_state` in
        command arguments where `gps_state` should be either 0, 1, 2, 3 or 4
        (LOCATION_MODE_HIGH_ACCURACY = 0, LOCATION_MODE_SENSORS_ONLY = 1,
        LOCATION_MODE_BATTERY_SAVING = 2, LOCATION_MODE_OFF = 3,
        LOCATION_MODE_ON = 4)

        * SET_KIOSK_APP : Command to set the Kiosk app for a device. Requires
        `package_name` in command arguments where `package_name` is the app
        package uploaded on Esper. For iOS devices, optionally accepts
        `disable_device_rotation` (boolean, default false) which disables device
        rotation sensing while in kiosk mode, and `disable_screen_timeout`
        (boolean, default true) which disables the screen auto-lock/timeout
        while in kiosk mode.


        * SET_MULTI_APP_MODE : Command to set the device back to multi app mode.

        * SET_NEW_POLICY : Apply policy on device. Requires `policy_url` in
        command arguments where `policy_url` is the URL to the policy

        * SET_ROTATION_STATE : Set screen orientation. Requires `rotate_state`
        in command arguments where `rotate_state` should be either 0, 1 or 2 (0
        = AUTO, 1 = PORTRAIT_ONLY, 2 = LANDSCAPE_ONLY)

        * SET_SCREEN_OFF_TIMEOUT: Set screen off timeout for a device. Requires
        `screen_off_timeout` in command arguments where `screen_off_timeout`
        should be either -1 or between 5000 and 1800000

        * SET_STREAM_VOLUME : Set strema volume for a device. Requires `stream`
        and `volume_level` in command arguments where `stream` should be either
        0(Ring), 1(Notification), 2(Alarm) or 3(Music) and `volume_level` should
        be a value from 0 to 100

        * SET_TIMEZONE : Set the timezone for a device. Requires
        `timezone_string` in command arguments where `timezone_string` is a
        valid string representing the timezone

        * SET_WIFI_STATE : Set the wifi state (ON/OFF) for a device. Requires
        `wifi_state` in command arguments where `wifi_state` is a boolean.

        * UNINSTALL: Uninstall an app from device. Requires `package_name` in
        command arguments where `package_name` is the app package uploaded on
        Esper

        * UNINSTALL_CERTIFICATE: Uninstall a certificate from an android
        device's system keystore using the installed certificate's alias name.
        Requires `cert_alias_name` and `cert_storage_type` in command arguments
        where `cert_alias_name` is the alias name of the certificate to be
        uninstalled and `cert_storage_type` must be set to "system"

        * UPDATE_DEVICE_CONFIG: Push additional configurations to the Device

        * UPDATE_HEARTBEAT: Ping a device

        * UPDATE_LATEST_DPC : Prompt device to update the DPC app to the latest
        versions.

        * WIPE : Wipes the device.

        * RESET_LOCKSCREEN_PASSWORD: Change the lockscreen password of the
        device. Requires `new_lockscreen_password` in command arguments where
        `new_lockscreen_password` is a valid string.

        * UPDATE_BLUEPRINT: Pushes or reapplies the most current Blueprint
        version to the device or group.

        * NOTIFY_DEVICE: Allows you to  broadcast message to the device.

        * SET_DEVICE_LANGUAGE: Set language for a device. Requires locale value
        in xx[_Zzzz]_yy where xx is language code, Zzzz is script (optional) and
        yy is country code.

        * SET_ETHERNET_SETTINGS: Set ethernet settings on supported Device

        * SET_STATIC_IP: Set static ip on the deivce. Requires interface,
        dhcp_dnabled, static_ip, primary_dns, subnet_mask, gateway,
        secondary_dns (optional)

        * BEEP_DEVICE: Allows you to make the device beep for a specified
        duration

        * SET_APP_NOTIFICATIONS: Enable/disable app notifications. Requries
        `app_notifications_state` and `package_name` in command arguments where
        `app_notifications_state` is a string that has the value `ENABLED` or
        `DISABLED` and `package_name` is the app package uploaded on Esper.

        * USE_ONLY_SAVED_WIFI_AP: Allow/disallow device to connect to
        unregistered WiFi APs. Requires boolean `use_only_saved_ap`..

        * DEVICE_INFORMATION: Prompt device to update the device information

        * VPP_APP_INSTALL: Install a vpp app on an iOS device. Requires `app_id`
        and `bundle_identifier` in command arguments that corresponds to the
        associate vpp app

        * APPLE_APP_UNINSTALL: Uninstall an app on an iOS device. Requires
        `app_id` and `bundle_identifier` in command arguments that corresponds
        to the associated app

        * CLEAR_PASSCODE: Clear the passcode in a device

        * LIST_INSTALLED_PROFILES: Returns a list of all installed profiles on
        an iOS device.

        * INSTALL_PROFILE: Install a profile on an iOS device.

        * REMOVE_PROFILE: Remove a profile from an iOS device.

        * RUN_SHELL_SCRIPT: Run a shell script on a Linux or Windows device.
        Requires `script` and `interpreter` in command arguments.

        * RUN_CUSTOM_ACTION: Run a custom action (script) on a Linux device.
        Requires custom action parameters in command arguments.

        * COLLECT_LOGS: Collect and upload Esper agent logs from a Linux device.

        * SCHEDULE_OS_UPDATE: Schedule an OS update on an Apple device. Requires
        `product_version` (string) and `install_action` (string, one of
        "Default", "DownloadOnly", "InstallASAP") in command_args.

        * OS_UPDATE_STATUS: Query the status of pending or in-progress OS
        updates on an Apple device.

        * SCAN_OS_UPDATES: Query available OS updates on an Apple device.

        * ENFORCE_OS_UPDATE_SETTINGS: Configure software update settings on an
        Apple device via DDM (Declarative Device Management). Maps to Apple's
        `com.apple.configuration.softwareupdate.settings` declaration. Supports
        `allow_standard_user_os_updates` (boolean), `automatic_actions` (object
        with `download`, `install_os_updates`, `install_security_update` — each
        "allowed", "always_on", or "always_off"), `deferrals` (object — must
        specify EITHER `combined_period_in_days` alone OR all three of
        `major_period_in_days`, `minor_period_in_days`, `system_period_in_days`;
        each value 1-90 days; mixing combined with any individual field is
        rejected), `notifications` (boolean), `rapid_security_response` (object
        with `enable`, `enable_rollback` — both boolean), and
        `recommended_cadence` ("all", "oldest", or "newest"). Requires
        iOS/iPadOS 18.0+ or tvOS 18.4+.

        * ENFORCE_SOFTWARE_UPDATE: Enforce software update on an Apple device.
        Requires `target_os_version` and `target_local_date_time` in command
        arguments where `target_os_version` is the OS version to update to and
        `target_local_date_time` is local date time value that specifies when to
        force install the software update. Use the format yyyy-mm-ddThh:mm:ss,
        which is derived from RFC3339 but doesn’t include a time zone offset. If
        the user doesn’t trigger the software update before this time, the
        device force installs it. Applicable for iOS/iPadOS 17+ and tvOS 18.4+
        after enabling Declarative Device Management (DDM) on the device.

        * SET_OS_UPDATE_POLICY: Allow, disable or schedule automatic updates on
        a Windows device. Requires `auto_update_type` in command arguments.
        `auto_update_type` supports "NOTIFY_DOWNLOAD",
        "AUTO_INSTALL_AND_NOTIFY_RESTART", "DEFAULT",
        "SCHEDULED_INSTALL_AND_RESTART", "AUTO_INSTALL_AND_RESTART_FORCED" or
        "OFF".

        ```
      enum:
        - ADD_TO_WHITELIST
        - ADD_WIFI_AP
        - APPLY_APP_CONFIG
        - CLEAR_APP_CACHE
        - CLEAR_APP_DATA
        - CONVERGE
        - INSTALL
        - INSTALL_CERTIFICATE
        - LIST_INSTALLED_PROFILES
        - LOCK
        - REBOOT
        - REMOVE_FROM_WHITELIST
        - REMOVE_PROFILE
        - REMOVE_WIFI_AP
        - SET_APP_PERMISSION
        - SET_APP_STATE
        - SET_BLUETOOTH_STATE
        - SET_BRIGHTNESS_SCALE
        - SET_DEVICE_LOCKDOWN_STATE
        - SET_GPS_STATE
        - SET_KIOSK_APP
        - SET_MULTI_APP_MODE
        - SET_NEW_POLICY
        - SET_ROTATION_STATE
        - SET_SCREEN_OFF_TIMEOUT
        - SET_STREAM_VOLUME
        - SET_TIMEZONE
        - SET_WIFI_STATE
        - UNINSTALL
        - UNINSTALL_CERTIFICATE
        - UPDATE_DEVICE_CONFIG
        - UPDATE_HEARTBEAT
        - UPDATE_LATEST_DPC
        - UPDATE_WIFI_AP
        - WIPE
        - RESET_LOCKSCREEN_PASSWORD
        - UPDATE_BLUEPRINT
        - NOTIFY_DEVICE
        - SET_DEVICE_LANGUAGE
        - SET_ETHERNET_SETTINGS
        - SET_STATIC_IP
        - BEEP_DEVICE
        - SET_APP_NOTIFICATIONS
        - USE_ONLY_SAVED_WIFI_AP
        - DEVICE_INFORMATION
        - VPP_APP_INSTALL
        - APPLE_APP_UNINSTALL
        - CLEAR_PASSCODE
        - INSTALL_PROFILE
        - RUN_SHELL_SCRIPT
        - RUN_CUSTOM_ACTION
        - COLLECT_LOGS
        - SCAN_OS_UPDATES
        - SCHEDULE_OS_UPDATE
        - OS_UPDATE_STATUS
        - ENFORCE_OS_UPDATE_SETTINGS
        - ENFORCE_SOFTWARE_UPDATE
        - SET_OS_UPDATE_POLICY
    commands_CommandArgs:
      title: Command args
      type: object
      properties:
        device_alias_name:
          type: string
          description: Alternate human-readable name for your Device
        custom_settings_config:
          type: object
          properties: {}
          description: Managed configurations for your device (passed as JSON object)
        app_version:
          type: string
          description: The version id of app uploaded on Esper
        package_name:
          type: string
          description: The app package name uploaded on Esper
        policy_url:
          type: string
          description: The URL to the policy
        wifi_access_points:
          type: object
          properties: {}
          description: Wifi access points for the device (passed as JSON object)
        wifi_ssid:
          type: string
          description: The Wi-Fi network SSID to update (must be currently connected)
        wifi_security_type:
          type: string
          enum:
            - NONE
            - WEP
            - WPA
            - WPA2
            - SAE
            - EAP
          description: Security type of the Wi-Fi network
        wifi_password:
          type: string
          description: Network password (required for WEP/WPA/WPA2)
        wifi_eap_method:
          type: string
          enum:
            - PEAP
            - TLS
            - TTLS
            - PWD
            - SIM
            - AKA
            - AKA_PRIME
          description: EAP method (required when wifi_security_type is EAP)
        wifi_phase2_auth:
          type: string
          description: Phase 2 authentication (required for PEAP/TTLS)
        certificate_file_path:
          type: string
          description: Path to .pfx or .p12 certificate on device (EAP/TLS)
        certificate_file_password:
          type: string
          description: Certificate file password if encrypted
        identity:
          type: string
          description: EAP identity or username
        anonymous_identity:
          type: string
          description: Outer identity for tunneled EAP methods
        domain:
          type: string
          description: Authentication server domain (EAP)
        hidden:
          type: boolean
          description: Whether the network is hidden (default false)
        state:
          type: string
          description: LOCKED/UNLOCKED
        message:
          type: string
          description: Message to be added with command to notify device.
        title:
          type: string
          description: Message title  to be added with command to notify device.
        url:
          type: string
          description: (Optional) Link to notify device.
        app_state:
          type: string
          description: The state of app - SHOW/HIDE/DISABLE/LAUNCHABLE_BUT_HIDDEN
        bluetooth_state:
          type: boolean
          description: The state of bluetooth - ON/OFF
        brightness_value:
          type: integer
          description: The brightness value of a device(1-100)
        gps_state:
          type: integer
          description: >-
            The GPS state of a device. Should be either 0, 1, 2, 3 or 4
            (LOCATION_MODE_HIGH_ACCURACY = 0, LOCATION_MODE_SENSORS_ONLY = 1,
            LOCATION_MODE_BATTERY_SAVING = 2, LOCATION_MODE_OFF = 3,
            LOCATION_MODE_ON = 4)
        rotate_state:
          type: integer
          description: >-
            The screen orientation of a device. Should be either 0, 1 or 2 (0 =
            AUTO, 1 = PORTRAIT_ONLY, 2 = LANDSCAPE_ONLY)
        screen_off_timeout:
          type: integer
          description: >-
            The value for screen timeout of a device. Should be either -1 or
            between 5000 and 1800000
        stream:
          type: integer
          description: >-
            The value of the volume stream. Should be either 0(Ring),
            1(Notification), 2(Alarm) or 3(Music)
        volume_level:
          type: integer
          description: The level of volume. Should be a value from 0 to 100
        timezone_string:
          type: integer
          description: The timezone of a device. Should be a valid timezone string
        wifi_state:
          type: boolean
          description: The state of WIFI - ON/OFF
        wifi_revert_timeout:
          type: integer
          description: The WIFI revert timeout. Should be greater than or equal to 1
        locale:
          type: string
          description: >-
            Language and country code in xx[_Zzzz]_yy where xx is language code,
            Zzzz is script (optional) and yy is country code.
        ethernet_auth_mode:
          type: string
          description: Chosen mode of authentication
          enum:
            - NONE
            - EAP_TLS
        ethernet_ca_cert_alias:
          type: string
          description: CA certificate alias. It is mandatory with Auth Mode EAP_TLS
        ethernet_client_cert_alias:
          type: string
          description: Client certificate alias. It is mandatory with Auth Mode EAP_TLS
        ethernet_eap_identity:
          type: string
          description: EAP identity
        interface:
          type: string
          description: The network interface of the device - wlan/eth
        dhcp_enabled:
          type: string
          description: The dhcp state on the device - true/false
        static_ip:
          type: string
          description: The static ip to set on the device. Should be a valid ipv4
        primary_dns:
          type: string
          description: The primary dns to set on the device. Should be a valid ipv4
        subnet_mask:
          type: string
          description: >-
            The subnet mask set on the device. Should between 1-32 both
            inclusive
        secondary_dns:
          type: string
          description: The secondary dns to set on the device. Should be a valid ipv4
        gateway:
          type: string
          description: The gateway to set on the device. Should be a valid ipv4
        duration:
          type: string
          description: >-
            The beep duration specified in seconds. Value must be between 10 and
            300, both inclusive.
        video_quality:
          type: string
          default: HIGH
          description: >-
            The video quality of the respective Remote Viewer session. Options
            are "LOW", "MEDIUM" and "HIGH".
        enable_debug_mode:
          type: boolean
          default: false
          description: >-
            The flag to determine whether device must go into Debug Mode, in
            order to retreive bug report when the device is already in Kiosk
            Mode.
        app_id:
          type: string
          description: The unique identifier for VPP application in Apple’s ecosystem
        bundle_identifier:
          type: string
          description: The unique identifier for an application in Apple’s ecosystem
        managed_only:
          type: boolean
          description: If true, list outs only the profiles that was installed via MDM.
        profile_identifier:
          type: string
          description: The identifier of the profile to remove.
        profile:
          type: string
          description: Base 64 encoded profile plist to be installed on the device.
        is_converge:
          type: boolean
          description: This value indicates that the command belongs to a converge action.
        disable_device_rotation:
          type: boolean
          default: false
          description: >-
            Disable device rotation sensing while in kiosk mode (iOS only). Used
            by SET_KIOSK_APP.
        disable_screen_timeout:
          type: boolean
          default: true
          description: >-
            Disable screen auto-lock/timeout while in kiosk mode (iOS only).
            Used by SET_KIOSK_APP. Defaults to true when omitted.
        script:
          type: string
          description: A complete shell script to execute on Linux or Windows devices.
        interpreter:
          type: string
          description: >-
            Type of interpreter to use for executing the script. e.g. For Linux
            use bash, zsh, or sh. For Windows use powershell. This field is
            mandatory.
        execute_as:
          type: string
          description: >-
            User to execute the script as root or Esper (default user) -
            Optional, default is Esper if not specified. Supports Linux devices.
        arguments:
          type: array
          description: >-
            Optional named dynamic arguments supplied at command dispatch time
            for RUN_CUSTOM_ACTION on Linux devices. When present,
            command-and-control prepends `set -u` plus one `name='value'` bash
            assignment per entry (in order, single-quote escaped) to the script
            before it is dispatched. Existing callers that do not set this field
            are unaffected.
          maxItems: 20
          items:
            type: object
            required:
              - name
              - value
            properties:
              name:
                type: string
                description: >-
                  Variable name exposed to the script. Must match
                  `^[A-Za-z_][A-Za-z0-9_]*$`.
                minLength: 1
                maxLength: 64
                pattern: ^[A-Za-z_][A-Za-z0-9_]*$
              value:
                type: string
                description: >-
                  Literal value assigned to the variable. Bash-escaped by the
                  server.
                maxLength: 10240
        cert_file_type:
          type: string
          description: Certificate file type. Currently file type of "pkcs12" is supported
        cert_data_base64:
          type: string
          description: Base64 encoded content of the certificate file
        cert_alias_name:
          type: string
          description: >-
            Alias name of the certificate to be used during installation or
            uninstallation
        cert_storage_type:
          type: string
          description: >-
            Refers to the keystore type to be used for certificate installation
            or uninstallation. Currently storage type of "system" is supported
        cert_password:
          type: string
          description: >-
            Provides the password if the pkcs12 file is password protected -
            Optional
        is_factory_reset:
          type: boolean
          description: >-
            If true, performs factory reset and unenrolls the device. If false,
            only unenrolls the device without wiping data. Required for WIPE
            command on Windows devices.
        product_version:
          type: string
          description: >-
            The target OS version to schedule for update on an Apple device
            (e.g., "17.4", "18.0.1"). Required for SCHEDULE_OS_UPDATE command.
        install_action:
          type: string
          description: >-
            The install action for the OS update on an Apple device. Required
            for SCHEDULE_OS_UPDATE command. "Default" - Download or install the
            update depending on the current state. "DownloadOnly" - Download the
            update without installing it. "InstallASAP" - Install an already
            downloaded update immediately.
          enum:
            - Default
            - DownloadOnly
            - InstallASAP
        allow_standard_user_os_updates:
          type: boolean
          description: >-
            Allow standard (non-admin) users to accept and install OS updates.
            For ENFORCE_OS_UPDATE_SETTINGS command on Apple devices.
        automatic_actions:
          type: object
          description: >-
            Controls automatic download and install behavior for OS and security
            updates. For ENFORCE_OS_UPDATE_SETTINGS command on Apple devices.
          properties:
            download:
              type: string
              description: Automatic download behavior.
              enum:
                - allowed
                - always_on
                - always_off
            install_os_updates:
              type: string
              description: Automatic OS update install behavior.
              enum:
                - allowed
                - always_on
                - always_off
            install_security_update:
              type: string
              description: Automatic security update install behavior.
              enum:
                - allowed
                - always_on
                - always_off
        deferrals:
          type: object
          description: >
            Deferral periods for OS updates (1-90 days each). For
            ENFORCE_OS_UPDATE_SETTINGS command on Apple devices.

            Must specify EITHER `combined_period_in_days` alone OR all three of
            `major_period_in_days`, `minor_period_in_days`, and
            `system_period_in_days` together. Mixing combined with any
            individual field is rejected.
          oneOf:
            - required:
                - combined_period_in_days
              not:
                anyOf:
                  - required:
                      - major_period_in_days
                  - required:
                      - minor_period_in_days
                  - required:
                      - system_period_in_days
            - required:
                - major_period_in_days
                - minor_period_in_days
                - system_period_in_days
              not:
                required:
                  - combined_period_in_days
          properties:
            combined_period_in_days:
              type: integer
              description: Combined deferral period in days (1-90).
              minimum: 1
              maximum: 90
            major_period_in_days:
              type: integer
              description: Major OS update deferral period in days (1-90).
              minimum: 1
              maximum: 90
            minor_period_in_days:
              type: integer
              description: Minor OS update deferral period in days (1-90).
              minimum: 1
              maximum: 90
            system_period_in_days:
              type: integer
              description: System update deferral period in days (1-90).
              minimum: 1
              maximum: 90
        notifications:
          type: boolean
          description: >-
            Whether to show OS update notifications to the user. For
            ENFORCE_OS_UPDATE_SETTINGS command on Apple devices.
        rapid_security_response:
          type: object
          description: >-
            Rapid Security Response settings. For ENFORCE_OS_UPDATE_SETTINGS
            command on Apple devices.
          properties:
            enable:
              type: boolean
              description: Enable Rapid Security Responses (default true).
            enable_rollback:
              type: boolean
              description: Enable rollback of Rapid Security Responses (default true).
        recommended_cadence:
          type: string
          description: >-
            Which OS updates to recommend to users. For
            ENFORCE_OS_UPDATE_SETTINGS command on Apple devices.
          enum:
            - all
            - oldest
            - newest
        target_os_version:
          type: string
          description: >-
            The target OS version to enforce update to on an Apple device (e.g.,
            "17.4", "18.0.1"). Required for ENFORCE_SOFTWARE_UPDATE command.
        target_local_date_time:
          type: string
          description: >-
            The local date and time to enforce the software update on an Apple
            device. Required for ENFORCE_SOFTWARE_UPDATE command. Use the format
            yyyy-mm-ddThh:mm:ss, which is derived from RFC3339 but doesn’t
            include a time zone offset.
        auto_update_type:
          type: string
          description: >-
            The type of auto update behaviour to apply on a Windows device,
            mapped to the CSP Update/AllowAutoUpdate. Required for
            SET_OS_UPDATE_POLICY command. NOTIFY_DOWNLOAD notifies before
            downloading; AUTO_INSTALL_AND_NOTIFY_RESTART auto-installs and
            notifies to schedule a restart; DEFAULT auto-installs and restarts
            (system default); SCHEDULED_INSTALL_AND_RESTART auto-installs and
            restarts at a scheduled time; AUTO_INSTALL_AND_RESTART_FORCED
            auto-installs and restarts without end-user control; OFF disables
            automatic updates.
          enum:
            - NOTIFY_DOWNLOAD
            - AUTO_INSTALL_AND_NOTIFY_RESTART
            - DEFAULT
            - SCHEDULED_INSTALL_AND_RESTART
            - AUTO_INSTALL_AND_RESTART_FORCED
            - 'OFF'
    commands_CommandScheduleEnum:
      type: string
      description: >
        Following Schedule types are supported

        ```

        * IMMEDIATE: Schedule the command to execcute Immediately

        * WINDOW: Schedule the command to execute within the given window

        * RECURRING: Schedule the command to execute during the scheduled time
        until it succeeds or expires. After executing successfully, it will not
        fire again.

        ```
      enum:
        - IMMEDIATE
        - WINDOW
        - RECURRING
    commands_CommandScheduleArgsTimeTypeEnum:
      type: string
      description: >
        The Time-Type argument, in Schedule args, is to indicate which timezone
        the Command Framework should utilize when scheduling the command.

        Following Schedule Args for Time-Type are supported:

        ```

        * CONSOLE: Use the local timezone of the user creating the schedule.

        * DEVICE: Use the local timezone of the device, to which the command is
        issued, wherever it may be.

        ```
      enum:
        - console
        - device
    commands_CommandScheduleArgs:
      title: Command Schedule Arguments
      type: object
      properties:
        name:
          type: string
        start_datetime:
          type: string
          format: date-time
        end_datetime:
          type: string
          format: date-time
        time_type:
          $ref: '#/components/schemas/commands_CommandScheduleArgsTimeTypeEnum'
        window_start_time:
          type: string
        window_end_time:
          type: string
        days:
          type: array
          items:
            type: string
    commands_CommandRequest:
      type: object
      properties:
        id:
          type: string
          description: Unique command request identifier
          format: uuid
          readOnly: true
        command_type:
          type: string
          description: |
            Identifies the type of command

            ```
            * DEVICE: command request is meant for devices
            * GROUP: command request is meant for groups
            * DYNAMIC: command request is meant for dynamic set of devices
              i.e subset of devices from different groups or otherwise.
            ```
          enum:
            - DEVICE
            - GROUP
            - DYNAMIC
        devices:
          maxItems: 1000
          minItems: 0
          type: array
          description: list of devices to run commands
          items:
            type: string
            format: uuid
        groups:
          maxItems: 500
          minItems: 0
          type: array
          description: list of groups to run commands
          items:
            type: string
            format: uuid
        device_type:
          type: string
          description: >-
            Filtering by device_type is not supported currently and applies to
            'all' devices. If 'active' or 'inactive' is specified, it will be
            ignored.
          default: active
          enum:
            - active
            - inactive
            - all
        command:
          $ref: '#/components/schemas/commands_DeviceCommandEnum'
        command_args:
          $ref: '#/components/schemas/commands_CommandArgs'
        schedule:
          $ref: '#/components/schemas/commands_CommandScheduleEnum'
        schedule_args:
          $ref: '#/components/schemas/commands_CommandScheduleArgs'
        reason:
          type: string
          description: >-
            details briefing the reason for current command request processing
            stage
        created_by:
          type: string
          description: user id of the user
          readOnly: true
        created_at:
          type: string
          description: Timestamp of command request
          format: date-time
          readOnly: true
    commands_Error_401_Unauthorized:
      type: object
      properties:
        code:
          type: integer
          format: int32
          default: 401
        message:
          type: string
        content:
          type: object
      required:
        - code
        - message
    commands_Error_500_Internal_Server_Error:
      type: object
      properties:
        code:
          type: integer
          format: int32
          default: 500
        message:
          type: string
        content:
          type: object
      required:
        - code
        - message
    commands_CommandRequest_POST:
      type: object
      properties:
        command_type:
          type: string
          description: |
            Identifies the type of command

            ```
            * DEVICE: command request is meant for devices
            * GROUP: command request is meant for groups
            * DYNAMIC: command request is meant for dynamic set of devices
              i.e subset of devices from different groups or otherwise.
            ```
          enum:
            - DEVICE
            - GROUP
            - DYNAMIC
        alias:
          type: string
          description: Another name for the command, provided by the user or Console.
        devices:
          maxItems: 1000
          minItems: 0
          type: array
          description: >-
            List of devices to run commands. Required if command_type is
            'DEVICE' or 'DYNAMIC'
          items:
            type: string
            format: uuid
        groups:
          maxItems: 500
          minItems: 0
          type: array
          description: >-
            List of groups to run commands. Required if command_type is 'GROUP'
            or 'DYNAMIC'
          items:
            type: string
            format: uuid
        device_type:
          type: string
          description: >-
            Filtering by device_type is currently not supported. Please specify
            'all'.
          enum:
            - all
        command:
          $ref: '#/components/schemas/commands_DeviceCommandEnum'
        command_args:
          $ref: '#/components/schemas/commands_CommandArgs'
        schedule:
          $ref: '#/components/schemas/commands_CommandScheduleEnum'
        schedule_args:
          $ref: '#/components/schemas/commands_CommandScheduleArgs'
    commands_Error_400_Bad_Data:
      type: object
      properties:
        code:
          type: integer
          format: int32
          default: 400
        message:
          type: string
        content:
          type: object
      required:
        - code
        - message
    commands_Error_404_Not_Found:
      type: object
      properties:
        code:
          type: integer
          format: int32
          default: 404
        message:
          type: string
        content:
          type: object
      required:
        - code
        - message
    commands_CommandRequestStats:
      type: object
      properties:
        id:
          type: string
          readOnly: true
        status:
          type: array
          description: List of each command status associated to its count.
          items:
            type: object
            properties:
              state:
                type: string
                description: State of the command
                enum:
                  - Command Queued
                  - Command Initiated
                  - Command Acknowledged
                  - Command In Progress
                  - Command TimeOut
                  - Command Success
                  - Command Failure
                  - Command Scheduled
                  - Command Cancelled
              total:
                type: number
                description: >-
                  Count of the devices that are in the corresponding command
                  state
    commands_CommandStatus:
      type: object
      properties:
        id:
          type: string
          description: Unique command identifier
          format: uuid
          readOnly: true
        request:
          title: Request Id
          type: string
          description: Request Id associated with this command
          format: uuid
          readOnly: true
        device:
          title: Device
          type: string
          description: Device associated with this command
          format: uuid
          readOnly: true
        state:
          type: string
          description: Current state of the command
          enum:
            - Command Queued
            - Command Initiated
            - Command Acknowledged
            - Command In Progress
            - Command TimeOut
            - Command Success
            - Command Failure
            - Command Scheduled
            - Command Cancelled
        reason:
          type: string
          description: details briefing the reason for current command state
        created_at:
          type: string
          description: Timestamp of command creation
          format: date-time
          readOnly: true
        updated_at:
          type: string
          description: Last updated timestamp of command
          format: date-time
          readOnly: true
        command_meta:
          type: object
          nullable: true
          description: >
            Optional metadata associated with the command execution result.
            Present only for commands that return structured data from the
            device.
          properties:
            result:
              description: >
                Command-specific result data. Structure varies by command type.
                For OS_UPDATE_STATUS, result is an object with fields:
                product_key, is_downloaded, download_percent_complete, status,
                product_version. For SCAN_OS_UPDATES, result is an array of
                objects with fields: product_key, product_version, build,
                human_readable_name, is_critical, download_size.
              nullable: true
    commands_CommandStatus_PUT:
      type: object
      properties:
        state:
          type: string
          description: Command state to update
          enum:
            - Command Acknowledged
            - Command In Progress
            - Command TimeOut
            - Command Success
            - Command Failure
            - Command Scheduled
            - Command Cancelled
        reason:
          type: string
          description: State change reason to update
    commands_CommandInbox:
      type: object
      properties:
        id:
          type: string
          description: Unique command identifier
          format: uuid
          readOnly: true
        command:
          type: string
          description: The command to be executed
        command_args:
          type: object
          description: Arguments for the command
          properties:
            script:
              type: string
              description: The script to be executed
        device_meta:
          type: object
          description: Metadata about the device
          properties:
            platform:
              type: string
              description: The platform of the device
        state:
          type: string
          description: Current state of the command
          enum:
            - Command Queued
        created_on:
          type: string
          description: Timestamp of command creation
          format: date-time
          readOnly: true
        updated_on:
          type: string
          description: Last updated timestamp of command
          format: date-time
          readOnly: true
    drift_BlueprintsInfo:
      type: object
      properties:
        blueprint_id:
          type: string
          description: Unique blueprint ID
          format: uuid
        blueprint_version_id:
          type: string
          description: Version ID of blueprint
          format: uuid
    drift_ScheduleEnum:
      type: string
      description: |
        Following Schedule types are supported
        ``` * IMMEDIATE: Schedule the command to execcute Immediately
        * WINDOW: Schedule the command to execute within the given window ```
      enum:
        - IMMEDIATE
        - WINDOW
    drift_Converge:
      type: object
      properties:
        id:
          type: string
          description: Unique converge identifier
          format: uuid
          readOnly: true
        device_id:
          type: string
          description: ID of the device
          format: uuid
        converge_with_provision_option:
          type: boolean
        blueprint_info:
          type: object
          $ref: '#/components/schemas/drift_BlueprintsInfo'
        schedule_type:
          $ref: '#/components/schemas/drift_ScheduleEnum'
        schedule_args:
          type: object
        status:
          type: string
          description: Current aggregrated status of the converge action
          enum:
            - QUEUED
            - PROCESSING
            - IN_PROGRESS
            - SUCCESS
            - FAILURE
        reason:
          type: string
          description: details briefing the reason for current converge status
        created_by:
          type: string
          description: user id of the user
          readOnly: true
        created_at:
          type: string
          description: Creation timestamp of converge
          format: date-time
          readOnly: true
        updated_at:
          type: string
          description: Updation timestamp of converge
          format: date-time
          readOnly: true
    drift_Error_401_Unauthorized:
      type: object
      properties:
        code:
          type: integer
          format: int32
          default: 401
        message:
          type: string
        content:
          type: object
      required:
        - code
        - message
    drift_Error_500_Internal_Server_Error:
      type: object
      properties:
        code:
          type: integer
          format: int32
          default: 500
        message:
          type: string
        content:
          type: object
      required:
        - code
        - message
    drift_Converge_POST:
      type: object
      properties:
        device_id:
          type: string
          description: ID of the device
          format: uuid
        converge_with_provision_option:
          type: boolean
        schedule_type:
          $ref: '#/components/schemas/drift_ScheduleEnum'
        schedule_args:
          type: object
      required:
        - device_id
        - converge_with_provision_option
    drift_Error_400_Bad_Data:
      type: object
      properties:
        code:
          type: integer
          format: int32
          default: 400
        message:
          type: string
        content:
          type: object
      required:
        - code
        - message
    drift_Error_404_Not_Found:
      type: object
      properties:
        code:
          type: integer
          format: int32
          default: 404
        message:
          type: string
        content:
          type: object
      required:
        - code
        - message
    drift_ConvergeCommand:
      type: object
      properties:
        command_request_id:
          type: string
          description: ID of the command request
          format: uuid
        command_state:
          type: string
          description: Current state of the command
          enum:
            - Command Queued
            - Command Initiated
            - Command Acknowledged
            - Command In Progress
            - Command TimeOut
            - Command Success
            - Command Failure
            - Command Scheduled
            - Command Cancelled
        reason:
          type: string
          description: Details briefing the reason for current command state.
        created_at:
          type: string
          description: Creation timestamp of converge command
          format: date-time
          readOnly: true
        updated_at:
          type: string
          description: Updation timestamp of converge command
          format: date-time
          readOnly: true
    device_onboarding_SeamlessRequest:
      type: object
      properties:
        id:
          type: string
          format: uuid
        assigned_blueprint_id:
          type: string
          format: uuid
        group_id:
          type: string
          format: uuid
          nullable: true
        unique_ids:
          type: string
        unique_id_type:
          type: integer
        tenant_id:
          type: string
    device_onboarding_Error_400_Bad_Data:
      type: object
      properties:
        code:
          type: integer
          format: int32
          default: 400
        message:
          type: string
        content:
          type: object
      required:
        - code
        - message
    device_onboarding_Error_401_Unauthorized:
      type: object
      properties:
        code:
          type: integer
          format: int32
          default: 401
        message:
          type: string
        content:
          type: object
      required:
        - code
        - message
    device_onboarding_Error_500_Internal_Server_Error:
      type: object
      properties:
        code:
          type: integer
          format: int32
          default: 500
        message:
          type: string
        content:
          type: object
      required:
        - code
        - message
    device_onboarding_SeamlessInfo:
      type: object
      properties:
        unique_ids:
          type: string
          example: >-
            3e41fd18-d53d-4673-a10a-23089cbb6b73,3e41fd18-d53d-4673-a10a-23089cbb6b73
        unique_id_type:
          type: integer
          example: 2
    device_onboarding_SeamlessRequestBody:
      type: object
      properties:
        assigned_blueprint_id:
          type: string
          format: uuid
          example: 3e41fd18-d53d-4673-a10a-23089cbb6b73
        group_id:
          type: string
          format: uuid
          example: 3e41fd18-d53d-4673-a10a-23089cbb6b73
        seamless_info:
          $ref: '#/components/schemas/device_onboarding_SeamlessInfo'
    device_onboarding_DEPSyncDeviceStatus:
      type: object
      properties:
        serial:
          type: string
        reason:
          type: string
    device_onboarding_DEPSyncRequestForGetResponse:
      type: object
      properties:
        id:
          type: string
          description: Unique DEP sync request identifier
          format: uuid
          readOnly: true
        status:
          type: string
          description: Status of the DEP sync request
          enum:
            - QUEUED
            - INPROGRESS
            - COMPLETE
            - FAILURE
            - SUCCESS
        failure_reason:
          type: string
          description: >-
            Reason for DEP Sync failure. If this field is included in the
            response, a list of devices with which failed to process DEP sync
            will also be returned in the API response.
        devices:
          type: object
          properties:
            failure:
              type: array
              items:
                $ref: '#/components/schemas/device_onboarding_DEPSyncDeviceStatus'
        created_by:
          type: string
          description: user id of the user
        created_at:
          type: string
          format: date-time
        updated_at:
          type: string
          format: date-time
    device_onboarding_DEPSyncRequest:
      type: object
      properties:
        id:
          type: string
          description: Unique DEP sync request identifier
          format: uuid
          readOnly: true
        status:
          type: string
          description: Status of the DEP sync request
          enum:
            - QUEUED
            - INPROGRESS
            - COMPLETE
            - FAILURE
            - SUCCESS
        created_by:
          type: string
          description: user id of the user
        created_at:
          type: string
          format: date-time
        updated_at:
          type: string
          format: date-time
    device_onboarding_Error_404_Not_Found:
      type: object
      properties:
        code:
          type: integer
          format: int32
          default: 404
        message:
          type: string
        content:
          type: object
      required:
        - code
        - message
    tenant_APNSCertInfo:
      type: object
      properties:
        id:
          type: string
          readOnly: true
        apple_id:
          type: string
        meta:
          type: object
          properties:
            topic:
              type: string
            cert_created_at:
              type: string
              format: date-time
            cert_expiry_on:
              type: string
              format: date-time
        state:
          type: string
          description: state of APNs certificate upload
          enum:
            - CSR_GENERATED
            - COMPLETED
        created_by:
          type: number
          format: int32
        updated_by:
          type: number
          format: int32
        created_at:
          type: string
          format: date-time
        updated_at:
          type: string
          format: date-time
    tenant_Error_401_Unauthorized:
      type: object
      properties:
        code:
          type: integer
          format: int32
          default: 401
        message:
          type: string
        content:
          type: object
      required:
        - code
        - message
    tenant_Error_500_Internal_Server_Error:
      type: object
      properties:
        code:
          type: integer
          format: int32
          default: 500
        message:
          type: string
        content:
          type: object
      required:
        - code
        - message
    tenant_Error_400_Bad_Data:
      type: object
      properties:
        code:
          type: integer
          format: int32
          default: 400
        message:
          type: string
        content:
          type: object
      required:
        - code
        - message
    tenant_Error_404_Not_Found:
      type: object
      properties:
        code:
          type: integer
          format: int32
          default: 404
        message:
          type: string
        content:
          type: object
      required:
        - code
        - message
    tenant_APNSCert_PUT:
      type: object
      properties:
        file:
          type: string
          format: binary
        apple_id:
          type: string
      required:
        - file
        - apple_id
    tenant_VPPToken:
      type: object
      properties:
        id:
          type: string
          format: uuid
        tenant_id:
          type: string
          maxLength: 64
        key:
          type: string
          maxLength: 256
        meta:
          type: object
        created_by:
          type: string
          maxLength: 64
        updated_by:
          type: string
          maxLength: 64
        created_at:
          type: string
          format: date-time
        updated_at:
          type: string
          format: date-time
      required:
        - tenant_id
        - created_by
        - updated_by
    tenant_DEP_Token_GET:
      type: object
      properties:
        id:
          type: string
          format: UUID
          description: id of DEP token
        token_name:
          type: string
          description: name of DEP Token
        meta:
          type: object
          description: meta information about the DEP token
          properties:
            token_expiry_on:
              type: string
        state:
          type: string
          description: state of DEP token upload
          enum:
            - CSR_GENERATED
            - COMPLETED
        created_by:
          type: string
          description: user id of the user
        updated_by:
          type: string
          description: user id of the user
        created_at:
          type: string
          description: Timestamp of DEP token creation
          readOnly: true
        updated_at:
          type: string
          description: Timestamp of DEP token creation
          readOnly: true
    tenant_DEP_Token_POST:
      type: object
    tenant_DEPProfile:
      type: object
      properties:
        id:
          type: string
          format: uuid
          readOnly: true
        profile_uuid:
          type: string
        show_setup_items:
          type: array
          items:
            type: string
          description: List of setup items to show during device enrollment
        auto_advance_setup:
          type: boolean
          description: >-
            Whether to automatically advance through setup screens, only
            applicable to TvOS devices
        created_by:
          type: string
        updated_by:
          type: string
        created_at:
          type: string
          format: date-time
        updated_at:
          type: string
          format: date-time
    tenant_DEPProfileCreateRequest:
      type: object
      properties:
        show_setup_items:
          type: array
          uniqueItems: true
          items:
            type: string
            enum:
              - AccessibilityAppearance
              - ActionButton
              - Android
              - Appearance
              - AppleID
              - AppStore
              - Biometric
              - CameraButton
              - DeviceToDeviceMigration
              - Diagnostics
              - DisplayTone
              - EnableLockdownMode
              - HomeButtonSensitivity
              - iMessageAndFaceTime
              - Intelligence
              - Keyboard
              - LiquidGlass
              - Location
              - MessagingActivationUsingPhoneNumber
              - Multitasking
              - OnBoarding
              - OSShowcase
              - Passcode
              - Payment
              - Privacy
              - Restore
              - RestoreCompleted
              - Safety
              - SafetyAndHandling
              - ScreenTime
              - ScreenSaver
              - SIMSetup
              - Siri
              - SoftwareUpdate
              - SpokenLanguage
              - TapToSetup
              - TermsOfAddress
              - TOS
              - TVHomeScreenSync
              - TVProviderSignIn
              - TVRoom
              - UpdateCompleted
              - WatchMigration
              - Welcome
              - Zoom
          description: >-
            List of setup items to show during device enrollment. If not
            provided or empty, all items will be skipped (default behavior).
        auto_advance_setup:
          type: boolean
          default: true
          description: >-
            Whether to automatically advance through setup screens. Defaults to
            true if not specified. Only applicable to TvOS devices.
    tenant_BeginGoogleEMMEnrollmentRequest:
      type: object
      properties:
        callback_url:
          type: string
      required:
        - callback_url
    tenant_BeginGoogleEMMEnrollmentResponse:
      type: object
      properties:
        signup_url:
          type: string
        completion_token:
          type: string
    tenant_Error_409_Conflict:
      type: object
      properties:
        code:
          type: integer
          format: int32
          default: 409
        message:
          type: string
        content:
          type: object
      required:
        - code
        - message
    tenant_GoogleEnterpriseDetails:
      type: object
      properties:
        id:
          type: integer
        google_enterprise_id:
          type: string
        name:
          type: string
        state:
          type: integer
        callback_url:
          type: string
        signup_url:
          type: string
        completion_token:
          type: string
        enterprise_token:
          type: string
        created_at:
          type: string
          format: date-time
        updated_at:
          type: string
          format: date-time
        tenant_id:
          type: string
    tenant_CreateWebTokenRequest:
      type: object
      properties:
        google_enterprise_id:
          type: string
          description: The ID of the Google enterprise. It is required and cannot be empty.
          example: test
          minLength: 1
        parent_url:
          type: string
          description: The parent URL. It must be a valid URL with the https scheme.
          format: uri
          example: https://valid.url
          pattern: ^https://
      required:
        - google_enterprise_id
        - parent_url
    tenant_CreateWebTokenResponse:
      type: object
      properties:
        token:
          type: string
          description: The generated token.
          example: test_1245
    tenant_GoogleServiceAccountDetails:
      type: object
      properties:
        tenant_id:
          type: string
        google_enterprise_id:
          type: string
        name:
          type: string
        key_id:
          type: string
        type:
          type: integer
        is_set:
          type: boolean
        is_active:
          type: boolean
        data:
          type: string
        public_data:
          type: string
        created_at:
          type: string
          format: date-time
        updated_at:
          type: string
          format: date-time
    foundation_Build_V1:
      type: object
      properties:
        build_id:
          type: string
        created_at:
          type: string
          format: date-time
        updated_at:
          type: string
          format: date-time
        deprecated_on:
          type: string
          format: date-time
        created_by:
          type: string
        updated_by:
          type: string
        ab_update:
          type: boolean
        android_major_version:
          type: integer
        android_minimum_sdk_level:
          type: integer
        android_minor_version:
          type: string
        android_sdk_level:
          type: integer
        build_arch:
          type: string
        build_flavor:
          type: string
        build_hash:
          type: string
        build_ota_hash:
          type: string
        build_job_url:
          type: string
        build_job_id:
          type: integer
        build_fingerprint_hash:
          type: string
        build_type:
          type: string
        build_url:
          type: string
          format: url
        build_update_meta_data:
          type: string
          format: json
        build_update_url:
          type: string
          format: url
        file_size_kb:
          type: integer
        foundation_build_number:
          type: integer
        foundation_major_number:
          type: integer
        foundation_minor_number:
          type: integer
        foundation_name:
          type: string
        model_display_name:
          type: string
        build_job_params:
          type: string
          format: json
        prebuilt_app_info:
          type: string
          format: json
        release_notes:
          type: string
          format: json
        release_rating:
          type: string
        source_build_id:
          type: string
        build_state:
          type: string
          enum:
            - released
            - to_be_deprecated
            - unavailable
        device_model_id:
          type: string
        approved:
          type: boolean
    foundation_Error_401_Unauthorized:
      type: object
      properties:
        code:
          type: integer
          format: int32
          default: 401
        message:
          type: string
        content:
          type: object
      required:
        - code
        - message
    foundation_Error_500_Internal_Server_Error:
      type: object
      properties:
        code:
          type: integer
          format: int32
          default: 500
        message:
          type: string
        content:
          type: object
      required:
        - code
        - message
    foundation_Error_404_Not_Found:
      type: object
      properties:
        code:
          type: integer
          format: int32
          default: 404
        message:
          type: string
        content:
          type: object
      required:
        - code
        - message
    foundation_Foundry_Build_PUT_Request_V1:
      type: object
      properties:
        approve:
          type: boolean
        user_remarks:
          type: string
    foundation_Error_400_Bad_Data:
      type: object
      properties:
        code:
          type: integer
          format: int32
          default: 400
        message:
          type: string
        content:
          type: object
      required:
        - code
        - message
    foundation_Device_Model_V1:
      type: object
      properties:
        model_display_name:
          type: string
          example: Motorola Edge 20 - T2E20
        manufacturer:
          type: string
          example: Motorola
        model:
          type: string
          example: Edge 20
        profile_name:
          type: string
          example: Tacobell
        profile_variant:
          type: string
          example: T2E20
        update_compatible_android_api_level_begin:
          type: integer
          example: 11
        device_model_id:
          type: string
          format: uuid
          example: eb566c45-f841-41e5-a0af-435e90a96cae
        auto_update:
          type: boolean
          example: false
        latest:
          type: boolean
          example: false
        locked_build_id:
          type: string
          nullable: true
        created_at:
          type: string
          format: date-time
          example: '2023-12-07T17:14:46.419449+05:30'
        updated_at:
          type: string
          format: date-time
          example: '2023-12-07T17:14:46.419449+05:30'
        created_by:
          type: string
          example: FoundryAdmin
        updated_by:
          type: string
          example: FoundryAdmin
    foundation_Device_Model_PUT_Request_V1:
      type: object
      properties:
        auto_update:
          type: boolean
          description: >-
            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:
          type: boolean
          description: >-
            Configures Foundry service to automatically lock to the latest
            approved build (whenever available) if set to true.
        locked_build_id:
          type: string
          description: >-
            Specifies the UUID of the build which needs to be locked for
            automatic updates.
    foundation_Error_403_Forbidden:
      type: object
      properties:
        code:
          type: integer
          format: int32
          default: 403
        message:
          type: string
        content:
          type: object
      required:
        - code
        - message
    foundation_Foundry_Event_V1:
      type: object
      properties:
        stack:
          type: string
        tenant:
          type: string
        enterprise_id:
          type: string
        actor:
          type: object
          properties:
            id:
              type: string
            name:
              type: string
        event_message:
          type: string
        event_type:
          type: string
        resource:
          type: object
          properties:
            id:
              type: string
            type:
              type: string
        meta:
          type: object
          properties:
            user_remarks:
              type: string
            change_type:
              type: string
            device_model:
              type: string
        created_timestamp:
          type: integer
    reports_GetReportTypesResponse:
      type: object
      properties:
        content:
          type: object
          properties:
            report_types:
              type: array
              items:
                type: object
                properties:
                  name:
                    type: string
                  display_name:
                    type: string
                  description:
                    type: string
                  last_generated_at:
                    type: string
                  available_from:
                    type: string
    reports_ReportsErrorResponse:
      type: object
      properties:
        status:
          type: integer
        error:
          type: string
        message:
          type: string
    reports_DeviceAppsFilter:
      type: object
      properties:
        date:
          type: string
          format: date
          example: '2024-08-28'
          nullable: true
          description: >-
            Date of report. If provided, this value will override start_time and
            end_time values. Example: "2024-08-28". Must be a date later than
            July 1st, 2024.
        package_name:
          type: array
          nullable: true
          items:
            type: string
          example:
            - com.android.chrome
        app_state:
          type: array
          nullable: true
          items:
            type: string
            enum:
              - SHOW
              - HIDE
              - DISABLE
              - LAUNCHABLE_BUT_HIDDEN
          example:
            - SHOW
        device_os:
          type: array
          nullable: true
          items:
            type: string
            enum:
              - Android
              - iOS
          example:
            - Android
        platform:
          type: array
          nullable: true
          items:
            type: string
            enum:
              - Android
              - Apple
              - Linux
              - Windows
          example:
            - Android
    reports_DeviceFilter:
      type: object
      properties:
        date:
          type: string
          format: date
          example: '2025-03-17'
          nullable: true
          description: >-
            Date of report. If provided, this value will override start_time and
            end_time values. Example: "2025-03-17". Must be a date later than
            May 17th, 2025.
        platform:
          type: array
          nullable: true
          items:
            type: string
            enum:
              - Android
              - Apple
              - Linux
              - Windows
          example:
            - Android
    reports_Report:
      type: object
      properties:
        report_type:
          type: string
          enum:
            - device_apps
            - device
          example: device_apps
        start_time:
          description: >-
            Start time of the report in UTC format. Example:
            "2024-08-28T00:00:00Z". Must be a date and time later than July 1st,
            2024.
          type: string
          format: date-time
          example: '2024-08-28T00:00:00Z'
        end_time:
          description: >-
            End time of the report in UTC format. Example:
            "2024-08-29T00:00:00Z". Must be a date and time later than July 1st,
            2024 and equal to the start_time.
          type: string
          format: date-time
          example: '2024-08-28T00:00:00Z'
        is_download:
          type: boolean
        filters:
          type: object
          nullable: true
          oneOf:
            - $ref: '#/components/schemas/reports_DeviceAppsFilter'
            - $ref: '#/components/schemas/reports_DeviceFilter'
      required:
        - report_type
    reports_CreateReportResponse:
      type: object
      properties:
        content:
          type: object
          properties:
            id:
              type: string
            status:
              type: string
              enum:
                - PENDING
                - RUNNING
                - SUCCEEDED
                - FAILED
                - CANCELED
                - CLOSED
    reports_GetReportResponsePreview:
      type: object
      properties:
        content:
          type: object
          properties:
            id:
              type: string
            status:
              type: string
              enum:
                - PENDING
                - RUNNING
                - SUCCEEDED
                - FAILED
                - CANCELED
                - CLOSED
            schema:
              type: object
              properties:
                column_count:
                  type: integer
                columns:
                  type: array
                  items:
                    type: object
                    properties:
                      name:
                        type: string
                      position:
                        type: integer
                      type_name:
                        type: string
                      type_text:
                        type: string
            data_array:
              type: array
              items:
                type: array
                items:
                  type: string
    reports_GetReportResponseDownload:
      type: object
      properties:
        content:
          type: object
          properties:
            id:
              type: string
            status:
              type: string
              enum:
                - PENDING
                - RUNNING
                - SUCCEEDED
                - FAILED
                - CANCELED
                - CLOSED
            schema:
              type: object
              properties:
                column_count:
                  type: integer
                columns:
                  type: array
                  items:
                    type: object
                    properties:
                      name:
                        type: string
                      position:
                        type: integer
                      type_name:
                        type: string
                      type_text:
                        type: string
            external_link:
              type: string
    geofence_PolygonGeometry:
      type: object
      description: Polygon geometry with coordinates as array of coordinate objects
      required:
        - type
        - coordinates
      properties:
        type:
          type: string
          enum:
            - polygon
          example: polygon
        coordinates:
          type: array
          description: Array of coordinate objects, each containing latitude and longitude
          items:
            type: object
            description: Coordinate object with latitude and longitude
            required:
              - latitude
              - longitude
            properties:
              latitude:
                type: number
                minimum: -90
                maximum: 90
                description: Latitude coordinate
                example: 41.8902
              longitude:
                type: number
                minimum: -180
                maximum: 180
                description: Longitude coordinate
                example: 12.4924
          minItems: 3
          maxItems: 100
          example:
            - latitude: 41.8902
              longitude: 12.4924
            - latitude: 41.8903
              longitude: 12.4925
            - latitude: 41.8904
              longitude: 12.4926
    geofence_CircleGeometry:
      type: object
      description: Circle geometry with center coordinates and radius
      required:
        - type
        - coordinates
        - radius
      properties:
        type:
          type: string
          enum:
            - circle
          example: circle
        coordinates:
          type: array
          description: >-
            Array with single coordinate object containing latitude and
            longitude
          minItems: 1
          maxItems: 1
          items:
            type: object
            description: Coordinate object with latitude and longitude
            required:
              - latitude
              - longitude
            properties:
              latitude:
                type: number
                minimum: -90
                maximum: 90
                description: Latitude coordinate
                example: 41.8902
              longitude:
                type: number
                minimum: -180
                maximum: 180
                description: Longitude coordinate
                example: 12.4924
          example:
            - latitude: 41.8902
              longitude: 12.4924
        radius:
          type: number
          minimum: 0.1
          description: Radius in meters
          example: 100
    geofence_GeofenceResponse:
      type: object
      properties:
        id:
          type: string
          format: uuid
          example: 11111111-1111-1111-1111-111111111111
          description: Unique identifier for the geofence
        name:
          type: string
          example: Warehouse Perimeter
          description: Name of the geofence
        description:
          type: string
          example: A polygon-shaped geofence
          description: Description of the geofence
        actions:
          type: array
          items:
            type: string
            enum:
              - lockdown
              - beep
          minItems: 0
          maxItems: 2
          example:
            - lockdown
            - beep
          description: Actions configured for this geofence. Empty array means no actions.
        geometry:
          oneOf:
            - $ref: '#/components/schemas/geofence_PolygonGeometry'
            - $ref: '#/components/schemas/geofence_CircleGeometry'
          discriminator:
            propertyName: type
        created_at:
          type: string
          format: date-time
          example: '2024-06-24T14:00:00Z'
          description: When the geofence was created
        updated_at:
          type: string
          format: date-time
          example: '2024-06-24T15:00:00Z'
          description: When the geofence was last updated
      required:
        - id
        - name
        - actions
        - geometry
        - created_at
        - updated_at
    geofence_DeviceSummaryResponse:
      type: object
      description: Summary statistics of devices in relation to a geofence
      properties:
        total_devices:
          type: integer
          minimum: 0
          description: Total number of devices associated with the geofence
          example: 100
        inside_count:
          type: integer
          minimum: 0
          description: Number of devices currently inside the geofence
          example: 60
        outside_count:
          type: integer
          minimum: 0
          description: Number of devices currently outside the geofence
          example: 35
        unknown_count:
          type: integer
          minimum: 0
          description: Number of devices with unknown state (neither inside nor outside)
          example: 5
      required:
        - total_devices
        - inside_count
        - outside_count
        - unknown_count
    geofence_BlueprintUsageItem:
      type: object
      description: Statistics about blueprint usage within a geofence
      properties:
        blueprint_id:
          type: string
          format: uuid
          description: UUID of the blueprint
          example: 550e8400-e29b-41d4-a716-446655440000
        blueprint_version_number:
          type: integer
          description: Blueprint version number
          example: 1
        device_count:
          type: integer
          minimum: 0
          description: Number of devices using this blueprint revision
          example: 25
      required:
        - blueprint_id
        - blueprint_version_number
        - device_count
    geofence_GeofenceListResponse:
      type: object
      description: >-
        Geofence response for list operations. Extends GeofenceResponse with
        optional summary fields when includeSummary=true.
      allOf:
        - $ref: '#/components/schemas/geofence_GeofenceResponse'
        - type: object
          properties:
            device_summary:
              $ref: '#/components/schemas/geofence_DeviceSummaryResponse'
              description: >-
                Device statistics for this geofence. Only included when
                include_summary=true.
            blueprints:
              type: array
              items:
                $ref: '#/components/schemas/geofence_BlueprintUsageItem'
              description: >-
                Blueprint usage statistics for this geofence (top 5). Only
                included when include_summary=true.
    geofence_ErrorResponse:
      type: object
      properties:
        message:
          type: string
          description: Error message
          example: Invalid input
        content:
          type: object
          description: Additional error details
          example: {}
      required:
        - message
        - content
    geofence_GeofenceRequest:
      type: object
      description: >-
        Request payload for creating a geofence. Specify either a Polygon or
        Circular geofence.
      required:
        - name
        - geometry
      properties:
        name:
          type: string
          minLength: 1
          maxLength: 255
          example: Geofence 1
          description: Name of the geofence
        description:
          type: string
          maxLength: 1000
          example: A geofence that is either polygonal or circular.
          description: Optional description of the geofence
        actions:
          type: array
          items:
            type: string
            enum:
              - lockdown
              - beep
          minItems: 0
          maxItems: 2
          example:
            - lockdown
            - beep
          description: >-
            Actions to trigger when geofence conditions are met. Empty array
            means no actions.
        geometry:
          oneOf:
            - $ref: '#/components/schemas/geofence_PolygonGeometry'
            - $ref: '#/components/schemas/geofence_CircleGeometry'
          discriminator:
            propertyName: type
    geofence_DeviceListingItem:
      type: object
      description: Information about a device and its state within a geofence
      properties:
        device_id:
          type: string
          format: uuid
          description: UUID of the device
          example: 660e8400-e29b-41d4-a716-446655440000
        blueprint_id:
          type: string
          format: uuid
          description: UUID of the blueprint used by this device
          example: 550e8400-e29b-41d4-a716-446655440000
        blueprint_version_number:
          type: integer
          description: Blueprint version number used by this device
          example: 1
        inside:
          type: boolean
          nullable: true
          description: >-
            Whether the device is currently inside the geofence. Null means
            unknown state.
          example: true
        state_changed_at:
          type: string
          format: date-time
          nullable: true
          description: >-
            When the device's geofence state was last changed. Null means
            unknown time.
          example: '2025-07-24T09:00:00Z'
        latitude:
          type: number
          format: double
          nullable: true
          description: Last known latitude for the device, rounded to 4 decimal places.
          example: 37.7749
        longitude:
          type: number
          format: double
          nullable: true
          description: Last known longitude for the device, rounded to 4 decimal places.
          example: -122.4194
        location_updated_at:
          type: string
          format: date-time
          nullable: true
          description: Timestamp when the device location was last updated.
          example: '2025-07-24T09:05:00Z'
      required:
        - device_id
        - blueprint_id
        - blueprint_version_number
  parameters:
    esper_cloud_api_EnterpriseID:
      name: enterprise_id
      description: Enterprise ID
      in: path
      required: true
      schema:
        type: string
        format: uuid
    esper_cloud_api_GroupThumbnailID:
      name: thumbnail_id
      description: Group thumbnail ID
      in: path
      required: true
      schema:
        type: string
        format: uuid
    esper_cloud_api_InviteID:
      name: invite_id
      description: Invite ID
      in: path
      required: true
      schema:
        type: string
        format: uuid
    esper_cloud_api_UserID:
      name: user_id
      description: User ID
      in: path
      required: true
      schema:
        type: integer
    esper_cloud_api_AuthNUserID:
      name: user_id
      description: AuthN User Id. The authn_user_id from the Get Users response.
      in: path
      required: true
      schema:
        type: string
        format: uuid
    esper_cloud_api_GroupID:
      name: group_id
      description: Device Group ID
      in: path
      required: true
      schema:
        type: string
        format: uuid
    esper_cloud_api_BlueprintID:
      name: blueprint_id
      description: Blueprint ID
      in: path
      required: true
      schema:
        type: string
        format: uuid
    esper_cloud_api_BlueprintRevisionID:
      name: revision_id
      description: Blueprint Revision ID
      in: path
      required: true
      schema:
        type: string
        format: uuid
    esper_cloud_api_DirectoryRecordID:
      name: directory_record_id
      description: Directory record ID
      in: path
      required: true
      schema:
        type: string
        format: uuid
    esper_cloud_api_IsDefault:
      name: is_default
      description: Is Default
      in: query
      required: false
      schema:
        type: boolean
    esper_cloud_api_ConnectionID:
      name: connection_id
      description: Connection ID
      in: path
      required: true
      schema:
        type: string
        format: uuid
    esper_cloud_api_RoleID:
      name: role_id
      description: Role ID
      in: path
      required: true
      schema:
        type: string
        format: uuid
    esper_cloud_api_PersonalAccessTokenID:
      name: personal_access_token_id
      description: Personal Access Token Id
      in: path
      required: true
      schema:
        type: string
        format: uuid
    esper_cloud_api_LegacyUserID:
      name: legacy_user_id
      description: Legacy User ID
      in: query
      required: false
      schema:
        type: integer
    reports_ReportID:
      name: report_id
      description: Report ID
      in: path
      required: true
      schema:
        type: string
        format: uuid
    geofence_XEsperTenantIdHeader:
      name: X-Esper-Tenant-Id
      in: header
      required: true
      x-internal: true
      schema:
        type: string
        format: uuid
      description: Esper tenant ID associated with the request
    geofence_XCallerIdHeader:
      name: X-Caller-Id
      in: header
      required: true
      x-internal: true
      schema:
        type: string
        minLength: 1
        maxLength: 255
      description: Unique identifier for the caller
    geofence_OffsetParam:
      name: offset
      in: query
      required: false
      schema:
        type: integer
        minimum: 0
        default: 0
      description: Number of items to skip before starting to collect the result set
    geofence_LimitParam:
      name: limit
      in: query
      required: false
      schema:
        type: integer
        minimum: 1
        maximum: 100
        default: 10
      description: Maximum number of items to return
    geofence_IdsParam:
      name: ids
      in: query
      required: false
      schema:
        type: string
        pattern: >-
          ^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}(,[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})*$
      description: >-
        Comma-separated list of geofence UUIDs to filter by. When provided, only
        geofences with matching IDs will be returned.
      example: >-
        11111111-1111-1111-1111-111111111111,22222222-2222-2222-2222-222222222222
    geofence_IncludeSummaryParam:
      name: include_summary
      in: query
      required: false
      schema:
        type: boolean
        default: false
      description: >-
        Whether to include device summary and blueprint usage statistics with
        each geofence. When true, adds device_summary and blueprints fields to
        each result.
      example: true
    geofence_IncludeCountParam:
      name: include_count
      in: query
      required: false
      schema:
        type: boolean
        default: false
      description: >-
        Whether to include the total count of geofences in the response. When
        true, adds a count field to the response.
      example: true
    geofence_SearchParam:
      name: search
      in: query
      required: false
      schema:
        type: string
      description: >-
        Search string to filter geofences by name (case-insensitive partial
        match).
      example: warehouse
    geofence_NameParam:
      name: name
      in: query
      required: false
      schema:
        type: string
      description: Exact geofence name to filter by (case-sensitive exact match).
      example: Test Geofence 1
    geofence_GeofenceIdParam:
      name: geofence_id
      in: path
      required: true
      schema:
        type: string
        format: uuid
      description: UUID of the geofence
      example: f5316a75-f186-4769-970e-28d6a1a0e110
    geofence_InsideParam:
      name: inside
      in: query
      required: false
      schema:
        type: boolean
      description: >-
        Filter devices by whether they are inside (true) or outside (false) the
        geofence
      example: true
    geofence_BlueprintIdParam:
      name: blueprint_id
      in: query
      required: false
      schema:
        type: string
        format: uuid
      description: Filter devices by blueprint ID
      example: 550e8400-e29b-41d4-a716-446655440000
    geofence_BlueprintVersionNumberParam:
      name: blueprint_version_number
      in: query
      required: false
      schema:
        type: integer
      description: Filter devices by blueprint version number
      example: 1
  examples:
    device_example_devices:
      summary: An example where the query specifies a list of devices.
      value:
        operation_type: CONVERGE
        schedule_type: IMMEDIATE
        schedule_args:
          start_datetime: '2024-08-08T19:13:36.969Z'
          end_datetime: '2024-08-08T19:13:36.969Z'
          time_type: console
          window_start_time: '2024-08-08T19:00:00Z'
          window_end_time: '2024-08-08T20:00:00Z'
          days:
            - 0
        operation_device_query:
          device_ids: >-
            460a4c28-b974-4c20-99b5-29aa6f10054f,560a4c28-b974-4c20-99b5-29aa6f10054e
        arguments:
          converge_with_provision: true
          sample_key: value
      description: >-
        An example where the query specifies a list of devices with specific
        values.
    device_example_filters:
      summary: An example with devices filters.
      value:
        operation_type: CONVERGE
        schedule_type: IMMEDIATE
        schedule_args:
          start_datetime: '2024-08-08T19:13:36.969Z'
          end_datetime: '2024-08-08T19:13:36.969Z'
          time_type: console
          window_start_time: '2024-08-08T19:00:00Z'
          window_end_time: '2024-08-08T20:00:00Z'
          days:
            - 0
        operation_device_query:
          device_request:
            group_multi: >-
              460a4c28-b974-4c20-99b5-29aa6f10054f,760a4c28-b974-4c20-99b5-29aa6f10054e
            state: '1'
            filter1: val1
            filter2: val2
        arguments:
          converge_with_provision: true
          sample_key: value
      description: >
        An example with dynamic filters, where 'filter1' and 'filter2' are used
        to apply specific criteria (Same as existing device api filters).

        - active_connection                     (string)

        - android_version                       (string)

        - assigned_blueprint_id                 (string)

        - battery_level_gte                     (string)

        - battery_level_lte                     (string)

        - current_blueprint_id                  (string)

        - current_blueprint_version_id          (string)

        - current_blueprint_version_id_net      (string)

        - device_source                         (string)

        - group_multi                           (string)

        - group_multi_immediate                 (string)

        - ios_version                           (string)

        - ipados_version                        (string)

        - tvos_version                          (string)

        - windows_version                       (string)

        - is_gms                                (string)

        - last_seen_gt                          (time.Time)

        - last_seen_lt                          (time.Time)

        - managed_by                            (string)

        - ordering                              (string)

        - os                                    (string)

        - platform                              (string)

        - policy_multi                          (string)

        - provisioned_on_gt                     (time.Time)

        - provisioned_on_lt                     (time.Time)

        - search                                (string)

        - security_status                       (string)

        - serial                                (string)

        - state                                 (string)

        - tags                                  (string)

        - template_multi                        (string)

        - udid                                  (string)

        - is_seamless                           (string)

        - is_locked_down                        (string)

        - ungrouped_only                        (boolean)
x-tagGroups:
  - name: ESPER CLOUD API
    tags:
      - esper_cloud_api_Company Settings
      - esper_cloud_api_Application
      - esper_cloud_api_Application V1
      - esper_cloud_api_AndroidDevice
      - esper_cloud_api_Device Group
      - esper_cloud_api_Token (Deprecated)
      - esper_cloud_api_Commands V2
      - esper_cloud_api_Enterprise Policy
      - esper_cloud_api_Geofence
      - esper_cloud_api_Content
      - esper_cloud_api_User (Deprecated)
      - esper_cloud_api_User
      - esper_cloud_api_Blueprint (Deprecated)
      - esper_cloud_api_Directory Record
      - esper_cloud_api_Tile Icon
      - esper_cloud_api_Alerts
      - esper_cloud_api_Alarms
      - esper_cloud_api_Wallpapers
      - esper_cloud_api_Device Telemetry
      - esper_cloud_api_Daily and Custom Reports
      - esper_cloud_api_SSO Connections
      - esper_cloud_api_Roles
      - esper_cloud_api_Personal Access Token
  - name: BLUEPRINTS
    tags:
      - blueprints_Blueprints API
      - blueprints_Custom Actions API
      - blueprints_Background Scripts API
  - name: PIPELINES
    tags:
      - pipelines_System Status Code
      - pipelines_System
      - pipelines_Pipelines
      - pipelines_Stages
      - pipelines_Target Lists
      - pipelines_Targets
      - pipelines_Device Groups
      - pipelines_Operation Lists
      - pipelines_Operations
      - pipelines_Pipeline Runs
      - pipelines_Stage Runs
      - pipelines_Target Runs
  - name: DEVICE
    tags:
      - device_Device
      - device_Device Heartbeat
      - device_Device Apps
      - device_Device Enrollment in EMM
      - device_Operations
      - device_DeviceOperations
      - device_MultiOS Remote Viewer
  - name: APPS MANAGEMENT
    tags:
      - apps_management_VPP License Management
      - apps_management_VPP App Management
      - apps_management_Tenant Apps
      - apps_management_Apple App Store
      - apps_management_App List
      - apps_management_Webclips
      - apps_management_Provisioning Profiles
      - apps_management_Preferred Regions
      - apps_management_OEM Config Schema
      - apps_management_Esper Apps
      - apps_management_Tenant Esper Apps
  - name: COMMANDS
    tags:
      - commands_Command Request
      - commands_Command Status
  - name: DRIFT
    tags:
      - drift_Converge
      - drift_Converge Command
  - name: DEVICE ONBOARDING
    tags:
      - device_onboarding_DEP Sync Request
      - device_onboarding_ABM Provisioning
  - name: TENANT
    tags:
      - tenant_APNs certificate
      - tenant_DEP Profile
      - tenant_DEP Tokens
      - tenant_VPP Token Management
      - tenant_Google Enterprise
      - tenant_MDM Service Config
  - name: FOUNDATION
    tags:
      - foundation_FoundryBuilds
      - foundation_FoundryDeviceModels
      - foundation_FoundryEvents
  - name: REPORTS
    tags:
      - reports_Reports API
  - name: GEOFENCE
    tags:
      - geofence_Geofences
      - geofence_Device State
