---
title: List Device Apps
slug: devicepark/sdk-documentation/devices/list-device-apps
description: List and filter applications installed on a device by serial number.
docTags: 
createdAt: 2026-08-14T08:06:28.770Z
---

Use this operation to list applications installed on a device visible to the authenticated client.

:::hint{type="info"}
The Device Apps operation is available in the Node.js and .NET SDKs. The Java SDK does not yet expose a corresponding method or model.
:::

## SDK Method

| Java          | Node.js                                         | .NET                                               | Returns              |
| ------------- | ----------------------------------------------- | -------------------------------------------------- | -------------------- |
| Not available | `await client.devices().apps(serial, request?)` | `await client.Devices.AppsAsync(serial, request?)` | `PageDto<DeviceApp>` |

The SDK calls `GET /management/api/v1/public/devices/{serial}/apps`. `serial` is required and URL-encoded by the SDK. The request has no body, and authentication is handled by the SDK client.

## Request Fields

The optional `ListDeviceAppsRequest` controls pagination, sorting and filtering.

| Builder method                      | Type                       | Default | Description                                      |
| ----------------------------------- | -------------------------- | ------- | ------------------------------------------------ |
| `.page(value)`                      | integer                    | `0`     | Zero-based page index                            |
| `.size(value)`                      | integer                    | `20`    | Maximum applications requested                   |
| `.sortBy(value)`                    | string                     | `ID`    | Server-side sort field                           |
| `.direction(value)`                 | `SortDirection`            | `DESC`  | `ASC` or `DESC`                                  |
| `.filters(rules)`                   | `DeviceAppFilterRequest[]` | Empty   | Replaces the complete filter list                |
| `.addFilter(key, value, operation)` | filter components          | None    | Appends one filter; examples use `.filters(...)` |

## Available Filters

| Constant                            | Expected value                                              | Recommended operation | Purpose                                                          |
| ----------------------------------- | ----------------------------------------------------------- | --------------------- | ---------------------------------------------------------------- |
| `DeviceAppFilter.BUNDLE_IDENTIFIER` | Bundle identifier string, for example `com.example.testapp` | `EQUAL`               | Match an installed application by bundle identifier              |
| `DeviceAppFilter.IS_DEFAULT`        | Boolean `true` or `false`                                   | `EQUAL`               | Match default/system or non-default applications                 |
| `DeviceAppFilter.FILE_KEY`          | Device Park application file-key string                     | `EQUAL`               | Match an installed application associated with a stored file key |

Filter keys are wire-level constants. Use `IS_DEFAULT`, not `isDefault`, as the filter key. Boolean values are supplied as booleans; the SDK serializes them as `true` or `false` query values.

## List Without Filters

The request argument may be omitted to use the SDK defaults:

```typescript
import { Credentials, DeviceParkApiClient } from "@device-park/public-sdk";

const client = DeviceParkApiClient.builder()
  .url("https://devicepark.testinium.io")
  .credentials(Credentials.fromEnvironment())
  .build();

const apps = await client.devices().apps("00008140-000C58300CBB801C");

for (const app of apps.data) {
  console.log(app.bundleIdentifier, app.isDefault);
}
```

The same call in .NET:

```csharp
using var client = DeviceParkApiClient.Builder()
    .Url("https://devicepark.testinium.io")
    .Credentials(Credentials.FromEnvironment())
    .Build();

var apps = await client.Devices.AppsAsync("00008140-000C58300CBB801C");

foreach (var app in apps.Data)
{
    Console.WriteLine($"{app.BundleIdentifier} {app.IsDefault}");
}
```

The resulting query includes the default pagination and sorting values:

```text
sorting.page=0
sorting.size=20
sorting.sortBy=ID
sorting.direction=DESC
```

## Filter Default Applications

```typescript
import {
  DeviceAppFilter,
  type DeviceAppFilterRequest,
  ListDeviceAppsRequestBuilder,
  SearchOperation
} from "@device-park/public-sdk";

const filterRequest: DeviceAppFilterRequest = {
  key: DeviceAppFilter.IS_DEFAULT,
  value: true,
  operation: SearchOperation.EQUAL
};

const request = new ListDeviceAppsRequestBuilder()
  .filters([filterRequest])
  .page(0)
  .size(20)
  .build();

const defaultApps = await client.devices().apps(
  "00008140-000C58300CBB801C",
  request
);
```

The SDK maps the filter to indexed query parameters:

```text
filters[0].key=IS_DEFAULT
filters[0].value=true
filters[0].operation=EQUAL
sorting.page=0
sorting.size=20
```

Use the same request shape for the other filters:

```typescript
const bundleFilter: DeviceAppFilterRequest = {
  key: DeviceAppFilter.BUNDLE_IDENTIFIER,
  value: "com.example.testapp",
  operation: SearchOperation.EQUAL
};

const apps = await client.devices().apps(
  "00008140-000C58300CBB801C",
  new ListDeviceAppsRequestBuilder().filters([bundleFilter]).build()
);
```

## Response Model

`PageDto<DeviceApp>` contains one page of installed application records.

| Field              | Type             | Nullable | Meaning                                                                   |
| ------------------ | ---------------- | -------- | ------------------------------------------------------------------------- |
| `id`               | number           | Yes      | Device application record identifier                                      |
| `bundleIdentifier` | string           | Yes      | Platform application identifier                                           |
| `installedAt`      | date-time string | Yes      | Installation timestamp returned by Device Park                            |
| `updatedAt`        | date-time string | Yes      | Last update timestamp returned by Device Park                             |
| `isDefault`        | boolean          | Yes      | Whether Device Park marks the application as a default/system application |

```json
{
  "size": 20,
  "page": 0,
  "totalPages": 1,
  "totalElements": 2,
  "data": [
    {
      "id": 101,
      "bundleIdentifier": "com.apple.mobilesafari",
      "installedAt": "2026-08-01T10:15:30",
      "updatedAt": "2026-08-01T10:15:30",
      "isDefault": true
    },
    {
      "id": 102,
      "bundleIdentifier": "com.example.testapp",
      "installedAt": "2026-08-10T14:22:11",
      "updatedAt": "2026-08-12T09:01:44",
      "isDefault": false
    }
  ]
}
```

`isDefault` describes the application, not device availability. A non-default application can be removed by allocation cleanup depending on the selected `removeApps` option.

## Errors

- An empty `serial` is rejected by the Node.js SDK before an HTTP request is sent.
- Device Park returns `404` when the device is not assigned to the authenticated client. The SDK surfaces that response as `DeviceParkHttpError` with status `404`.
- An empty `data` array is a successful response indicating that no installed application matched the filters.

## Next Steps

- [Retrieve the device](docId\:EXG5swERxuXv7yKWOyrwo)
- [List and filter devices](docId\:T2lFRSsG2mhohPOA4K26-)
- [Configure allocation application cleanup](docId\:sPz_N5rutGOmDKrBjbb0L)
