---
title: "Install app"
method: POST
path: "/devices/{deviceId}/apps"
tags: ["Tools/Apps"]
---

# Install app

`POST /devices/{deviceId}/apps`

Requests an app install on the device. The request body must supply exactly one of an Android packageName or an iOS bundleId; protected packages are rejected. background (default false) selects the response contract: false installs inline and returns the outcome directly (200 on success, an error status on failure); true accepts the request and runs the download + install in the background, returning 202 immediately — poll list-app-installs for the backend's view of that attempt's status. Refuses with 409 once 2 other installs are already running on the device, in either mode; a repeat request for an app that already has an install running is also refused with 409 rather than superseding it — retry once that attempt reaches a terminal state.

## Path parameters

- `deviceId` string, required

## Headers

- `X-Device-Display-ID` integer

## Request body

- union
  - object
    - `background` boolean — true: return 202 immediately and install in the background (poll list-app-installs). false/omitted: install inline and return the outcome directly (200 on success, an error status on failure).
    - `bundleId` string, required — iOS bundle identifier (e.g. com.example.app)
    - `packageName` string — Android package name (e.g. com.example.app)
  - object
    - `background` boolean — true: return 202 immediately and install in the background (poll list-app-installs). false/omitted: install inline and return the outcome directly (200 on success, an error status on failure).
    - `packageName` string, required — Android package name (e.g. com.example.app)
    - `bundleId` string — iOS bundle identifier (e.g. com.example.app)

## Response `200`

Install finished synchronously (background omitted or false).

## Other responses

- `202` — Accepted

## Changes

- **2026-08-13** `02da4f9ce3fd` — 2 breaking, 4 info
  - removed `subschema #1, subschema #2` from the request body `oneOf` list
  - removed the success response with the status `204`
  - added the new optional request property `background`
  - added `subschema #1, subschema #2` to the request body `oneOf` list
  - …2 more
- **2026-08-01** `cd80ab1b29b0` — 1 info
  - endpoint added
- **2026-08-01** `3183ec3153d1` — 1 breaking
  - api path removed without deprecation
- **2026-07-07** `d5d1e5ee8188` — 2 info
  - api tag `Tools/Apps` added
  - api tag `Tools` removed
- **2026-06-29** `3cb3612f45e0` — 1 info
  - endpoint added

[Full history](https://skmtc.dev/droidrun/apis/droidrun-cloud/changes/devices/:deviceId/apps/post.md)

---

[API](https://skmtc.dev/droidrun/apis/droidrun-cloud.md) · [All operations](https://skmtc.dev/droidrun/apis/droidrun-cloud/llms.txt) · [OpenAPI document](https://skmtc-service-production.skmtc.workers.dev/v1/apis/droidrun/droidrun-cloud/revisions/a1453ac769d4/schema)
