Every API here is available over the APIs.io API and to AI agents over MCP.
MCP server
One button, every client — Claude, Cursor, VS Code and the rest.
https://apis.io/mcp
Tools for apis
7 MCP tools reach this
find_apisBrowse and filter every API in the catalog.
get_api_artifactsOne API's artifacts, grouped by type.
get_openapiThe primary OpenAPI for this API.
find_similar_apisAPIs that look like this one.
apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
resolveTurn a domain, URL or GitHub org into the provider it belongs to.
find_cohortsEvery scored population of providers in the catalog.
All 92 tools →
Call it yourself
curl for this page
This API
curl "https://apis.io/api/v1/apis/esper:esper-device-onboarding-dep-sync-request-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"
Discovery needs no key. Ratings and market analysis are Pro.
Get an API key
Free tier, no form to fill in. Signing in shares your email address with us — we
store it to create your key and to recognise you if you sign in with another
provider. See our Privacy Policy and
Terms.
A second provider on the same verified email joins the account you already have.
openapi: 3.2.0
info:
title: ESPER API REFERENCE device_onboarding_DEP Sync Request API
x-logo:
url: esper-logo-white.svg
backgroundColor: '#141418'
altText: Logo
description: '# Introduction
Welcome to Esper’s API documentation. The Esper API allows users to accomplish operations outside of the console. Some common uses for our APIs include observing device information and console activity, installing and updating apps, uploading files, and sending files to devices. Our users have also used the API to automate app updates, perform bulk actions, and more. Esper API endpoints use REST-based architecture and return JSON responses. See our documentation for:
* Getting started guides
* Commonly used API examples
* API command examples
* Automated Script examples
* And more
# 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. # Lifecycle Labels
Esper uses lifecycle labels to communicate the support status of each API endpoint. Use the following table to understand what each label means and how to respond. Badge
What it means
Recommended action
Stable
This endpoint is fully supported and safe for production use. No action needed. Beta
This endpoint is publicly available but may change. It is not recommended for production integrations. Use with caution. Monitor the API changelog for updates before relying on this endpoint. Legacy
This endpoint uses an older architecture and is still supported, but a newer equivalent exists. It is not recommended for new integrations. Plan migration to the recommended replacement when possible. See the endpoint description for the alternative. Deprecated
This endpoint has stopped being supported. A removal date may be added at a later time. A replacement is available or the feature is entirely retired. Migrate before the removal date listed in the endpoint description. Do not use this endpoint in new integrations. # 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. Parameter
Data Type
Explanation
limit
integer
Limit the data returned. Default = 20. offset
integer
Offset to the first item returned. Default = 0. ordering
string
Order the results set by the field name. Varies by endpoint. next
string
Paginate to the next response set. previous
string
Paginate to the last set response. # 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:
Number
Message
Explanation
200
OK
The request succeeded. 201
Resource creation
A resource was created. 401
Unauthorized
The API key is invalid. 404
Not found
The resource was not found. 429
Rate limit exceeded
Too many requests. Wait a moment and try again. 500
Server error
Internal error. Wait a moment and try again. If the issue persists, contact Esper. See how our systems are doing by checking our status page. # 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.'
termsOfService: https://esper.io/terms-of-service
contact:
email: developer@esper.io
license:
name: Apache 2.0
url: http://www.apache.org/licenses/LICENSE-2.0.html
version: 1.0.0
x-prefix-tag: esper cloud api
servers:
- url: https://{foo}-api.esper.cloud/api
variables:
foo:
default: develop
description: Custom end point
tags:
- name: device_onboarding_DEP Sync Request
description: APIs to create and access DEP sync request information. Use DEP sync to sync the information from your Apple Business Manager account to the Esper console.
x-displayName: DEP Sync Request
paths:
/onboarding/v0/depsyncs/:
get:
summary: List all DEP sync requests for the tenant
description: '⚠️ Apple devices only. DEP (Device Enrollment Program) is an Apple provisioning technology, now part of Apple Business Manager.
Retrieves a paginated list of all DEP sync requests for the tenant, including each request''s status and any device-level failure details.
**About List DEP Sync Requests**
Apple''s Device Enrollment Program (DEP), accessed through Apple Business Manager, assigns managed devices to an MDM server. A DEP sync request triggers Esper to pull the latest device assignments from Apple''s DEP service, ensuring that newly enrolled or reassigned Apple devices are reflected in the tenant. Each DEPSyncRequestForGetResponse record includes the request''s lifecycle status (QUEUED, INPROGRESS, COMPLETE, SUCCESS, or FAILURE), the user or service that created the request (created_by), and the timestamps for when the request was created and last updated. On failure, a failure_reason and a devices object may contain details about specific devices that failed to sync. Use POST /api/onboarding/v0/depsyncs/ to trigger a new sync, and GET /api/onboarding/v0/depsyncs/{id}/ to retrieve a specific request.
**Key Response Fields**
id — DEP sync request UUID
status — QUEUED, INPROGRESS, COMPLETE, SUCCESS, or FAILURE
failure_reason — High-level reason for sync failure (present on FAILURE status)
devices.failure — Array of {serial, reason} objects for devices that failed to process
created_by — User who triggered the sync
created_at / updated_at — Timestamps
**Common Use Cases**
Reviewing the history of DEP sync operations to confirm when devices were last successfully synced from Apple
Identifying which specific devices failed in a DEP sync and why
Auditing DEP sync activity for compliance or onboarding reporting
**Best Practices**
On FAILURE status, inspect both failure_reason for the overall cause and devices.failure for per-device detail — they may differ
Paginate with limit and offset for tenants with a long sync history'
operationId: listDEPSyncRequest
x-badges:
- name: Stable
color: green
tags:
- device_onboarding_DEP Sync Request
security:
- device_onboarding_apiKey: []
responses:
'200':
description: DEP sync request list for the Tenant
content:
application/json:
schema:
type: object
properties:
code:
type: integer
message:
type: string
content:
type: object
properties:
count:
type: integer
previous:
type: string
next:
type: string
results:
type: array
items:
$ref: '#/components/schemas/device_onboarding_DEPSyncRequestForGetResponse'
'401':
description: Authorization information is missing or invalid.
content:
application/json:
schema:
$ref: '#/components/schemas/device_onboarding_Error_401_Unauthorized'
'500':
description: Internal server error
content:
application/json:
schema:
$ref: '#/components/schemas/device_onboarding_Error_500_Internal_Server_Error'
post:
summary: Create a DEP sync request
description: '⚠️ Apple devices only. DEP (Device Enrollment Program) is an Apple provisioning technology, now part of Apple Business Manager.
Triggers a new DEP sync request, instructing Esper to pull the latest device assignments from Apple''s DEP service for the tenant.
About Create DEP Sync Request
This endpoint initiates a DEP sync — the process by which Esper fetches the current set of Apple-assigned devices from Apple Business Manager and updates the tenant''s device enrollment records accordingly. The request body is an empty JSON object; no parameters are required. The sync runs asynchronously: the 200 response returns a DEPSyncRequest record with a QUEUED or initial status, and the sync progresses through INPROGRESS to COMPLETE, SUCCESS, or FAILURE. Poll GET /api/onboarding/v0/depsyncs/{id}/ to track progress, or use GET /api/onboarding/v0/depsyncs/ to review status across all sync requests.
**Key Fields**
Request body — Empty JSON object ({})
id (response) — UUID of the newly created DEP sync request
status (response) — Initial status: QUEUED or INPROGRESS
created_by / created_at — Audit fields
**Common Use Cases**
Triggering a DEP sync after adding new devices to Apple Business Manager to make them available in Esper
Forcing a refresh of device enrollment assignments following an ABM organizational change
Programmatically scheduling regular DEP syncs as part of a device onboarding pipeline
**Best Practices**
Avoid triggering DEP syncs in rapid succession — syncs run asynchronously and queuing multiple requests simultaneously is unlikely to produce faster results
After triggering, poll GET /api/onboarding/v0/depsyncs/{id}/ using the returned id to track the sync to completion before taking dependent actions
For GET responses with full failure detail (including per-device failure reasons), use GET /api/onboarding/v0/depsyncs/{id}/ — the POST response uses the lighter DEPSyncRequest schema without device-level failure data
**Workflow**
Trigger the sync with an empty JSON POST body
Capture the returned id
Poll GET /api/onboarding/v0/depsyncs/{id}/ until status reaches SUCCESS, COMPLETE, or FAILURE'
operationId: createDEPSyncRequest
x-badges:
- name: Stable
color: green
tags:
- device_onboarding_DEP Sync Request
security:
- device_onboarding_apiKey: []
requestBody:
required: true
content:
application/json:
schema:
type: object
responses:
'200':
description: DEP sync request successfully created.
content:
application/json:
schema:
type: object
properties:
code:
type: integer
message:
type: string
content:
$ref: '#/components/schemas/device_onboarding_DEPSyncRequest'
'400':
description: Bad request
content:
application/json:
schema:
$ref: '#/components/schemas/device_onboarding_Error_400_Bad_Data'
'401':
description: Authorization information is missing or invalid.
content:
application/json:
schema:
$ref: '#/components/schemas/device_onboarding_Error_401_Unauthorized'
'500':
description: Internal server error
content:
application/json:
schema:
$ref: '#/components/schemas/device_onboarding_Error_500_Internal_Server_Error'
/onboarding/v0/depsyncs/{id}/:
get:
summary: Get a DEP sync request
description: '⚠️ Apple devices only. DEP (Device Enrollment Program) is an Apple provisioning technology, now part of Apple Business Manager.
Retrieves the current status and full detail of a specific DEP sync request by its UUID, including per-device failure information if the sync encountered errors.
**About Get DEP Sync Request**
This is the detail and polling endpoint for a single DEP sync request. It returns a DEPSyncRequestForGetResponse — the richer schema compared to the POST response — which includes the failure_reason field and the devices.failure array listing individual device serials and their specific failure reasons when the sync status is FAILURE. Use this endpoint to determine when a sync has completed and to diagnose any device-level issues that occurred during the sync. The status field progresses from QUEUED through INPROGRESS to a terminal state: COMPLETE, SUCCESS, or FAILURE.
**Key Fields**
id (path) — DEP sync request UUID (required)
status — QUEUED, INPROGRESS, COMPLETE, SUCCESS, or FAILURE
failure_reason — Overall failure description (present when status is FAILURE)
devices.failure — Array of {serial, reason} objects for each device that failed to process (present when failure_reason is included)
created_by — User who triggered the sync
created_at / updated_at — Timestamps
**Common Use Cases**
Polling a DEP sync to completion after triggering it with POST /api/onboarding/v0/depsyncs/
Retrieving per-device failure detail when a sync reaches FAILURE status
Confirming the exact completion time of a sync for audit or pipeline sequencing purposes
**Best Practices**
Poll at a reasonable interval (e.g., every 30 seconds) — DEP syncs are Apple-dependent and duration varies with device count and Apple service response time
When status is FAILURE, always check both failure_reason (overall) and devices.failure (per-device) — a sync may fail for an overall reason, for per-device reasons, or both
Use updated_at as the authoritative timestamp for when the sync reached its terminal state'
operationId: getDEPSyncRequest
x-badges:
- name: Stable
color: green
tags:
- device_onboarding_DEP Sync Request
security:
- device_onboarding_apiKey: []
parameters:
- name: id
in: path
description: ID of the DEP sync request object
required: true
schema:
type: string
responses:
'200':
description: DEP sync request information
content:
application/json:
schema:
type: object
properties:
code:
type: integer
message:
type: string
content:
$ref: '#/components/schemas/device_onboarding_DEPSyncRequestForGetResponse'
'401':
description: Authorization information is missing or invalid.
content:
application/json:
schema:
$ref: '#/components/schemas/device_onboarding_Error_401_Unauthorized'
'404':
description: Not Found.
content:
application/json:
schema:
$ref: '#/components/schemas/device_onboarding_Error_404_Not_Found'
'500':
description: Internal server error
content:
application/json:
schema:
$ref: '#/components/schemas/device_onboarding_Error_500_Internal_Server_Error'
components:
schemas:
device_onboarding_DEPSyncDeviceStatus:
type: object
properties:
serial:
type: string
reason:
type: string
device_onboarding_Error_400_Bad_Data:
type: object
properties:
code:
type: integer
format: int32
default: 400
message:
type: string
content:
type: object
required:
- code
- message
device_onboarding_Error_500_Internal_Server_Error:
type: object
properties:
code:
type: integer
format: int32
default: 500
message:
type: string
content:
type: object
required:
- code
- message
device_onboarding_Error_404_Not_Found:
type: object
properties:
code:
type: integer
format: int32
default: 404
message:
type: string
content:
type: object
required:
- code
- message
device_onboarding_DEPSyncRequestForGetResponse:
type: object
properties:
id:
type: string
description: Unique DEP sync request identifier
format: uuid
readOnly: true
status:
type: string
description: Status of the DEP sync request
enum:
- QUEUED
- INPROGRESS
- COMPLETE
- FAILURE
- SUCCESS
failure_reason:
type: string
description: Reason for DEP Sync failure. If this field is included in the response, a list of devices with which failed to process DEP sync will also be returned in the API response.
devices:
type: object
properties:
failure:
type: array
items:
$ref: '#/components/schemas/device_onboarding_DEPSyncDeviceStatus'
created_by:
type: string
description: user id of the user
created_at:
type: string
format: date-time
updated_at:
type: string
format: date-time
device_onboarding_Error_401_Unauthorized:
type: object
properties:
code:
type: integer
format: int32
default: 401
message:
type: string
content:
type: object
required:
- code
- message
device_onboarding_DEPSyncRequest:
type: object
properties:
id:
type: string
description: Unique DEP sync request identifier
format: uuid
readOnly: true
status:
type: string
description: Status of the DEP sync request
enum:
- QUEUED
- INPROGRESS
- COMPLETE
- FAILURE
- SUCCESS
created_by:
type: string
description: user id of the user
created_at:
type: string
format: date-time
updated_at:
type: string
format: date-time
securitySchemes:
esper_cloud_api_apiKey:
type: http
scheme: bearer
description: "#### API KEY - Access Token\nAccess 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.\nOnce you have the access token, you need to send an authorization header as below\n\n```bash\n\n curl -X GET \\\n https://<domain>-api.esper.cloud/api/enterprise/<enterprise_id>/device/ \\\n -H 'Authorization: Bearer <ACCESS_TOKEN>' \\\n -H 'Content-Type: application/json' \\\n```\n\n> Please note the use of keyword **Bearer** before the token value.\n\n\nYou can read more about api key authentication [here](https://help.esper.io/hc/en-us/articles/12656959508497).\n"
pipelines_SCAPIAuthToken:
type: http
scheme: bearer
device_apiKey:
type: http
scheme: bearer
description: "#### API KEY - Access Token\nAccess 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.\nOnce you have the access token, you need to send an authorization header as below\n\n```bash\n\n curl -X GET \\\n https://<domain>-api.esper.cloud/api/enterprise/<enterprise_id>/device/ \\\n -H 'Authorization: Bearer <ACCESS_TOKEN>' \\\n -H 'Content-Type: application/json' \\\n```\n\n> Please note the use of keyword **Bearer** before the token value.\n\n\nYou can read more about api key authentication [here](https://help.esper.io/hc/en-us/articles/12656959508497).\n"
apps_management_apiKey:
type: http
scheme: bearer
description: "#### API KEY - Access Token\nAccess 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.\nOnce you have the access token, you need to send an authorization header as below\n\n```bash\n\n curl -X GET \\\n https://<domain>-api.esper.cloud/api/enterprise/<enterprise_id>/device/ \\\n -H 'Authorization: Bearer <ACCESS_TOKEN>' \\\n -H 'Content-Type: application/json' \\\n```\n\n> Please note the use of keyword **Bearer** before the token value.\n\n\nYou can read more about api key authentication [here](https://help.esper.io/hc/en-us/articles/12656959508497).\n"
commands_apiKey:
type: http
scheme: bearer
description: "#### API KEY - Access Token\nAccess 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.\nOnce you have the access token, you need to send an authorization header as below\n\n```bash\n\n curl -X GET \\\n https://<domain>-api.esper.cloud/api/enterprise/<enterprise_id>/device/ \\\n -H 'Authorization: Bearer <ACCESS_TOKEN>' \\\n -H 'Content-Type: application/json' \\\n```\n\n> Please note the use of keyword **Bearer** before the token value.\n\n\nYou can read more about api key authentication [here](https://help.esper.io/hc/en-us/articles/12656959508497).\n"
drift_apiKey:
type: http
scheme: bearer
description: "#### API KEY - Access Token\nAccess 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.\nOnce you have the access token, you need to send an authorization header as below\n\n```bash\n\n curl -X GET \\\n https://<domain>-api.esper.cloud/api/enterprise/<enterprise_id>/device/ \\\n -H 'Authorization: Bearer <ACCESS_TOKEN>' \\\n -H 'Content-Type: application/json' \\\n```\n\n> Please note the use of keyword **Bearer** before the token value.\n\n\nYou can read more about api key authentication [here](https://help.esper.io/hc/en-us/articles/12656959508497).\n"
device_onboarding_apiKey:
type: http
scheme: bearer
description: "#### API KEY - Access Token\nAccess 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.\nOnce you have the access token, you need to send an authorization header as below\n\n```bash\n\n curl -X GET \\\n https://<domain>-api.esper.cloud/api/enterprise/<enterprise_id>/device/ \\\n -H 'Authorization: Bearer <ACCESS_TOKEN>' \\\n -H 'Content-Type: application/json' \\\n```\n\n> Please note the use of keyword **Bearer** before the token value.\n\n\nYou can read more about api key authentication [here](https://help.esper.io/hc/en-us/articles/12656959508497).\n"
tenant_apiKey:
type: http
scheme: bearer
description: "#### API KEY - Access Token\nAccess 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.\nOnce you have the access token, you need to send an authorization header as below\n\n```bash\n\n curl -X GET \\\n https://<domain>-api.esper.cloud/api/enterprise/<enterprise_id>/device/ \\\n -H 'Authorization: Bearer <ACCESS_TOKEN>' \\\n -H 'Content-Type: application/json' \\\n```\n\n> Please note the use of keyword **Bearer** before the token value.\n\n\nYou can read more about api key authentication [here](https://help.esper.io/hc/en-us/articles/12656959508497).\n"
foundation_AuthToken:
type: apiKey
in: header
name: Authorization
reports_bearerAuth:
type: http
scheme: bearer
geofence_bearerAuth:
type: http
scheme: bearer
bearerFormat: JWT
x-tagGroups:
- name: ESPER CLOUD API
tags:
- esper_cloud_api_Company Settings
- esper_cloud_api_Application
- esper_cloud_api_Application V1
- esper_cloud_api_AndroidDevice
- esper_cloud_api_Device Group
- esper_cloud_api_Token (Deprecated)
- esper_cloud_api_Commands V2
- esper_cloud_api_Enterprise Policy
- esper_cloud_api_Geofence
- esper_cloud_api_Content
- esper_cloud_api_User (Deprecated)
- esper_cloud_api_User
- esper_cloud_api_Blueprint (Deprecated)
- esper_cloud_api_Directory Record
- esper_cloud_api_Tile Icon
- esper_cloud_api_Alerts
- esper_cloud_api_Alarms
- esper_cloud_api_Wallpapers
- esper_cloud_api_Device Telemetry
- esper_cloud_api_Daily and Custom Reports
- esper_cloud_api_SSO Connections
- esper_cloud_api_Roles
- esper_cloud_api_Personal Access Token
- name: BLUEPRINTS
tags:
- blueprints_Blueprints API
- blueprints_Custom Actions API
- blueprints_Background Scripts API
- name: PIPELINES
tags:
- pipelines_System Status Code
- pipelines_System
- pipelines_Pipelines
- pipelines_Stages
- pipelines_Target Lists
- pipelines_Targets
- pipelines_Device Groups
- pipelines_Operation Lists
- pipelines_Operations
- pipelines_Pipeline Runs
- pipelines_Stage Runs
- pipelines_Target Runs
- name: DEVICE
tags:
- device_Device
- device_Device Heartbeat
- device_Device Apps
- device_Device Enrollment in EMM
- device_Operations
- device_DeviceOperations
- device_MultiOS Remote Viewer
- name: APPS MANAGEMENT
tags:
- apps_management_VPP License Management
- apps_management_VPP App Management
- apps_management_Tenant Apps
- apps_management_Apple App Store
- apps_management_App List
- apps_management_Webclips
- apps_management_Provisioning Profiles
- apps_management_Preferred Regions
- apps_management_OEM Config Schema
- apps_management_Esper Apps
- apps_management_Tenant Esper Apps
- name: COMMANDS
tags:
- commands_Command Request
- commands_Command Status
- name: DRIFT
tags:
- drift_Converge
- drift_Converge Command
- drift_Blueprint Drift
- name: DEVICE ONBOARDING
tags:
- device_onboarding_DEP Sync Request
- device_onboarding_ABM Provisioning
- name: TENANT
tags:
- tenant_APNs certificate
- tenant_DEP Profile
- tenant_DEP Tokens
- tenant_VPP Token Management
- tenant_Google Enterprise
- tenant_MDM Service Config
- name: FOUNDATION
tags:
- foundation_FoundryBuilds
- foundation_FoundryDeviceModels
- foundation_FoundryEvents
- name: REPORTS
tags:
- reports_Reports API
- name: GEOFENCE
tags:
- geofence_Geofences
- geofence_Device State
x-provenance:
method: harvested
publisher: Esper
source: https://api.esper.io/_bundle/openapi.json?download
note: split by refine-openapis from the provider's own published document, verified by fetch (openapi/_original/*.fetch.json);
stamped by stamp-openapi-provenance.py (roadmap#793)