# ESPER API REFERENCE

# 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 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]**

**✏️ Updated**

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

  - ⚠️ added the new 'tvOS' enum value to the 'content/results/items/oneOf[#/components/schemas/AppleDevice]/os' response property for the response status '200'
  
  -  added the new optional 'query' request parameter 'tvos_version'
  
  -  added the new enum value 'tvOS' to the 'query' request parameter 'os'


- **DELETE /device/v0/devices/{id}/** - ⚠️ added the new 'tvOS' enum value to the 'content/oneOf[#/components/schemas/AppleDevice]/os' response property for the response status '200'

- **GET /device/v0/devices/{id}/** - ⚠️ added the new 'tvOS' enum value to the 'content/oneOf[#/components/schemas/AppleDevice]/os' response property for the response status '200'

- **GET /v2/devices/**

  - ⚠️ added the new 'tvOS' enum value to the 'content/results/items/oneOf[#/components/schemas/AppleDeviceV2]/os' response property for the response status '200'
  
  -  added the new optional 'query' request parameter 'tvos_version'
  
  -  added the new enum value 'tvOS' to the 'query' request parameter 'os'


- **GET /v2/devices/{id}** - ⚠️ added the new 'tvOS' enum value to the 'content/oneOf[#/components/schemas/AppleDeviceV2]/os' response property for the response status '200'
---
**DevRel 184 [2026-03-03]**

➕ Added

- **PUT /v2/itunesapps/{appleAppId}/preferred-region** -  endpoint added

- **GET /v2/preferred-regions** -  endpoint added

- **POST /v2/preferred-regions** -  endpoint added

**✏️ Updated**

- **GET /v2/devices/**

  - ⚠️ deleted the 'header' request parameter 'X-Caller-Id'

  - ⚠️ deleted the 'header' request parameter 'X-SCAPI-Private-URL'

  - ⚠️ deleted the 'header' request parameter 'X-Tenant-Id'


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

  - ⚠️ deleted the 'header' request parameter 'X-Caller-Id'

  - ⚠️ deleted the 'header' request parameter 'X-SCAPI-Private-URL'

  - ⚠️ deleted the 'header' request parameter 'X-Tenant-Id'


- **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


Version: 1.0.0
License: Apache 2.0

## Servers

```
https://{foo}-api.esper.cloud/api
```

Variables:
- `foo`: Custom end point
Default: "develop"

## Security

### esper_cloud_api_apiKey

#### 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).


Type: http
Scheme: bearer

### pipelines_SCAPIAuthToken

Type: http
Scheme: bearer

### device_apiKey

#### 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).


Type: http
Scheme: bearer

### apps_management_apiKey

#### 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).


Type: http
Scheme: bearer

### commands_apiKey

#### 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).


Type: http
Scheme: bearer

### drift_apiKey

#### 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).


Type: http
Scheme: bearer

### device_onboarding_apiKey

#### 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).


Type: http
Scheme: bearer

### tenant_apiKey

#### 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).


Type: http
Scheme: bearer

### foundation_AuthToken

Type: apiKey
In: header
Name: Authorization

### reports_bearerAuth

Type: http
Scheme: bearer

### geofence_bearerAuth

Type: http
Scheme: bearer
Bearer Format: JWT

## Download OpenAPI description

[ESPER API REFERENCE](https://api.esper.io/_bundle/openapi.yaml)

## Company Settings

The Company Settings API manage the account information set up for your organization. Formerly known as Enterprise Information. 

### Get your company settings

 - [GET /v1/enterprise/{enterprise_id}/](https://api.esper.io/openapi/esper_cloud_api_company-settings/getenterprise.md): Returns company settings. Formerly known as get your enterprise information.

### Partially update company settings

 - [PATCH /v1/enterprise/{enterprise_id}/](https://api.esper.io/openapi/esper_cloud_api_company-settings/partialupdateenterprise.md): Returns updated company settings.
Formerly known as partial update enterprise information.

## Application

APIs for application management

### List apps in enterprise

 - [GET /enterprise/{enterprise_id}/application/](https://api.esper.io/openapi/esper_cloud_api_application/getallapplications.md): 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 workflows
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

### Get application information

 - [GET /enterprise/{enterprise_id}/application/{application_id}/](https://api.esper.io/openapi/esper_cloud_api_application/getapplication.md): 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

### Delete an application

 - [DELETE /enterprise/{enterprise_id}/application/{application_id}/](https://api.esper.io/openapi/esper_cloud_api_application/deleteapplication.md): 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.

### List App versions

 - [GET /enterprise/{enterprise_id}/application/{application_id}/version/](https://api.esper.io/openapi/esper_cloud_api_application/getappversions.md): 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

### Get app version information

 - [GET /enterprise/{enterprise_id}/application/{application_id}/version/{version_id}/](https://api.esper.io/openapi/esper_cloud_api_application/getappversion.md): 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 workflows.

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

### Delete app version

 - [DELETE /enterprise/{enterprise_id}/application/{application_id}/version/{version_id}/](https://api.esper.io/openapi/esper_cloud_api_application/deleteappversion.md): 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 workflows 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.

### Patch an App version instance

 - [PATCH /enterprise/{enterprise_id}/application/{application_id}/version/{version_id}/](https://api.esper.io/openapi/esper_cloud_api_application/patchappversion.md): 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.

### List install devices

 - [GET /enterprise/{enterprise_id}/application/{application_id}/version/{version_id}/installdevices](https://api.esper.io/openapi/esper_cloud_api_application/getinstalldevices.md): Returns list of devices with the specified app version installed

### Upload an application to enterprise

 - [POST /enterprise/{enterprise_id}/application/upload/](https://api.esper.io/openapi/esper_cloud_api_application/upload.md): ⚠️ Android only. This endpoint accepts APK files and applies exclusively to Android-managed devices. See iOS and Windows application endpoints for workflows.

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 workflows

### List Google enterprises

 - [GET /v0/enterprise/{enterprise_id}/emm](https://api.esper.io/openapi/esper_cloud_api_application/getemminstances.md): Returns enterprise instances

### Get Google enterprise information

 - [GET /v0/enterprise/{enterprise_id}/emm/{emm_id}](https://api.esper.io/openapi/esper_cloud_api_application/getemminstance.md): Returns enterprise instance

### List webtokens

 - [GET /v0/enterprise/{enterprise_id}/emm/{emm_id}/webtoken/](https://api.esper.io/openapi/esper_cloud_api_application/getwebtokens.md): Returns list of webtokens

### Creates a webtoken instance

 - [POST /v0/enterprise/{enterprise_id}/emm/{emm_id}/webtoken/](https://api.esper.io/openapi/esper_cloud_api_application/createwebtoken.md): Returns webtoken instance

### Get webtoken instance

 - [GET /v0/enterprise/{enterprise_id}/emm/{emm_id}/webtoken/{webtoken_id}](https://api.esper.io/openapi/esper_cloud_api_application/getwebtokeninstance.md): Returns webtoken instance

### Updates webtoken instance

 - [PUT /v0/enterprise/{enterprise_id}/emm/{emm_id}/webtoken/{webtoken_id}](https://api.esper.io/openapi/esper_cloud_api_application/updatewebtokeninstance.md): Returns webtoken instance

### Patches webtoken instance

 - [PATCH /v0/enterprise/{enterprise_id}/emm/{emm_id}/webtoken/{webtoken_id}](https://api.esper.io/openapi/esper_cloud_api_application/patchwebtokeninstance.md): Returns webtoken instance

### Deletes a webtoken instance

 - [DELETE /v0/enterprise/{enterprise_id}/emm/{emm_id}/webtoken/{webtoken_id}](https://api.esper.io/openapi/esper_cloud_api_application/deletewebtokeninstance.md): Empty response

### List Google Play applications

 - [GET /v0/enterprise/{enterprise_id}/emm/{emm_id}/product/](https://api.esper.io/openapi/esper_cloud_api_application/getgoogleapps.md): Returns list of Google Play applications

### Post a Google play application

 - [POST /v0/enterprise/{enterprise_id}/emm/{emm_id}/product/](https://api.esper.io/openapi/esper_cloud_api_application/addgoogleapp.md): Returns instance of Google application

### Get application information

 - [GET /v0/enterprise/{enterprise_id}/emm/{emm_id}/product/{product_id}](https://api.esper.io/openapi/esper_cloud_api_application/getappinfo.md): Returns application instance

### Update application instance

 - [PUT /v0/enterprise/{enterprise_id}/emm/{emm_id}/product/{product_id}](https://api.esper.io/openapi/esper_cloud_api_application/updateappinfo.md): Returns application instance

### Patch application instance

 - [PATCH /v0/enterprise/{enterprise_id}/emm/{emm_id}/product/{product_id}](https://api.esper.io/openapi/esper_cloud_api_application/patchappinfo.md): Returns application instance

### Delete application instance

 - [DELETE /v0/enterprise/{enterprise_id}/emm/{emm_id}/product/{product_id}](https://api.esper.io/openapi/esper_cloud_api_application/deleteappinstance.md): Empty response

### List product installations

 - [GET /v0/enterprise/{enterprise_id}/emm/{emm_id}/product/{product_id}/install/](https://api.esper.io/openapi/esper_cloud_api_application/listproducts.md): Returns list of product installations

### Gets minimum information regarding application

 - [GET /v1/enterprise/{enterprise_id}/applications-minimal/](https://api.esper.io/openapi/esper_cloud_api_application/getminappinfo.md): Returns id and package name of application

## Application V1

APIs for application management

### List apps in enterprise

 - [GET /v1/enterprise/{enterprise_id}/application/](https://api.esper.io/openapi/esper_cloud_api_application-v1/getallapplicationsv1.md): Returns Application list

### Get application information

 - [GET /v1/enterprise/{enterprise_id}/application/{application_id}/](https://api.esper.io/openapi/esper_cloud_api_application-v1/getapplicationv1.md): Alternative Available: GET /enterprise/{enterprise_id}/application/{application_id}/
To retrieve an iOS or Windows application: 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 workflows.

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 workflows, 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.

### Delete an application

 - [DELETE /v1/enterprise/{enterprise_id}/application/{application_id}/](https://api.esper.io/openapi/esper_cloud_api_application-v1/deleteapplicationv1.md): Empty response

### List App versions

 - [GET /v1/enterprise/{enterprise_id}/application/{application_id}/version/](https://api.esper.io/openapi/esper_cloud_api_application-v1/getappversionsv1.md): 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 workflows 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.

### Get app version information

 - [GET /v1/enterprise/{enterprise_id}/application/{application_id}/version/{version_id}/](https://api.esper.io/openapi/esper_cloud_api_application-v1/getappversionv1.md): 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

### Delete app version

 - [DELETE /v1/enterprise/{enterprise_id}/application/{application_id}/version/{version_id}/](https://api.esper.io/openapi/esper_cloud_api_application-v1/deleteappversionv1.md): 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.

### Patch an App version instance

 - [PATCH /v1/enterprise/{enterprise_id}/application/{application_id}/version/{version_id}/](https://api.esper.io/openapi/esper_cloud_api_application-v1/patchappversionv1.md): 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.

### List install devices

 - [GET /v1/enterprise/{enterprise_id}/application/{application_id}/version/{version_id}/installdevices](https://api.esper.io/openapi/esper_cloud_api_application-v1/getinstalldevicesv1.md): Returns list of devices with the specified app version installed

## AndroidDevice

APIs for android device management

### Fetch all devices in an enterprise

 - [GET /enterprise/{enterprise_id}/device/](https://api.esper.io/openapi/esper_cloud_api_androiddevice/getalldevices.md): ⚠️ 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

### Fetch device details by ID

 - [GET /enterprise/{enterprise_id}/device/{device_id}/](https://api.esper.io/openapi/esper_cloud_api_androiddevice/getdevicebyid.md): ⚠️ 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).

### List all device apps

 - [GET /enterprise/{enterprise_id}/device/{device_id}/app/](https://api.esper.io/openapi/esper_cloud_api_androiddevice/getdeviceapps.md): ⚠️ 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.

### Get device app details

 - [GET /enterprise/{enterprise_id}/device/{device_id}/app/{app_id}/](https://api.esper.io/openapi/esper_cloud_api_androiddevice/getdeviceappbyid.md): Returns DeviceApp instance

### List installed apps

 - [GET /enterprise/{enterprise_id}/device/{device_id}/install/](https://api.esper.io/openapi/esper_cloud_api_androiddevice/getappinstalls.md): Returns AppInstall list

### Get latest device event

 - [GET /enterprise/{enterprise_id}/device/{device_id}/status/](https://api.esper.io/openapi/esper_cloud_api_androiddevice/getdeviceevent.md): Returns DeviceStatus instance

### Download Event Feed for Device

 - [GET /enterprise/{enterprise_id}/device/{device_id}/download/eventfeed/](https://api.esper.io/openapi/esper_cloud_api_androiddevice/paths/~1enterprise~1%7Benterprise_id%7D~1device~1%7Bdevice_id%7D~1download~1eventfeed~1/get.md): Download Event Feed for device, ordered by date the event was created on

### Download Event Feed for Group

 - [GET /enterprise/{enterprise_id}/group/{group_id}/download/eventfeed/](https://api.esper.io/openapi/esper_cloud_api_androiddevice/paths/~1enterprise~1%7Benterprise_id%7D~1group~1%7Bgroup_id%7D~1download~1eventfeed~1/get.md): Download Event Feed for group, ordered by date the event was created on

### Lists event feed for device

 - [GET /v1/enterprise/{enterprise_id}/device/{device_id}/report/eventfeed/](https://api.esper.io/openapi/esper_cloud_api_androiddevice/geteventfeed.md): 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

## Device Group

APIs for device group management

### List device groups

 - [GET /enterprise/{enterprise_id}/devicegroup/](https://api.esper.io/openapi/esper_cloud_api_device-group/getallgroups.md): Get a list of groups in the Devices & Groups.

### Create a device group

 - [POST /enterprise/{enterprise_id}/devicegroup/](https://api.esper.io/openapi/esper_cloud_api_device-group/creategroup.md): Create a group in Devices & Groups.

### Get device group information

 - [GET /enterprise/{enterprise_id}/devicegroup/{group_id}/](https://api.esper.io/openapi/esper_cloud_api_device-group/getgroupbyid.md): Retrieves full metadata for a single device group by its UUID. Returns the DeviceGroup object including the group's name, path, device count, child group count, parent group reference, associated blueprint, and thumbnail. Use when you already have a group_id and need authoritative group detail rather than scanning a list.

About Get Device Group

Device groups in Esper are hierarchical collections of enrolled devices used for bulk management operations — applying blueprints, issuing commands, and organizing fleets. Each group is identified by a stable UUID and carries a path field reflecting its position in the group tree. The device_count and children_count fields provide a snapshot of group size and depth without requiring a separate devices query. Groups with devices currently enrolled cannot be deleted — devices must be moved or removed first.

Key Fields

id — stable UUID for the group; used as group_id in all group operations.

path — slash-delimited string showing the group's full position in the hierarchy.

parent — URL reference to the parent group; null for top-level groups.

device_count — number of devices directly enrolled in this group (does not include subgroup devices).

children_count — number of immediate child groups.

blueprint — UUID of the blueprint currently associated with this group.

thumbnail — UUID of the group's thumbnail image (primarily visible in the Console create/edit modal).

Common Use Cases

Confirm group hierarchy position (path, parent) before performing a move or rename operation.
Check device_count to determine whether a group can be safely deleted.
Retrieve the associated blueprint UUID before issuing a blueprint update.

Best Practices

Use device_count to verify a group is empty before attempting deletion — groups containing devices will return an error on delete.
Prefer this endpoint over scanning the group list when you already have the group_id.
The thumbnail field is largely vestigial in the current Console UI and only surfaces in the create/edit modal; do not rely on it for display logic in integrations.

Workflow

Obtain the group_id from a group list call or stored reference.
Call this endpoint to retrieve full group metadata.
Use device_count, path, and blueprint fields to inform  group operations.

### Update device group

 - [PUT /enterprise/{enterprise_id}/devicegroup/{group_id}/](https://api.esper.io/openapi/esper_cloud_api_device-group/updategroup.md): Update a group in Devices & Groups.

### Delete a device group

 - [DELETE /enterprise/{enterprise_id}/devicegroup/{group_id}/](https://api.esper.io/openapi/esper_cloud_api_device-group/deletegroup.md): Delete a group from Devices & Groups.

### Partially update a device group

 - [PATCH /enterprise/{enterprise_id}/devicegroup/{group_id}/](https://api.esper.io/openapi/esper_cloud_api_device-group/partialupdategroup.md): Partially update a group in Devices & Groups.

### Upload a thumbnail pic

 - [POST /enterprise/{enterprise_id}/devicegroup/thumbnail/](https://api.esper.io/openapi/esper_cloud_api_device-group/uploadgroupthumbnail.md): Upload an image to represent the group in Devices & Groups.

### List thumbnail pics

 - [GET /enterprise/{enterprise_id}/devicegroup/thumbnail/](https://api.esper.io/openapi/esper_cloud_api_device-group/listgroupthumbnail.md): Get a list of group thumbnail image files in Devices & Groups.

### Get thumbnail detail

 - [GET /enterprise/{enterprise_id}/devicegroup/thumbnail/{thumbnail_id}/](https://api.esper.io/openapi/esper_cloud_api_device-group/getgroupthumbnail.md): Get a thumbnail by its ID. Use List thumbnail pics to find thumbnail IDs.

### Delete group thumbnail

 - [DELETE /enterprise/{enterprise_id}/devicegroup/thumbnail/{thumbnail_id}/](https://api.esper.io/openapi/esper_cloud_api_device-group/deletegroupthumbnail.md): Delete a thumbnail in Devices & Groups.

### List the subgroups of list of groups

 - [GET /api/v2/subgroups/](https://api.esper.io/openapi/esper_cloud_api_device-group/getallsubgroups.md): Returns EnterpriseDeviceGroup list

## Token (Deprecated)

⚠️ **Deprecation Notice:** The following APIs will soon be deprecated. Use the console to manage API keys instead.


### Renew Token

 - [POST /v0/enterprise/{enterprise_id}/developerapp/{developerapp_id}/renew-token/](https://api.esper.io/openapi/esper_cloud_api_token-(deprecated)/renewtoken.md): API to renew your token

### Token Information

 - [GET /v1/token-info/](https://api.esper.io/openapi/esper_cloud_api_token-(deprecated)/gettokeninfo.md): API to get resource information associated with your token like your enterprise, user etc

## Commands V2

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

### List command requests

 - [GET /v0/enterprise/{enterprise_id}/command/](https://api.esper.io/openapi/esper_cloud_api_commands-v2/listcommandrequest.md): 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.

### Create a command request

 - [POST /v0/enterprise/{enterprise_id}/command/](https://api.esper.io/openapi/esper_cloud_api_commands-v2/paths/~1v0~1enterprise~1%7Benterprise_id%7D~1command~1/post.md): ⚠️ 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.

### get status list for command request

 - [GET /v0/enterprise/{enterprise_id}/command/{request_id}/status/](https://api.esper.io/openapi/esper_cloud_api_commands-v2/getcommandrequeststatus.md): ⚠️ 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.

### get command history for device

 - [GET /v0/enterprise/{enterprise_id}/device/{device_id}/command-history/](https://api.esper.io/openapi/esper_cloud_api_commands-v2/getdevicecommandhistory.md): ⚠️ 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.

## Enterprise Policy

APIs to Esper Compliance Policy

### List all policies in enterprise

 - [GET /enterprise/{enterprise_id}/policy/](https://api.esper.io/openapi/esper_cloud_api_enterprise-policy/listpolicies.md): Returns Policies list

### Create a new Enterprise Policy

 - [POST /enterprise/{enterprise_id}/policy/](https://api.esper.io/openapi/esper_cloud_api_enterprise-policy/createpolicy.md): API to create a new Enterprise Policy

### Get Enterprise Policy

 - [GET /enterprise/{enterprise_id}/policy/{policy_id}/](https://api.esper.io/openapi/esper_cloud_api_enterprise-policy/getpolicybyid.md): Returns EnterprisePolicy instance

### Update Enterprise Policy

 - [PUT /enterprise/{enterprise_id}/policy/{policy_id}/](https://api.esper.io/openapi/esper_cloud_api_enterprise-policy/updatepolicy.md): Returns Enterprise Policy instance

### Delete a Enterprise Policy

 - [DELETE /enterprise/{enterprise_id}/policy/{policy_id}/](https://api.esper.io/openapi/esper_cloud_api_enterprise-policy/deleteenterprisepolicy.md): Emtpy response

### Partial update EnterprisePolicy

 - [PATCH /enterprise/{enterprise_id}/policy/{policy_id}/](https://api.esper.io/openapi/esper_cloud_api_enterprise-policy/partialupdatepolicy.md): Returns EnterprisePolicy instance

## Geofence

APIs for geofence management

### List Geofences in Enterprise

 - [GET /v0/enterprise/{enterprise_id}/geofence/](https://api.esper.io/openapi/esper_cloud_api_geofence/getallgeofences.md): API to view all the geofences in an enterprise

### Get geofence information

 - [GET /v0/enterprise/{enterprise_id}/geofence/{geofence_id}/](https://api.esper.io/openapi/esper_cloud_api_geofence/getgeofence.md): Returns geofence instance

### Update geofence information

 - [PUT /v0/enterprise/{enterprise_id}/geofence/{geofence_id}/](https://api.esper.io/openapi/esper_cloud_api_geofence/updategeofence.md): Returns geofence instance

### Delete a geofence

 - [DELETE /v0/enterprise/{enterprise_id}/geofence/{geofence_id}/](https://api.esper.io/openapi/esper_cloud_api_geofence/deletegeofence.md): Empty response

### Partially updates geofence information

 - [PATCH /v0/enterprise/{enterprise_id}/geofence/{geofence_id}/](https://api.esper.io/openapi/esper_cloud_api_geofence/partialupdategeofence.md): Returns geofence instance

### Create a geofence

 - [POST /v0/enterprise/{enterprise_id}/create-apply-geo-fence/](https://api.esper.io/openapi/esper_cloud_api_geofence/creategeofence.md): Returns Geofence instance

### List Geofences in Enterprise

 - [GET /v0/enterprise/{enterprise_id}/create-apply-geo-fence/](https://api.esper.io/openapi/esper_cloud_api_geofence/getgeofencelist.md): API to view all the geofences in an enterprise

### Get geofence information

 - [GET /v0/enterprise/{enterprise_id}/create-apply-geofence/{geofence_id}/](https://api.esper.io/openapi/esper_cloud_api_geofence/getthegeofence.md): Returns geofence instance

### Delete a geofence

 - [DELETE /v0/enterprise/{enterprise_id}/create-apply-geofence/{geofence_id}/](https://api.esper.io/openapi/esper_cloud_api_geofence/deletethegeofence.md): Empty response

## Content

APIs to manage files

### List content

 - [GET /v0/enterprise/{enterprise_id}/content/](https://api.esper.io/openapi/esper_cloud_api_content/getallcontent.md): Lists all content files stored in the enterprise content library.
Returns a paginated collection of Content records including file name, download URL, MIME type, size, path, tags, description, and owner metadata. Default page size is 20.

About List Content

Esper's content library is an enterprise-level file store for managing files that can be pushed to enrolled devices. Each Content record tracks the file's storage path, MIME type (kind), SHA hash, size in bytes, tags, and a human-readable description. Content can be distributed to devices via commands referencing the content's id. The library is accessible from the Esper Console and supports tagging for organized retrieval.

Key Query Parameters

search — filters results by tags and description fields only; does not search by filename

limit — results per page (default: 20)

offset — pagination offset (default: 0)

Common Use Cases

Retrieve a full inventory of files available for device distribution.
Search for content by tag or description to locate the right file before issuing a push command.
Audit content metadata (size, hash, MIME type) to verify file integrity before distribution.

Best Practices

The search parameter matches against tags and description only — it does not search by filename or key; apply tags at upload time to make content reliably searchable.
Use the download_url field from results to verify file accessibility before referencing content in a device command.
Tag content consistently at upload time to support filtered retrieval; untagged files can only be found by browsing the full paginated list.

Workflow

Call this endpoint, optionally using search with a tag or description term to narrow results.
Identify the target content record and note its id.
Use the id in a content push command or in GET .../content/{content_id}/ for full detail.

### Get content information

 - [GET /v0/enterprise/{enterprise_id}/content/{content_id}/](https://api.esper.io/openapi/esper_cloud_api_content/getcontent.md): Get information about a file

### Delete Content

 - [DELETE /v0/enterprise/{enterprise_id}/content/{content_id}/](https://api.esper.io/openapi/esper_cloud_api_content/deletecontent.md): Delete content.

### Patch a content instance

 - [PATCH /v0/enterprise/{enterprise_id}/content/{content_id}/](https://api.esper.io/openapi/esper_cloud_api_content/patchcontent.md)

### Upload new content

 - [POST /v0/enterprise/{enterprise_id}/content/upload/](https://api.esper.io/openapi/esper_cloud_api_content/postcontent.md): 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.

### Upload file to Remote File Manager

 - [POST /v0/enterprise/{enterprise_id}/content/remote-file/](https://api.esper.io/openapi/esper_cloud_api_content/uploadremotefile.md): Upload file through SCAPI server to REMOTE_FILE_MANAGER bucket. Files are automatically deleted after 1 day.

### Generate download URL for existing file

 - [POST /v0/enterprise/{enterprise_id}/content/remote-file/generate_download_url/](https://api.esper.io/openapi/esper_cloud_api_content/generatedownloadurl.md): Generate a pre-signed download URL for an existing file in REMOTE_FILE_MANAGER bucket

## User (Deprecated)

⚠️ **Deprecation Notice:** The following APIs will soon be deprecated. Please transition to the User APIs.

### Create a new User

 - [POST /user/](https://api.esper.io/openapi/esper_cloud_api_user-(deprecated)/createuser.md): Create a new User

### Update a User

 - [PUT /user/{user_id}/](https://api.esper.io/openapi/esper_cloud_api_user-(deprecated)/updateuser.md): Update a User

### Partial update a User

 - [PATCH /user/{user_id}/](https://api.esper.io/openapi/esper_cloud_api_user-(deprecated)/partialupdateuser.md): Partial update a User

### Delete a user

 - [DELETE /user/{user_id}/](https://api.esper.io/openapi/esper_cloud_api_user-(deprecated)/userdelete.md)

## User

APIs for User Management

### User information

 - [GET /user_info/](https://api.esper.io/openapi/esper_cloud_api_user/userinfo.md): User information

### Invite a user

 - [POST /authn2/v0/tenant/{enterprise_id}/invite](https://api.esper.io/openapi/esper_cloud_api_user/tenantuserinvite.md): Invite a user to a tenant

### List user invites

 - [GET /authn2/v0/tenant/{enterprise_id}/invite](https://api.esper.io/openapi/esper_cloud_api_user/gettenantuserinvites.md): List user invites in a tenant

### Delete a invite

 - [DELETE /authn2/v0/tenant/{enterprise_id}/invite/{invite_id}](https://api.esper.io/openapi/esper_cloud_api_user/deletetenantuserinvite.md): Delete a invite

### Get Users

 - [GET /user/](https://api.esper.io/openapi/esper_cloud_api_user/getusers.md): Get a list of users in the tenant

### Get User Information

 - [GET /user/{user_id}/](https://api.esper.io/openapi/esper_cloud_api_user/getuser.md): Get User Information

### Update user role

 - [PUT /authz2/v1/users/{user_id}](https://api.esper.io/openapi/esper_cloud_api_user/updatedifferentuser.md): Update user's role

### Update user profile

 - [PUT /authn2/v0/user/{user_id}](https://api.esper.io/openapi/esper_cloud_api_user/updateownuser.md): Update user's profile

### Get user groups

 - [GET /authz2/v1/users/{user_id}/groups](https://api.esper.io/openapi/esper_cloud_api_user/getusergroups.md): Get user's groups

### Delete a user from Enterprise

 - [DELETE /authn2/v0/tenant/{enterprise_id}/user/{user_id}/](https://api.esper.io/openapi/esper_cloud_api_user/deletetenantuser.md): Delete a user from Enterprise

### Get Users details

 - [GET /authn2/v1/users/](https://api.esper.io/openapi/esper_cloud_api_user/paths/~1authn2~1v1~1users~1/get.md): This endpoint allows to fetch user list of a tenant

## Blueprint (Deprecated)

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.


### Get list of Blueprints for the group

 - [GET /enterprise/{enterprise_id}/devicegroup/{group_id}/blueprint/](https://api.esper.io/openapi/esper_cloud_api_blueprint-(deprecated)/listblueprint.md): Return list of Blueprint instances for the group.

⚠️ Deprecation Notice: This endpoint will soon be deprecated. Use Blueprints API instead.

### Create a Blueprint

 - [POST /enterprise/{enterprise_id}/devicegroup/{group_id}/blueprint/](https://api.esper.io/openapi/esper_cloud_api_blueprint-(deprecated)/createblueprint.md): Returns the created Blueprint instance.

⚠️ Deprecation Notice: This endpoint will soon be deprecated. Use Blueprints API instead.

### Get Blueprint detail

 - [GET /enterprise/{enterprise_id}/devicegroup/{group_id}/blueprint/{blueprint_id}/](https://api.esper.io/openapi/esper_cloud_api_blueprint-(deprecated)/getblueprint.md): Returns the details of a Blueprint instance.

⚠️ Deprecation Notice: This endpoint will soon be deprecated. Use Blueprints API instead.

### Partial update a Blueprint

 - [PATCH /enterprise/{enterprise_id}/devicegroup/{group_id}/blueprint/{blueprint_id}/](https://api.esper.io/openapi/esper_cloud_api_blueprint-(deprecated)/partialupdateblueprint.md): Returns the details of the updated Blueprint instance.

⚠️ Deprecation Notice: This endpoint will soon be deprecated. Use Blueprints API instead.

### Delete a Blueprint

 - [DELETE /enterprise/{enterprise_id}/devicegroup/{group_id}/blueprint/{blueprint_id}/](https://api.esper.io/openapi/esper_cloud_api_blueprint-(deprecated)/deleteblueprint.md): Deletes the requested Blueprint instance.

⚠️ Deprecation Notice: This endpoint will soon be deprecated. Use Blueprints API instead.

### Get list of Blueprint Revisions

 - [GET /enterprise/{enterprise_id}/devicegroup/{group_id}/blueprint/{blueprint_id}/revisions/](https://api.esper.io/openapi/esper_cloud_api_blueprint-(deprecated)/listblueprintrevisions.md): Returns a list of Blueprint Revisions instances for the given Blueprint.

⚠️ Deprecation Notice: This endpoint will soon be deprecated. Use Blueprints API instead.

### Get Blueprint Revision detail

 - [GET /enterprise/{enterprise_id}/devicegroup/{group_id}/blueprint/{blueprint_id}/revisions/{revision_id}/](https://api.esper.io/openapi/esper_cloud_api_blueprint-(deprecated)/getblueprintrevision.md): Returns the detail of Blueprint Revision instance.

⚠️ Deprecation Notice: This endpoint will soon be deprecated. Use Blueprints API instead.

### Restore a Blueprint

 - [POST /enterprise/{enterprise_id}/devicegroup/{group_id}/blueprint/restore/](https://api.esper.io/openapi/esper_cloud_api_blueprint-(deprecated)/restoreblueprintrevision.md): Returns the Blueprint instance restored to the requested Blueprint Revision.

⚠️ Deprecation Notice: This endpoint will soon be deprecated. Use Blueprints API instead.

### Upload a Blueprint

 - [POST /enterprise/{enterprise_id}/devicegroup/{group_id}/blueprint/upload/](https://api.esper.io/openapi/esper_cloud_api_blueprint-(deprecated)/uploadblueprint.md): Create a Blueprint by uploading a json file.

⚠️ Deprecation Notice: This endpoint will soon be deprecated. Use Blueprints API instead.

## Directory Record

APIs for Directory Record management. These APIs are only available to the customers using the new Onboarding experience.

### Get all Directory Records

 - [GET /v1/enterprise/{enterprise_id}/directory_record/](https://api.esper.io/openapi/esper_cloud_api_directory-record/getdirectoryrecords.md): Returns a list of all Directory Record instances

### Create a new Directory Record

 - [POST /v1/enterprise/{enterprise_id}/directory_record/](https://api.esper.io/openapi/esper_cloud_api_directory-record/createdirectoryrecord.md): Returns the created Directory Record intance

### Get details about a Directory Record

 - [GET /v1/enterprise/{enterprise_id}/directory_record/{directory_record_id}/](https://api.esper.io/openapi/esper_cloud_api_directory-record/getdirectoryrecord.md): Returns detail of the Directory Record instance

### Update a Directory Record

 - [PUT /v1/enterprise/{enterprise_id}/directory_record/{directory_record_id}/](https://api.esper.io/openapi/esper_cloud_api_directory-record/updatedirectoryrecord.md): Returns the updated Directory Record instance

### Delete a Directory Record

 - [DELETE /v1/enterprise/{enterprise_id}/directory_record/{directory_record_id}/](https://api.esper.io/openapi/esper_cloud_api_directory-record/deletedirectoryrecord.md): Deletes the requested Directory Record instance

## Tile Icon

APIs to manage tile icons. Tile icons allow Templates-based users to apply a icons to devices.


### Get List of Device Tile Icons

 - [GET /v1/enterprise/{enterprise_id}/tile-icons/](https://api.esper.io/openapi/esper_cloud_api_tile-icon/gettileicons.md): Returns list of tile icons

### Create a  tile icon

 - [POST /v1/enterprise/{enterprise_id}/tile-icons/](https://api.esper.io/openapi/esper_cloud_api_tile-icon/addtileicon.md): Create a tile icon.

### Get instance of a tile icon

 - [GET /v1/enterprise/{enterprise_id}/tile-icons/{tileicons_id}/](https://api.esper.io/openapi/esper_cloud_api_tile-icon/gettileicon.md): Get a tile icon.

### Delete a tile icon

 - [DELETE /v1/enterprise/{enterprise_id}/tile-icons/{tileicons_id}/](https://api.esper.io/openapi/esper_cloud_api_tile-icon/deletetileicon.md): Deletes a title icon

### Set a tile icon for a device

 - [POST /v1/enterprise/{enterprise_id}/tile-icon-apply/](https://api.esper.io/openapi/esper_cloud_api_tile-icon/applytileicon.md): Apply a tile icon to a device.

### Removes tile icon for device

 - [POST /v1/enterprise/{enterprise_id}/tile-icon-unapply/](https://api.esper.io/openapi/esper_cloud_api_tile-icon/removetileicon.md): Returns the model of the device(s)

## Alerts

### List alert channels in enterprise

 - [GET /v1/enterprise/{enterprise_id}/alertchannels/](https://api.esper.io/openapi/esper_cloud_api_alerts/listalertchannels.md): Returns list of alert channels

### Creates alert channel

 - [POST /v1/enterprise/{enterprise_id}/alertchannels/](https://api.esper.io/openapi/esper_cloud_api_alerts/createalertchannel.md): Returns instance of alert channel

### Get alert channel

 - [GET /v1/enterprise/{enterprise_id}/alertchannels/{alert_id}](https://api.esper.io/openapi/esper_cloud_api_alerts/getalertchannel.md): Returns instance of alert channel

### Update alert channel information

 - [PUT /v1/enterprise/{enterprise_id}/alertchannels/{alert_id}](https://api.esper.io/openapi/esper_cloud_api_alerts/updatealertchannel.md): Returns alert channel instance

### Partially updates alert channel information

 - [PATCH /v1/enterprise/{enterprise_id}/alertchannels/{alert_id}](https://api.esper.io/openapi/esper_cloud_api_alerts/patchalertchannel.md): Returns alert channel instance

### Delete an alert channel

 - [DELETE /v1/enterprise/{enterprise_id}/alertchannels/{alert_id}](https://api.esper.io/openapi/esper_cloud_api_alerts/deletealertchannel.md): Empty response

## Alarms

### Get list of alarm rules

 - [GET /v1/enterprise/{enterprise_id}/alarmrules/](https://api.esper.io/openapi/esper_cloud_api_alarms/getalarmrules.md): Returns list of alarm rules

### Creates instance of alarm rules

 - [POST /v1/enterprise/{enterprise_id}/alarmrules/](https://api.esper.io/openapi/esper_cloud_api_alarms/addalarmrule.md): Returns instance of alarm rules

### Get instance of alarm rule

 - [GET /v1/enterprise/{enterprise_id}/alarmrules/{alarm_id}/](https://api.esper.io/openapi/esper_cloud_api_alarms/getalarmrule.md): Returns instance of alarm rule

### Update alarm rules

 - [PUT /v1/enterprise/{enterprise_id}/alarmrules/{alarm_id}/](https://api.esper.io/openapi/esper_cloud_api_alarms/updatealarmrule.md): Return instance of alarm rules

### Partially updates alarm rules

 - [PATCH /v1/enterprise/{enterprise_id}/alarmrules/{alarm_id}/](https://api.esper.io/openapi/esper_cloud_api_alarms/patchalarmrule.md): Returns instance of alarm rules

### Deletes alarm rule

 - [DELETE /v1/enterprise/{enterprise_id}/alarmrules/{alarm_id}/](https://api.esper.io/openapi/esper_cloud_api_alarms/deletealarmrule.md): Empty response

### Get history of alarm rule

 - [GET /v1/enterprise/{enterprise_id}/alarmrules/{alarm_id}/alarmhistory/](https://api.esper.io/openapi/esper_cloud_api_alarms/getalarmhistory.md): Returns instance of alarm rule history

## Wallpapers

### Get list of wallpapers

 - [GET /v1/enterprise/{enterprise_id}/wallpaper/](https://api.esper.io/openapi/esper_cloud_api_wallpapers/getwallpapers.md): Returns list of wallpapers

### Create wallpaper

 - [POST /v1/enterprise/{enterprise_id}/wallpaper/](https://api.esper.io/openapi/esper_cloud_api_wallpapers/addwallpaper.md): Returns instance of created wallpaper

### Get instance of wallpaper

 - [GET /v1/enterprise/{enterprise_id}/wallpaper/{wallpaper_id}/](https://api.esper.io/openapi/esper_cloud_api_wallpapers/getwallpaper.md): Returns instance of wallpaper

### Deletes instance of wallpaper

 - [DELETE /v1/enterprise/{enterprise_id}/wallpaper/{wallpaper_id}/](https://api.esper.io/openapi/esper_cloud_api_wallpapers/deletewallpaper.md): Empty response

## Device Telemetry

### Get list of device locations

 - [GET /v1/enterprise/{enterprise_id}/report/location/](https://api.esper.io/openapi/esper_cloud_api_device-telemetry/getdevicelocations.md): Returns list of device locations

### Get location of specific device

 - [GET /v1/enterprise/{enterprise_id}/report/location/{location_id}/](https://api.esper.io/openapi/esper_cloud_api_device-telemetry/getspecificlocations.md): Returns location information of device

### Get list of device tiles reports

 - [GET /v1/enterprise/{enterprise_id}/report/device-tiles/](https://api.esper.io/openapi/esper_cloud_api_device-telemetry/getdevicetilereports.md): Returns list of device tiles reports

### Get instance of device tiles report

 - [GET /v1/enterprise/{enterprise_id}/report/device-tiles/{device_tiles_id}/](https://api.esper.io/openapi/esper_cloud_api_device-telemetry/getdevicetilereport.md): Returns instance of device tiles report

### Get status metrics report for enterprise

 - [GET /v1/enterprise/{enterprise_id}/report/status-metrics/](https://api.esper.io/openapi/esper_cloud_api_device-telemetry/getstatusmetrics.md): Returns status metrics report for enterprise

### Get status metrics report for enterprise v2

 - [GET /v2/enterprise/{enterprise_id}/report/status-metrics](https://api.esper.io/openapi/esper_cloud_api_device-telemetry/getstatusmetricsv2.md): Returns status metrics report for enterprise

## Daily and Custom Reports

### Get report information

 - [GET /enterprise/report/info/](https://api.esper.io/openapi/esper_cloud_api_daily-and-custom-reports/getreportinfo.md): Returns report information

### Get device status reports within specified date-time range

 - [GET /enterprise/report/device-report/](https://api.esper.io/openapi/esper_cloud_api_daily-and-custom-reports/getdevicereport.md): Returns device status reports within specified date-time range

### Get enterprise report

 - [GET /enterprise/report/enterprise-report/](https://api.esper.io/openapi/esper_cloud_api_daily-and-custom-reports/getenterprisereport.md): Returns enterprise report of devices within specified date-time range

### Get group report

 - [GET /enterprise/report/group-report/](https://api.esper.io/openapi/esper_cloud_api_daily-and-custom-reports/getgroupreport.md): Returns group report of devices within specified date-time range

### Get list of subscription reports

 - [GET /enterprise/report/subscription/](https://api.esper.io/openapi/esper_cloud_api_daily-and-custom-reports/getsubscriptionreports.md): Returns list of subscription reports

### Post subscription to enterprise

 - [POST /enterprise/report/subscription/](https://api.esper.io/openapi/esper_cloud_api_daily-and-custom-reports/addsubscription.md): Returns instance of created subscription

### Get instance of subscription

 - [GET /enterprise/report/subscription/{subscription_id}/](https://api.esper.io/openapi/esper_cloud_api_daily-and-custom-reports/getsubscriptionreport.md): Returns instance of subscription

### Update subscription

 - [PUT /enterprise/report/subscription/{subscription_id}/](https://api.esper.io/openapi/esper_cloud_api_daily-and-custom-reports/updatesubscriptionreport.md): Returns instance of updated subscription

### Partially update subscription

 - [PATCH /enterprise/report/subscription/{subscription_id}/](https://api.esper.io/openapi/esper_cloud_api_daily-and-custom-reports/patchsubscriptionreport.md): Returns instance of updated subscription

### Deletes instance of subscription

 - [DELETE /enterprise/report/subscription/{subscription_id}/](https://api.esper.io/openapi/esper_cloud_api_daily-and-custom-reports/deletesubscriptionreport.md): Empty response

## SSO Connections

### List SSO connections

 - [GET /authn2/v0/tenant/{enterprise_id}/connection](https://api.esper.io/openapi/esper_cloud_api_sso-connections/getconnections.md): List SSO connections of a tenant. Learn more about SSO Connections.

### Edit SSO connections

 - [PUT /authn2/v0/tenant/{enterprise_id}/connection/{connection_id}](https://api.esper.io/openapi/esper_cloud_api_sso-connections/editcustomconnection.md): Edit SSO connections

## Roles

### List Roles API

 - [GET /authz2/v1/roles/](https://api.esper.io/openapi/esper_cloud_api_roles/getroleurl.md): API to retrieve all the roles for the tenant

### Create a new role. Then optionally add scopes by using the Update Role Scopes API. No scopes are added by default.

 - [POST /authz2/v1/roles/](https://api.esper.io/openapi/esper_cloud_api_roles/postroleurl.md): Learn more about Creating Custom Roles.

### Get Role API

 - [GET /authz2/v1/roles/{role_id}](https://api.esper.io/openapi/esper_cloud_api_roles/getroleidurl.md): API to retrieve the role for the tenant

### Patch Role API

 - [PATCH /authz2/v1/roles/{role_id}](https://api.esper.io/openapi/esper_cloud_api_roles/updateroleidurl.md): API to update role details

### Delete Role API

 - [DELETE /authz2/v1/roles/{role_id}](https://api.esper.io/openapi/esper_cloud_api_roles/deleteroleidurl.md): API to delete the role for the tenant

### Update Role Scopes API

 - [PUT /authz2/v1/roles/{role_id}/scopes](https://api.esper.io/openapi/esper_cloud_api_roles/putrolescopeurl.md): API to update scopes of an roles for the tenant

### List Role Scopes API

 - [GET /authz2/v1/roles/{role_id}/scopes](https://api.esper.io/openapi/esper_cloud_api_roles/getrolescopeurl.md): API to retrieve scopes of an roles for the tenant

## Personal Access Token

### Generate a new personal access token

 - [POST /authn2/v0/personal-access-token/](https://api.esper.io/openapi/esper_cloud_api_personal-access-token/paths/~1authn2~1v0~1personal-access-token~1/post.md): This endpoint allows clients to generate a new personal access token for a specific user and tenant.

### Get tokens for corresponding user and tenant

 - [GET /authn2/v0/personal-access-token/](https://api.esper.io/openapi/esper_cloud_api_personal-access-token/paths/~1authn2~1v0~1personal-access-token~1/get.md): Get all tokens associated with the given user and tenant.

### Renew personal access token

 - [PUT /authn2/v0/personal-access-token/{personal_access_token_id}](https://api.esper.io/openapi/esper_cloud_api_personal-access-token/paths/~1authn2~1v0~1personal-access-token~1%7Bpersonal_access_token_id%7D/put.md): Renew token associated with the given token_id.

### Delete personal access token

 - [DELETE /authn2/v0/personal-access-token/{personal_access_token_id}](https://api.esper.io/openapi/esper_cloud_api_personal-access-token/paths/~1authn2~1v0~1personal-access-token~1%7Bpersonal_access_token_id%7D/delete.md): Delete token.

## Blueprints API

APIs to manage blueprints. Learn more about [blueprints](https://help.esper.io/hc/en-us/articles/19118758564369-Introduction-to-Blueprints).

### Retrieves a paginated list of all Blueprint V2 blu

 - [GET /v2/blueprints/](https://api.esper.io/openapi/blueprints_blueprints-api/paths/~1v2~1blueprints~1/get.md): 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

### Create a new blueprint

 - [POST /v2/blueprints/](https://api.esper.io/openapi/blueprints_blueprints-api/paths/~1v2~1blueprints~1/post.md): Create a new blueprint

### Retrieve a blueprint by ID

 - [GET /v2/blueprints/{blueprint_id}/](https://api.esper.io/openapi/blueprints_blueprints-api/paths/~1v2~1blueprints~1%7Bblueprint_id%7D~1/get.md): Retrieve a blueprint by ID

### Update a blueprint by ID

 - [PUT /v2/blueprints/{blueprint_id}/](https://api.esper.io/openapi/blueprints_blueprints-api/paths/~1v2~1blueprints~1%7Bblueprint_id%7D~1/put.md): Update a blueprint by ID

### Delete a blueprint by ID

 - [DELETE /v2/blueprints/{blueprint_id}/](https://api.esper.io/openapi/blueprints_blueprints-api/paths/~1v2~1blueprints~1%7Bblueprint_id%7D~1/delete.md): Delete a blueprint by ID

### Retrieve all versions of a blueprint

 - [GET /v2/blueprints/{blueprint_id}/versions/](https://api.esper.io/openapi/blueprints_blueprints-api/paths/~1v2~1blueprints~1%7Bblueprint_id%7D~1versions~1/get.md): Retrieve all versions of a blueprint

### Retrieve a specific version of the blueprint

 - [GET /v2/blueprints/{blueprint_id}/versions/{version_id}/](https://api.esper.io/openapi/blueprints_blueprints-api/paths/~1v2~1blueprints~1%7Bblueprint_id%7D~1versions~1%7Bversion_id%7D~1/get.md): Retrieve a specific version of the blueprint

## Custom Actions API

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.

### Retrieve all custom actions for the tenant

 - [GET /v2/custom-actions/](https://api.esper.io/openapi/blueprints_custom-actions-api/paths/~1v2~1custom-actions~1/get.md): Retrieve all custom actions for the tenant

### Create a new custom action

 - [POST /v2/custom-actions/](https://api.esper.io/openapi/blueprints_custom-actions-api/paths/~1v2~1custom-actions~1/post.md): Create a new custom action

### Retrieve a custom action by ID

 - [GET /v2/custom-actions/{custom_action_id}/](https://api.esper.io/openapi/blueprints_custom-actions-api/paths/~1v2~1custom-actions~1%7Bcustom_action_id%7D~1/get.md): Retrieve a custom action by ID

### Update a custom action by ID

 - [PUT /v2/custom-actions/{custom_action_id}/](https://api.esper.io/openapi/blueprints_custom-actions-api/paths/~1v2~1custom-actions~1%7Bcustom_action_id%7D~1/put.md): Update a custom action by ID

### Delete a custom action by ID

 - [DELETE /v2/custom-actions/{custom_action_id}/](https://api.esper.io/openapi/blueprints_custom-actions-api/paths/~1v2~1custom-actions~1%7Bcustom_action_id%7D~1/delete.md): Delete a custom action by ID

### Retrieve script content by ID

 - [GET /v2/scripts/{script_id}/](https://api.esper.io/openapi/blueprints_custom-actions-api/paths/~1v2~1scripts~1%7Bscript_id%7D~1/get.md): Retrieve script content by ID

## Background Scripts API

APIs to manage background scripts. Background scripts are scripts that can be configured to run continuously or at specified intervals on devices.

### Create a new background script

 - [POST /v2/background-scripts/](https://api.esper.io/openapi/blueprints_background-scripts-api/paths/~1v2~1background-scripts~1/post.md): Create a new background script

### Retrieve all background scripts for the tenant

 - [GET /v2/background-scripts/](https://api.esper.io/openapi/blueprints_background-scripts-api/paths/~1v2~1background-scripts~1/get.md): Retrieve all background scripts for the tenant

### Retrieve a background script by ID. Includes the s

 - [GET /v2/background-scripts/{background_script_id}/](https://api.esper.io/openapi/blueprints_background-scripts-api/paths/~1v2~1background-scripts~1%7Bbackground_script_id%7D~1/get.md): Retrieve a background script by ID. Includes the script content fetched from S3.

## System

System level APIs

### Health check endpoint

 - [GET /sys/health](https://api.esper.io/openapi/pipelines_system/getservicehealth.md)

## Pipelines

Pipelines composition APIs

### Get all Pipelines for the Enterprise

 - [GET /pipelines/v0/pipelines/](https://api.esper.io/openapi/pipelines_pipelines/getpipelines.md): Returns all the Pipelines that are not deleted

### Create a new Pipeline

 - [POST /pipelines/v0/pipelines/](https://api.esper.io/openapi/pipelines_pipelines/createpipeline.md): Create a Pipeline for the enterprise using logged in user token

### Get a Pipeline

 - [GET /pipelines/v0/pipelines/{pipeline_id}/](https://api.esper.io/openapi/pipelines_pipelines/getpipeline.md)

### Update a Pipeline

 - [PUT /pipelines/v0/pipelines/{pipeline_id}/](https://api.esper.io/openapi/pipelines_pipelines/updatepipeline.md)

### Delete a Pipeline

 - [DELETE /pipelines/v0/pipelines/{pipeline_id}/](https://api.esper.io/openapi/pipelines_pipelines/deletepipeline.md)

## Stages

APIs to modify Stage information

### Get all Pipeline stages

 - [GET /pipelines/v0/pipelines/{pipeline_id}/stages/](https://api.esper.io/openapi/pipelines_stages/getpipelinestages.md)

### Create a Pipeline stage

 - [POST /pipelines/v0/pipelines/{pipeline_id}/stages/](https://api.esper.io/openapi/pipelines_stages/createpipelinestage.md)

### Get a Pipeline Stage

 - [GET /pipelines/v0/pipelines/{pipeline_id}/stages/{stage_id}/](https://api.esper.io/openapi/pipelines_stages/getpipelinestage.md)

### Update a Pipeline Stage

 - [PUT /pipelines/v0/pipelines/{pipeline_id}/stages/{stage_id}/](https://api.esper.io/openapi/pipelines_stages/updatepipelinestage.md)

### Delete a pipeline stage

 - [DELETE /pipelines/v0/pipelines/{pipeline_id}/stages/{stage_id}/](https://api.esper.io/openapi/pipelines_stages/deletepipelinestage.md)

### Get all Target Lists attached to the Stage

 - [GET /pipelines/v0/stages/{stage_id}/targetlists/](https://api.esper.io/openapi/pipelines_stages/getstagetargetlists.md)

### Attach the Target List to the Stage

 - [POST /pipelines/v0/stages/{stage_id}/targetlists/](https://api.esper.io/openapi/pipelines_stages/addstagetargetlist.md)

### Detach the Target List from the Stage

 - [DELETE /pipelines/v0/stages/{stage_id}/targetlists/{targetlist_id}/](https://api.esper.io/openapi/pipelines_stages/deletestagetargetlist.md)

## Target Lists

APIs to modify Target List

### Get all Target Lists in Pipeline

 - [GET /pipelines/v0/pipelines/{pipeline_id}/targetlists/](https://api.esper.io/openapi/pipelines_target-lists/getpipelinetargetlists.md)

### Create a Target List

 - [POST /pipelines/v0/pipelines/{pipeline_id}/targetlists/](https://api.esper.io/openapi/pipelines_target-lists/addpipelinetargetlist.md)

### Get a Pipeline Target list

 - [GET /pipelines/v0/pipelines/{pipeline_id}/targetlists/{targetlist_id}/](https://api.esper.io/openapi/pipelines_target-lists/getpipelinetargetlist.md)

### Update a Pipeline Target List

 - [PUT /pipelines/v0/pipelines/{pipeline_id}/targetlists/{targetlist_id}/](https://api.esper.io/openapi/pipelines_target-lists/updatepipelinetargetlist.md)

### Delete a Pipeline Target list

 - [DELETE /pipelines/v0/pipelines/{pipeline_id}/targetlists/{targetlist_id}/](https://api.esper.io/openapi/pipelines_target-lists/deletepipelinetargetlist.md)

## Targets

Targets subsystem

### Get all Targets in the Target List

 - [GET /pipelines/v0/pipelines/{pipeline_id}/targetlists/{targetlist_id}/targets/](https://api.esper.io/openapi/pipelines_targets/gettargetlisttargets.md)

### Create a target for the target list

 - [POST /pipelines/v0/pipelines/{pipeline_id}/targetlists/{targetlist_id}/targets/](https://api.esper.io/openapi/pipelines_targets/createtargetlisttargets.md)

### Get one target from target list

 - [GET /pipelines/v0/pipelines/{pipeline_id}/targetlists/{targetlist_id}/targets/{target_id}/](https://api.esper.io/openapi/pipelines_targets/gettargetlisttarget.md)

### Update a target in the target list

 - [PUT /pipelines/v0/pipelines/{pipeline_id}/targetlists/{targetlist_id}/targets/{target_id}/](https://api.esper.io/openapi/pipelines_targets/updatetargetlisttarget.md)

### Delete a Target or Device from a Target List

 - [DELETE /pipelines/v0/pipelines/{pipeline_id}/targetlists/{targetlist_id}/targets/{target_id}/](https://api.esper.io/openapi/pipelines_targets/deletetargetlisttarget.md)

### Bulk add targets to a target list

 - [POST /pipelines/v0/pipelines/{pipeline_id}/targetlists/{targetlist_id}/targets-bulk/](https://api.esper.io/openapi/pipelines_targets/bulkaddtargetlisttargets.md): 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.

## Device Groups

APIs to modify Device Groups

### Get all Device Groups in the Target List

 - [GET /pipelines/v0/pipelines/{pipeline_id}/targetlists/{targetlist_id}/devicegroups/](https://api.esper.io/openapi/pipelines_device-groups/gettargetlistdevicegroups.md)

### Add a Device Group to the Target List

 - [POST /pipelines/v0/pipelines/{pipeline_id}/targetlists/{targetlist_id}/devicegroups/](https://api.esper.io/openapi/pipelines_device-groups/addtargetlistdevicegroups.md)

### Delete Device Group from a Target List

 - [DELETE /pipelines/v0/pipelines/{pipeline_id}/targetlists/{targetlist_id}/devicegroups/{devicegroup_id}/](https://api.esper.io/openapi/pipelines_device-groups/deletetargetlistdevicegroup.md)

### Get all Devices in the device group

 - [GET /pipelines/v0/pipelines/{pipeline_id}/targetlists/{targetlist_id}/devicegroups/{device_group_id}/devices/](https://api.esper.io/openapi/pipelines_device-groups/getdevicegroupdevices.md)

## Operation Lists

APIs to modify Operation List

### Get all Operation Lists attached to the Stage

 - [GET /pipelines/v0/stages/{stage_id}/operationlists/](https://api.esper.io/openapi/pipelines_operation-lists/getstageoperationlists.md)

### Create an Operation list for the Stage

 - [POST /pipelines/v0/stages/{stage_id}/operationlists/](https://api.esper.io/openapi/pipelines_operation-lists/addstageoperationlist.md)

### Update an Operation List

 - [PUT /pipelines/v0/stages/{stage_id}/operationlists/{operationlist_id}/](https://api.esper.io/openapi/pipelines_operation-lists/updatepipelineoperationlist.md)

### Delete stage operation list

 - [DELETE /pipelines/v0/stages/{stage_id}/operationlists/{operationlist_id}/](https://api.esper.io/openapi/pipelines_operation-lists/deletestageoperationlist.md)

## Operations

Operations subsystem

### Get all Operations in the Operation List

 - [GET /pipelines/v0/operationlists/{operationlist_id}/operations/](https://api.esper.io/openapi/pipelines_operations/getoperationlistoperations.md)

### Create an Operation for Operation List

 - [POST /pipelines/v0/operationlists/{operationlist_id}/operations/](https://api.esper.io/openapi/pipelines_operations/addoperationlistoperations.md)

### Get an Operation from the operation list

 - [GET /pipelines/v0/operationlists/{operationlist_id}/operations/{operation_id}/](https://api.esper.io/openapi/pipelines_operations/getoperationlistoperation.md)

### Update an Operation

 - [PUT /pipelines/v0/operationlists/{operationlist_id}/operations/{operation_id}/](https://api.esper.io/openapi/pipelines_operations/updateoperationlistoperation.md)

### Delete an Operation list operation

 - [DELETE /pipelines/v0/operationlists/{operationlist_id}/operations/{operation_id}/](https://api.esper.io/openapi/pipelines_operations/deleteoperationlistoperation.md)

## Pipeline Runs

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.


### Get all Runs for the Pipelines in the Enterprise

 - [GET /pipelines/v0/runs/](https://api.esper.io/openapi/pipelines_pipeline-runs/getallpipelineruns.md)

### Get all Runs for the Pipeline

 - [GET /pipelines/v0/pipelines/{pipeline_id}/runs/](https://api.esper.io/openapi/pipelines_pipeline-runs/getpipelineruns.md)

### Create a Pipeline Run

 - [POST /pipelines/v0/pipelines/{pipeline_id}/runs/](https://api.esper.io/openapi/pipelines_pipeline-runs/createpipelinerun.md)

### Get Pipeline run by pipeline run id

 - [GET /pipelines/v0/pipelines/{pipeline_id}/runs/{pipeline_run_id}/](https://api.esper.io/openapi/pipelines_pipeline-runs/getpipelinerun.md)

### Update a Pipeline Run

 - [PUT /pipelines/v0/pipelines/{pipeline_id}/runs/{pipeline_run_id}/](https://api.esper.io/openapi/pipelines_pipeline-runs/updatepipelinerun.md)

### Delete a Pipeline Run

 - [DELETE /pipelines/v0/pipelines/{pipeline_id}/runs/{pipeline_run_id}/](https://api.esper.io/openapi/pipelines_pipeline-runs/deletepipelinerun.md)

## Stage Runs

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.


### Get all Stage Runs for the Pipeline Run

 - [GET /pipelines/v0/runs/{pipeline_run_id}/stageruns/](https://api.esper.io/openapi/pipelines_stage-runs/getpipelinerunstageruns.md)

### Get Pipeline Stage run by stage run Id

 - [GET /pipelines/v0/runs/{pipeline_run_id}/stageruns/{stage_run_id}/](https://api.esper.io/openapi/pipelines_stage-runs/getpipelinerunstagerun.md)

### Update a Pipeline Stage Run

 - [PUT /pipelines/v0/runs/{pipeline_run_id}/stageruns/{stage_run_id}/](https://api.esper.io/openapi/pipelines_stage-runs/updatepipelinerunstagerun.md)

### Get all Operations for the Stage Run

 - [GET /pipelines/v0/stageruns/{stage_run_id}/operations/](https://api.esper.io/openapi/pipelines_stage-runs/getpipelinestagerunoperations.md)

### Get single Operation for the Stage Run

 - [GET /pipelines/v0/stageruns/{stage_run_id}/operations/{stage_run_operation_id}/](https://api.esper.io/openapi/pipelines_stage-runs/getpipelinestagerunoperation.md)

## Target Runs

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.


### Get all Target Runs for the Stage Run

 - [GET /pipelines/v0/stageruns/{stage_run_id}/targetruns/](https://api.esper.io/openapi/pipelines_target-runs/getpipelinestagetargetruns.md)

### Create a Target Runs for Stage Run

 - [POST /pipelines/v0/stageruns/{stage_run_id}/targetruns/](https://api.esper.io/openapi/pipelines_target-runs/createpipelinestagetargetruns.md)

### Get Target Run by Target Run ID

 - [GET /pipelines/v0/stageruns/{stage_run_id}/targetruns/{target_run_id}/](https://api.esper.io/openapi/pipelines_target-runs/getpipelinestagetargetrun.md)

### Update a Target Run

 - [PUT /pipelines/v0/stageruns/{stage_run_id}/targetruns/{target_run_id}/](https://api.esper.io/openapi/pipelines_target-runs/updatepipelinestagetargetrun.md)

### Get status of the command running for Target run

 - [GET /pipelines/v0/stageruns/{stage_run_id}/targetruns/{target_run_id}/command/](https://api.esper.io/openapi/pipelines_target-runs/gettargetruncommandstatus.md)

### Create an command processor request for Target Run

 - [POST /pipelines/v0/stageruns/{stage_run_id}/targetruns/{target_run_id}/command/](https://api.esper.io/openapi/pipelines_target-runs/createtargetruncommand.md)

### Update target run command information.

 - [PUT /pipelines/v0/stageruns/{stage_run_id}/targetruns/{target_run_id}/command/{command_id}/](https://api.esper.io/openapi/pipelines_target-runs/puttargetruncommandstatus.md)

## Device

APIs to retrieve information about the device or delete the device.

### Get all devices in the tenant

 - [GET /device/v0/devices/](https://api.esper.io/openapi/device_device/getdevicelist.md): Returns all the devices in the tenant

### Get details of a Device

 - [GET /device/v0/devices/{id}/](https://api.esper.io/openapi/device_device/getdevicerequest.md)

### Delete a device. Currently supported by iOS, Linux and Windows devices.

 - [DELETE /device/v0/devices/{id}/](https://api.esper.io/openapi/device_device/deletedevicerequest.md)

### Get details of Current Device State

 - [GET /device/v0/devices/{id}/devicestate](https://api.esper.io/openapi/device_device/getdevicestaterequest.md)

### Get all distinct foundation versions

 - [GET /v2/foundationversions](https://api.esper.io/openapi/device_device/getfoundationversionslist.md): Returns a list of distinct foundation versions present in the tenant's devices

## Device Heartbeat

APIs to retrieve information about device's heartbeat which contains the last seen details.

### Get heartbeat of a device which contains last seen information

 - [GET /device/v0/heartbeat/{id}/](https://api.esper.io/openapi/device_device-heartbeat/getdeviceheartbeat.md)

### Get list of heartbeat for all devices

 - [GET /v2/heartbeat/](https://api.esper.io/openapi/device_device-heartbeat/getdeviceheartbeatlist.md)

## Device Apps

APIs to get apps installed on iOS devices. Use [Application](https://api.esper.io/tag/Application/) to get apps for Android devices.

### Get all apps for a device in the tenant

 - [GET /v2/devices/{deviceId}/device-apps/](https://api.esper.io/openapi/device_device-apps/paths/~1v2~1devices~1%7Bdeviceid%7D~1device-apps~1/get.md): Returns all the apps for a device

### Get list of devices with an app by app_id or app_version_id.

 - [GET /v2/device-apps](https://api.esper.io/openapi/device_device-apps/paths/~1v2~1device-apps/get.md)

## Device Enrollment in EMM

APIs to enroll device with Google EMM

### Get the Google EMM Policy details for a specific device.

 - [GET /v2/devices/{deviceId}/google-accounts/policy/](https://api.esper.io/openapi/device_device-enrollment-in-emm/paths/~1v2~1devices~1%7Bdeviceid%7D~1google-accounts~1policy~1/get.md)

### Update the Google EMM Policy details for a specific device.

 - [PUT /v2/devices/{deviceId}/google-accounts/policy/](https://api.esper.io/openapi/device_device-enrollment-in-emm/paths/~1v2~1devices~1%7Bdeviceid%7D~1google-accounts~1policy~1/put.md)

### Get the List of Google EMM Managed Devices for a user's devices.

 - [GET /v2/devices/{deviceId}/google-accounts/emm-managed/](https://api.esper.io/openapi/device_device-enrollment-in-emm/paths/~1v2~1devices~1%7Bdeviceid%7D~1google-accounts~1emm-managed~1/get.md)

### Return the Google account details of the EMM enrollment stored in the database for the specified device.

 - [GET /v2/devices/{deviceId}/google-accounts/](https://api.esper.io/openapi/device_device-enrollment-in-emm/paths/~1v2~1devices~1%7Bdeviceid%7D~1google-accounts~1/get.md)

### Update the Google account details of the EMM enrollment stored in the database for a specific device.

 - [PUT /v2/devices/{deviceId}/google-accounts/](https://api.esper.io/openapi/device_device-enrollment-in-emm/paths/~1v2~1devices~1%7Bdeviceid%7D~1google-accounts~1/put.md)

### 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.

 - [POST /v2/devices/{deviceId}/google-accounts/](https://api.esper.io/openapi/device_device-enrollment-in-emm/paths/~1v2~1devices~1%7Bdeviceid%7D~1google-accounts~1/post.md)

### Unenrolls device from Google EMM and deletes the Google account details.

 - [DELETE /v2/devices/{deviceId}/google-accounts/](https://api.esper.io/openapi/device_device-enrollment-in-emm/paths/~1v2~1devices~1%7Bdeviceid%7D~1google-accounts~1/delete.md)

## Operations

APIs to get information about operations

### Get all Operations in the Tenant

 - [GET /v0/operations/](https://api.esper.io/openapi/device_operations/getoperationslist.md)

### Create a new Operation

 - [POST /v0/operations/](https://api.esper.io/openapi/device_operations/createoperation.md)

### Get specific Operation details (Operation Status)

 - [GET /v0/operations/{operationId}/](https://api.esper.io/openapi/device_operations/getoperation.md)

### Update the operation (Support status update as of now)

 - [PUT /v0/operations/{operationId}/](https://api.esper.io/openapi/device_operations/paths/~1v0~1operations~1%7Boperationid%7D~1/put.md): This API allows updating the status of a specific operation by providing the operation ID.

## DeviceOperations

APIs to get information about device operations

### Get all DeviceOperations for a specific Operation

 - [GET /v0/operations/{operationsId}/devices/](https://api.esper.io/openapi/device_deviceoperations/getdeviceoperations.md)

### Get a Operations for a device

 - [GET /v0/devices/{deviceId}/operations/](https://api.esper.io/openapi/device_deviceoperations/paths/~1v0~1devices~1%7Bdeviceid%7D~1operations~1/get.md)

### Get a specific DeviceOperations for a specific Operation (Device Operation Status)

 - [GET /v0/operations/{operationsId}/devices/{deviceId}/](https://api.esper.io/openapi/device_deviceoperations/getdeviceoperation.md)

### Update a specific DeviceOperation for a specific Operation

 - [PUT /v0/operations/{operationsId}/devices/{deviceId}/](https://api.esper.io/openapi/device_deviceoperations/updatedeviceoperation.md)

## MultiOS Remote Viewer

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.

### Get RemoteViewer Activity Feed for the tenant

 - [GET /v2/rv-activity-feed/](https://api.esper.io/openapi/device_multios-remote-viewer/paths/~1v2~1rv-activity-feed~1/get.md)

## Device V2

### Get all devices in the tenant

 - [GET /v2/devices/](https://api.esper.io/openapi/device_device-v2/paths/~1v2~1devices~1/get.md): Returns all the devices in the tenant

### Retrieve detailed device information.

 - [GET /v2/devices/{id}](https://api.esper.io/openapi/device_device-v2/paths/~1v2~1devices~1%7Bid%7D/get.md): Get device details for particular device id

## VPP License Management

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).

### Get VPP License List

 - [GET /apps/v0/vpp](https://api.esper.io/openapi/apps_management_vpp-license-management/paths/~1apps~1v0~1vpp/get.md): API to get a list of VPP licenses with the given VPP token

### Get VPP License Info about an App

 - [GET /apps/v0/vpp/{appId}](https://api.esper.io/openapi/apps_management_vpp-license-management/paths/~1apps~1v0~1vpp~1%7Bappid%7D/get.md): API to get information about the VPP license for a given app

## VPP App Management

APIs for getting information about VPP apps. Learn more about [VPP apps](https://help.esper.io/hc/en-us/articles/20518326865681-Managing-iOS-Applications).

### Get iOS App Info (v2)

 - [GET /v2/itunesapps](https://api.esper.io/openapi/apps_management_vpp-app-management/paths/~1v2~1itunesapps/get.md): API to get information about iOS apps based on their app IDs or Apple app IDs.

### Set Preferred Region for VPP App

 - [PUT /v2/itunesapps/{appleAppId}/preferred-region](https://api.esper.io/openapi/apps_management_vpp-app-management/paths/~1v2~1itunesapps~1%7Bappleappid%7D~1preferred-region/put.md): API to set the preferred App Store region for a VPP app. This region is cached and used when fetching app info from iTunes.

## Tenant Apps

API to manage Enterprise iOS apps for a tenant.

### Upload tenant app for a tenant

 - [POST /v2/tenant-apps](https://api.esper.io/openapi/apps_management_tenant-apps/paths/~1v2~1tenant-apps/post.md)

### Get tenant apps for a tenant

 - [GET /v2/tenant-apps](https://api.esper.io/openapi/apps_management_tenant-apps/paths/~1v2~1tenant-apps/get.md)

### Get tenant app by ID

 - [GET /v2/tenant-apps/{appId}](https://api.esper.io/openapi/apps_management_tenant-apps/paths/~1v2~1tenant-apps~1%7Bappid%7D/get.md)

### Get tenant app versions by app ID

 - [GET /v2/tenant-apps/{appId}/versions](https://api.esper.io/openapi/apps_management_tenant-apps/paths/~1v2~1tenant-apps~1%7Bappid%7D~1versions/get.md)

### Get tenant app version by ID

 - [GET /v2/tenant-apps/{appId}/versions/{versionId}](https://api.esper.io/openapi/apps_management_tenant-apps/paths/~1v2~1tenant-apps~1%7Bappid%7D~1versions~1%7Bversionid%7D/get.md)

### Update tenant app version by ID

 - [PUT /v2/tenant-apps/{appId}/versions/{versionId}](https://api.esper.io/openapi/apps_management_tenant-apps/paths/~1v2~1tenant-apps~1%7Bappid%7D~1versions~1%7Bversionid%7D/put.md)

### Delete tenant app version by ID

 - [DELETE /v2/tenant-apps/{appId}/versions/{versionId}](https://api.esper.io/openapi/apps_management_tenant-apps/paths/~1v2~1tenant-apps~1%7Bappid%7D~1versions~1%7Bversionid%7D/delete.md)

## Apple App Store

API to search apple app store for apps

### Search Apple App Store

 - [GET /v2/appleappstore/](https://api.esper.io/openapi/apps_management_apple-app-store/paths/~1v2~1appleappstore~1/get.md)

## App List

Unified API to query Webclips and Tenant IOS Apps

### Get unified list of iOS apps (IPAs and Webclips) for a tenant

 - [GET /v2/apps](https://api.esper.io/openapi/apps_management_app-list/paths/~1v2~1apps/get.md)

## Webclips

API to manage webclips for a tenant

### Create webclip for a tenant

 - [POST /v2/webclips](https://api.esper.io/openapi/apps_management_webclips/paths/~1v2~1webclips/post.md)

### Get webclips for a tenant

 - [GET /v2/webclips](https://api.esper.io/openapi/apps_management_webclips/paths/~1v2~1webclips/get.md)

### Get webclip by id for a tenant

 - [GET /v2/webclips/{webclipId}](https://api.esper.io/openapi/apps_management_webclips/paths/~1v2~1webclips~1%7Bwebclipid%7D/get.md)

### Delete webclip for a tenant

 - [DELETE /v2/webclips/{webclipId}](https://api.esper.io/openapi/apps_management_webclips/paths/~1v2~1webclips~1%7Bwebclipid%7D/delete.md)

## Provisioning Profiles

APIs for managing iOS provisioning profiles for app distribution

### Upload provisioning profile for a tenant

 - [POST /v2/provisioning-profiles](https://api.esper.io/openapi/apps_management_provisioning-profiles/paths/~1v2~1provisioning-profiles/post.md): API to upload and validate iOS provisioning profiles for app distribution

### Get provisioning profiles for a tenant

 - [GET /v2/provisioning-profiles](https://api.esper.io/openapi/apps_management_provisioning-profiles/paths/~1v2~1provisioning-profiles/get.md): API to retrieve a list of iOS provisioning profiles with download URLs and pagination

### Get provisioning profile by ID

 - [GET /v2/provisioning-profiles/{id}](https://api.esper.io/openapi/apps_management_provisioning-profiles/paths/~1v2~1provisioning-profiles~1%7Bid%7D/get.md): API to retrieve a specific iOS provisioning profile by its ID with download URL

### Get provisioning profile versions list

 - [GET /v2/provisioning-profiles/{id}/versions](https://api.esper.io/openapi/apps_management_provisioning-profiles/paths/~1v2~1provisioning-profiles~1%7Bid%7D~1versions/get.md): API to retrieve all versions of a specific iOS provisioning profile ordered by expiration date descending, with pagination and search capabilities

### Get provisioning profile version by ID

 - [GET /v2/provisioning-profiles/{id}/versions/{versionId}](https://api.esper.io/openapi/apps_management_provisioning-profiles/paths/~1v2~1provisioning-profiles~1%7Bid%7D~1versions~1%7Bversionid%7D/get.md): API to retrieve a specific version of an iOS provisioning profile by profile ID and version ID with download URL

### Delete provisioning profile version by ID

 - [DELETE /v2/provisioning-profiles/{id}/versions/{versionId}](https://api.esper.io/openapi/apps_management_provisioning-profiles/paths/~1v2~1provisioning-profiles~1%7Bid%7D~1versions~1%7Bversionid%7D/delete.md): API to delete a specific version of an iOS provisioning profile by profile ID and version ID. Returns the deleted version information.

## Preferred Regions

APIs for managing a tenant's preferred country/region list for App Store lookups

### Set Preferred Regions for Tenant

 - [POST /v2/preferred-regions](https://api.esper.io/openapi/apps_management_preferred-regions/paths/~1v2~1preferred-regions/post.md): API to set the preferred country/region list for a tenant. This overwrites any existing value (upsert). Country codes must be valid ISO 3166-1 alpha-2 codes (2-character uppercase).

### Get Preferred Regions for Tenant

 - [GET /v2/preferred-regions](https://api.esper.io/openapi/apps_management_preferred-regions/paths/~1v2~1preferred-regions/get.md): API to get the preferred country/region list for a tenant. Returns an empty countries array if no regions have been set.

## Esper Apps

### Get esper app version details by ID

 - [GET /v2/esper-apps/{appId}/versions/{versionId}](https://api.esper.io/openapi/apps_management_esper-apps/paths/~1v2~1esper-apps~1%7Bappid%7D~1versions~1%7Bversionid%7D/get.md)

## Tenant Esper Apps

### Get esper apps for a tenant

 - [GET /v2/tenant-esper-apps](https://api.esper.io/openapi/apps_management_tenant-esper-apps/paths/~1v2~1tenant-esper-apps/get.md)

## Command Request

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.

### List command requests

 - [GET /commands/v0/commands/](https://api.esper.io/openapi/commands_command-request/listcommandrequests.md): API to get and filter command requests

### Create a command request

 - [POST /commands/v0/commands/](https://api.esper.io/openapi/commands_command-request/createcommandrequest.md): API to create a command request for a set of devices or groups. Works for mixed-fleet devices (Android, iOS, etc.) if the command is supported.

You can send the command immediately or schedule command for supported devices.

Scheduled commands are currently compatible with Android devices.

### Get a command request

 - [GET /commands/v0/commands/{id}/](https://api.esper.io/openapi/commands_command-request/getcommandrequest.md): API to get a command request

### Get stats of a command request

 - [GET /commands/v0/commands/{id}/stats/](https://api.esper.io/openapi/commands_command-request/getcommandrequeststats.md): API to get a aggregrated status for a command request

## Command Status

APIs to view, filter, and manage command requests.

### Get status list for command request

 - [GET /commands/v0/status/](https://api.esper.io/openapi/commands_command-status/getcommandrequeststatuses.md): API to get and filter command request status

### Get a command status

 - [GET /commands/v0/status/{id}/](https://api.esper.io/openapi/commands_command-status/getcommandstatus.md): API to get a command status

### Update command status

 - [PUT /commands/v0/status/{id}/](https://api.esper.io/openapi/commands_command-status/updatecommandstatus.md): API to update a command status state

### Get queued commands to be executed by the physical device.

 - [GET /v2/command-inbox/](https://api.esper.io/openapi/commands_command-status/getcommandinbox.md): API to get queued commands for a device

## Converge

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).

### List converge action

 - [GET /v2/converge](https://api.esper.io/openapi/drift_converge/listconverges.md): API to get and filter converge action

### Create a converge action

 - [POST /v2/converge](https://api.esper.io/openapi/drift_converge/createconverge.md): API to create a converge action for a device.

### Get converge action

 - [GET /v2/converge/{id}](https://api.esper.io/openapi/drift_converge/getconverge.md): API to get a converge action

## Converge Command

API for converge command

### List commands fires for converge action

 - [GET /v2/converge/{id}/commands](https://api.esper.io/openapi/drift_converge-command/listconvergecommands.md): API to get and filter commands fired for converge action

## DEP Sync Request

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.

### List all DEP sync requests for the tenant

 - [GET /onboarding/v0/depsyncs/](https://api.esper.io/openapi/device_onboarding_dep-sync-request/listdepsyncrequest.md): Returns all the DEP sync requests for the tenant

### Create a DEP sync request

 - [POST /onboarding/v0/depsyncs/](https://api.esper.io/openapi/device_onboarding_dep-sync-request/createdepsyncrequest.md): API to create a DEP sync request.

### Get a DEP sync request

 - [GET /onboarding/v0/depsyncs/{id}/](https://api.esper.io/openapi/device_onboarding_dep-sync-request/getdepsyncrequest.md): API to get a DEP sync request

## ABM Provisioning

APIs to perform ABM provisioning. Learn more about [ABM provisioning](https://help.esper.io/hc/en-us/articles/20361103311761-Setting-Up-Apple-MDM-Management)

### Create a ABM provisioning request by uploading file

 - [POST /v2/seamless/upload](https://api.esper.io/openapi/device_onboarding_abm-provisioning/paths/~1v2~1seamless~1upload/post.md)

### Create a ABM provisioning request using device serial number

 - [POST /v2/seamless](https://api.esper.io/openapi/device_onboarding_abm-provisioning/paths/~1v2~1seamless/post.md)

## APNs certificate

APIs for managing APNS certificates. Learn more about [APNS certificates](https://help.esper.io/hc/en-us/articles/20361103311761-Setting-Up-Apple-MDM-Management)

### Get all APNs certificate meta data for the Tenant

 - [GET /tenant/v0/apnscertificates/](https://api.esper.io/openapi/tenant_apns-certificate/listapnscerts.md): Returns all the APNs certificate meta information

### Get the CSR file to upload to the apple identity console

 - [POST /tenant/v0/apnscertificates/](https://api.esper.io/openapi/tenant_apns-certificate/getapnscsr.md)

### Get APNs certificate meta information

 - [GET /tenant/v0/apnscertificates/{id}/](https://api.esper.io/openapi/tenant_apns-certificate/getapnscert.md)

### Upload APNs certificate

 - [PUT /tenant/v0/apnscertificates/{id}/](https://api.esper.io/openapi/tenant_apns-certificate/uploadapnscert.md): Upload the signed APNs certificate obtained from the apple identity console.

### Delete a APNs certificate

 - [DELETE /tenant/v0/apnscertificates/{id}/](https://api.esper.io/openapi/tenant_apns-certificate/deleteapnscert.md)

## DEP Profile

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)

### Get all DEP profiles for the tenant

 - [GET /tenant/v0/depprofiles/](https://api.esper.io/openapi/tenant_dep-profile/getdepprofilelist.md): Returns all the DEP profile for the tenant

### Create a DEP profile

 - [POST /tenant/v0/depprofiles/](https://api.esper.io/openapi/tenant_dep-profile/createdepprofile.md): Creates a DEP profile

## DEP Tokens

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)

### Generate the public key file

 - [POST /tenant/v0/deptokens/](https://api.esper.io/openapi/tenant_dep-tokens/deptoken.md): Generate the public key file which is uploaded to Apple Business Manager(ABM) console to generate the DEP token.

### Get all DEP tokens

 - [GET /tenant/v0/deptokens/](https://api.esper.io/openapi/tenant_dep-tokens/listdeptokens.md): Get the list of all DEP tokens available in the tenant

### Get dep token by id

 - [GET /tenant/v0/deptokens/{id}/](https://api.esper.io/openapi/tenant_dep-tokens/deptokenbasedonid.md): Retrive information of a DEP token by ID

### Upload dep token to a tenant

 - [PUT /tenant/v0/deptokens/{id}/](https://api.esper.io/openapi/tenant_dep-tokens/deptokenupload.md): Upload dep token for a public key for a tenant based on ID of DEP public key

## VPP Token Management

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).

### Get all VPP tokens for the tenant

 - [GET /tenant/v0/vpptokens/](https://api.esper.io/openapi/tenant_vpp-token-management/paths/~1tenant~1v0~1vpptokens~1/get.md): Returns all the VPP tokens for the tenant

### Store a VPP token

 - [POST /tenant/v0/vpptokens/](https://api.esper.io/openapi/tenant_vpp-token-management/paths/~1tenant~1v0~1vpptokens~1/post.md): Uploads a VPP token

### Delete VPP Token

 - [DELETE /tenant/v0/vpptokens/{id}](https://api.esper.io/openapi/tenant_vpp-token-management/paths/~1tenant~1v0~1vpptokens~1%7Bid%7D/delete.md): API to delete vpp token for a tenant

## Google Enterprise

APIs to enroll the enterprise in Google EMM.

### Generate sign-up URL

 - [POST /v2/emm/enrollment/begin/](https://api.esper.io/openapi/tenant_google-enterprise/paths/~1v2~1emm~1enrollment~1begin~1/post.md)

### Return the enrollment status of the Enterprise

 - [GET /v2/emm/details/](https://api.esper.io/openapi/tenant_google-enterprise/paths/~1v2~1emm~1details~1/get.md)

### Creates a new Google Enterprise with the provided details

 - [POST /v2/emm/details/](https://api.esper.io/openapi/tenant_google-enterprise/paths/~1v2~1emm~1details~1/post.md)

### Create a Google Web Token

 - [POST /v2/emm/web-token/](https://api.esper.io/openapi/tenant_google-enterprise/paths/~1v2~1emm~1web-token~1/post.md)

### Complete EMM enrollment for a Google Enterprise

 - [POST /v2/emm/enrollment/complete/](https://api.esper.io/openapi/tenant_google-enterprise/paths/~1v2~1emm~1enrollment~1complete~1/post.md)

### Return the Google Service Account of the Enterprise

 - [GET /v2/emm/accounts/](https://api.esper.io/openapi/tenant_google-enterprise/paths/~1v2~1emm~1accounts~1/get.md)

### Creates a new Google Service Account with the provided details

 - [POST /v2/emm/accounts/](https://api.esper.io/openapi/tenant_google-enterprise/paths/~1v2~1emm~1accounts~1/post.md)

## FoundryBuilds

### Get Foundry builds

 - [GET /v1/foundry/builds/](https://api.esper.io/openapi/foundation_foundrybuilds/getfoundrybuilds.md): Returns a list of all specified builds.

### Get Foundry Build

 - [GET /v1/foundry/builds/{build_id}/](https://api.esper.io/openapi/foundation_foundrybuilds/paths/~1v1~1foundry~1builds~1%7Bbuild_id%7D~1/get.md): Get a Foundry Build by unique ID

### Update Foundry build

 - [PUT /v1/foundry/builds/{build_id}/](https://api.esper.io/openapi/foundation_foundrybuilds/updatefoundrybuild.md): Update a Foundry build based on given parameters

## FoundryDeviceModels

### Get device models

 - [GET /v1/foundry/device-models/](https://api.esper.io/openapi/foundation_foundrydevicemodels/paths/~1v1~1foundry~1device-models~1/get.md): Get a list of device models

### Update Tenant Device Model

 - [PUT /v1/foundry/device-models/{device_model_id}/](https://api.esper.io/openapi/foundation_foundrydevicemodels/paths/~1v1~1foundry~1device-models~1%7Bdevice_model_id%7D~1/put.md): Update a Tenant Device Model based on given parameters

## FoundryEvents

### Get Foundry events

 - [GET /v1/foundry/events/](https://api.esper.io/openapi/foundation_foundryevents/paths/~1v1~1foundry~1events~1/get.md): Get a list of Foundry events

## Reports API

APIs for managing reports.<br /> Currently supports [App Reports](https://help.esper.io/hc/en-us/articles/27379366650257-App-Reports).

### Get report types

 - [GET /report/v0/report-types](https://api.esper.io/openapi/reports_reports-api/getreporttypes.md): Get report types

### Create Report

 - [POST /report/v0/reports](https://api.esper.io/openapi/reports_reports-api/createreportstatus.md): This API will return a report ID. Use this ID to call the "Get Report Status" API to check the report generation status and retrieve the results. Learn more.

### Get report status

 - [GET /report/v0/reports/{report_id}](https://api.esper.io/openapi/reports_reports-api/getreportstatus.md): Call this API with report ID generated from "Create Report" API to check the report generation status and retrieve the results. Learn more.

## Geofences

### Create a new geofence

 - [POST /geofence/v1/geofences](https://api.esper.io/openapi/geofence_geofences/geofence_creategeofence.md): Creates a new geofence with the specified geometry and actions

### List all geofences

 - [GET /geofence/v1/geofences](https://api.esper.io/openapi/geofence_geofences/geofence_listgeofences.md): 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.

## Device State

### Get device summary for a geofence

 - [GET /geofence/v1/geofences/{geofence_id}/device-summary](https://api.esper.io/openapi/geofence_device-state/geofence_getdevicesummary.md): Returns aggregate statistics about devices in relation to a specific geofence (total devices, inside count, outside count)

### Get blueprint usage statistics for a geofence

 - [GET /geofence/v1/geofences/{geofence_id}/blueprints](https://api.esper.io/openapi/geofence_device-state/geofence_getblueprintusage.md): Returns paginated statistics about blueprint usage within a specific geofence (which blueprints are used and device counts)

### Get devices for a geofence

 - [GET /geofence/v1/geofences/{geofence_id}/devices](https://api.esper.io/openapi/geofence_device-state/geofence_getdevices.md): Returns a paginated list of devices and their states within a specific geofence. Supports filtering by inside/outside status and blueprint version ID.

