# Apps

## List apps[​](#list-apps "Direct link to List apps")

GET/api/v1/apps

Apps with at least one ready, unexpired file, newest first. Any role.

Query parameters

`platform`string

Only files for this platform.

`q`string

Case-insensitive substring of the name, filename or bundle id.

`limit`integer

Page size, 1 to 100. Default 25.

`cursor`string

\`nextCursor\` from the previous page. Opaque.

Header parameters

`X-Organization-Id`string

Selects which of the caller's organizations the request acts on. When omitted, the caller's default organization is used.

Returns

`object`stringrequired

`data`arrayrequired

Show child attributes

`id`string · uuidrequired

`platform`stringrequired

`bundleId`stringrequired

`name`stringrequirednullable

Label of the latest file that had one.

`iconUrl`stringrequirednullable

Relative URL of the icon (getAppIcon); null when no icon could be extracted.

`fileCount`integerrequired

Ready, unexpired files.

`latestFile`objectrequirednullable

Newest ready file, whoever uploaded it and whatever its branch. Null only when every file has expired.

Show child attributes

`id`string · uuidrequired

`name`stringrequired

`version`stringrequirednullable

`buildNumber`stringrequirednullable

`createdAt`string · date-timerequired

`expiresAt`string · date-timerequired

`createdAt`string · date-timerequired

`updatedAt`string · date-timerequired

`nextCursor`string

Pass as \`cursor\` for the next page. Absent on the last page.

Request

```
curl https://app.mobilenext.ai/api/v1/apps \

  -X GET \

  -H 'Authorization: Bearer mob_...'
```

Response

200400401

A page of apps

```
{

  "object": "list",

  "data": [

    {

      "id": "string",

      "platform": "android",

      "bundleId": "com.acme.shop",

      "name": "Acme Shop",

      "iconUrl": "/api/v1/apps/7d2a90c1-5b0e-4f7a-8c11-2e9f0a4b6d33/icon",

      "fileCount": 0,

      "latestFile": {

        "id": "string",

        "name": "string",

        "version": "4.2.0",

        "buildNumber": "4201",

        "createdAt": "2026-01-01T00:00:00Z",

        "expiresAt": "2026-01-01T00:00:00Z"

      },

      "createdAt": "2026-01-01T00:00:00Z",

      "updatedAt": "2026-01-01T00:00:00Z"

    }

  ],

  "nextCursor": "string"

}
```

## Get an app[​](#get-app "Direct link to Get an app")

GET/api/v1/apps/{appId}

Any role. An app whose files have all expired is still returned, with `fileCount: 0` and `latestFile: null`.

Path parameters

`appId`string · uuidrequired

App UUID

Header parameters

`X-Organization-Id`string

Selects which of the caller's organizations the request acts on. When omitted, the caller's default organization is used.

Returns

`id`string · uuidrequired

`platform`stringrequired

`bundleId`stringrequired

`name`stringrequirednullable

Label of the latest file that had one.

`iconUrl`stringrequirednullable

Relative URL of the icon (getAppIcon); null when no icon could be extracted.

`fileCount`integerrequired

Ready, unexpired files.

`latestFile`objectrequirednullable

Newest ready file, whoever uploaded it and whatever its branch. Null only when every file has expired.

Show child attributes

`id`string · uuidrequired

`name`stringrequired

`version`stringrequirednullable

`buildNumber`stringrequirednullable

`createdAt`string · date-timerequired

`expiresAt`string · date-timerequired

`createdAt`string · date-timerequired

`updatedAt`string · date-timerequired

Request

```
curl https://app.mobilenext.ai/api/v1/apps/{appId} \

  -X GET \

  -H 'Authorization: Bearer mob_...'
```

Response

200401404

The app

```
{

  "id": "string",

  "platform": "android",

  "bundleId": "com.acme.shop",

  "name": "Acme Shop",

  "iconUrl": "/api/v1/apps/7d2a90c1-5b0e-4f7a-8c11-2e9f0a4b6d33/icon",

  "fileCount": 0,

  "latestFile": {

    "id": "string",

    "name": "string",

    "version": "4.2.0",

    "buildNumber": "4201",

    "createdAt": "2026-01-01T00:00:00Z",

    "expiresAt": "2026-01-01T00:00:00Z"

  },

  "createdAt": "2026-01-01T00:00:00Z",

  "updatedAt": "2026-01-01T00:00:00Z"

}
```

## List an app's files[​](#list-app-files "Direct link to List an app's files")

GET/api/v1/apps/{appId}/files

Same as listFiles, restricted to this app. For a branch's newest build: `?branch=main&limit=1`.

Path parameters

`appId`string · uuidrequired

App UUID

Query parameters

`sha256`string

Only the file with this lowercase hex SHA-256.

`platform`string

Only files for this platform.

`bundleId`string

Only files with this bundle id.

`branch`string

Only files whose build.branch equals this.

`commit`string

Only files whose build.commit equals this.

`status`string

Only files in this status. Without it, ready and processing files are listed; pendingUpload and failed are for debugging.

`q`string

Case-insensitive substring of the name, filename or bundle id.

`limit`integer

Page size, 1 to 100. Default 25.

`cursor`string

\`nextCursor\` from the previous page. Opaque.

Header parameters

`X-Organization-Id`string

Selects which of the caller's organizations the request acts on. When omitted, the caller's default organization is used.

Returns

`object`stringrequired

`data`arrayrequired

Show child attributes

`id`string · uuidrequired

`status`stringrequired

pendingUpload: bytes not verified yet. processing: verification running (seen only by a concurrent caller). ready: installable. failed: see failureReason; creating the same sha256 again resets it.

`app`string · uuidrequirednullable

The app this file belongs to, once metadata is extracted.

`platform`stringrequirednullable

Known once metadata is extracted.

`filename`stringrequired

`filesize`integer · int64required

`sha256`stringrequired

`name`stringrequired

Display name. Defaults to the filename until metadata is extracted.

`bundleId`stringrequirednullable

Android package name or iOS bundle identifier.

`version`stringrequirednullable

Version name (Android) or CFBundleShortVersionString (iOS).

`buildNumber`stringrequirednullable

Version code (Android) or CFBundleVersion (iOS).

`minOsVersion`stringrequirednullable

Minimum OS version the build supports.

`isSimulator`booleanrequired

True for an iOS simulator build.

`build`objectrequirednullable

Show child attributes

`branch`string

`commit`string

`ciRunUrl`string · uri

https only. Stored and displayed, never fetched.

`source`stringrequired

How the file was created, derived from the credential.

`organization`stringrequired

Organization that owns the file.

`user`stringrequirednullable

Uploader; null if the user was deleted.

`failureReason`stringrequirednullable

Why the file failed; null otherwise.

`createdAt`string · date-timerequired

`lastUsedAt`string · date-timerequirednullable

Last dedup hit or install.

`expiresAt`string · date-timerequired

The file and its bytes are deleted after this.

`nextCursor`string

Pass as \`cursor\` for the next page. Absent on the last page.

Request

```
curl https://app.mobilenext.ai/api/v1/apps/{appId}/files \

  -X GET \

  -H 'Authorization: Bearer mob_...'
```

Response

200400401404

A page of the app's files

```
{

  "object": "list",

  "data": [

    {

      "id": "string",

      "status": "pendingUpload",

      "app": "string",

      "platform": "android",

      "filename": "app-release.apk",

      "filesize": 48211033,

      "sha256": "string",

      "name": "Checkout fix",

      "bundleId": "com.acme.shop",

      "version": "4.2.0",

      "buildNumber": "4201",

      "minOsVersion": "8.0",

      "isSimulator": false,

      "build": {

        "branch": "fix/checkout",

        "commit": "3dbd301",

        "ciRunUrl": "https://github.com/acme/shop/actions/runs/991"

      },

      "source": "api",

      "organization": "string",

      "user": "string",

      "failureReason": "checksum_mismatch",

      "createdAt": "2026-01-01T00:00:00Z",

      "lastUsedAt": "2026-01-01T00:00:00Z",

      "expiresAt": "2026-01-01T00:00:00Z"

    }

  ],

  "nextCursor": "string"

}
```

## Get an app's icon[​](#get-app-icon "Direct link to Get an app's icon")

GET/api/v1/apps/{appId}/icon

The icon as PNG (at most 512×512). Supports `If-None-Match` with the returned `ETag`. Any role.

Path parameters

`appId`string · uuidrequired

App UUID

Header parameters

`If-None-Match`string

`X-Organization-Id`string

Selects which of the caller's organizations the request acts on. When omitted, the caller's default organization is used.

Request

```
curl https://app.mobilenext.ai/api/v1/apps/{appId}/icon \

  -X GET \

  -H 'Authorization: Bearer mob_...'
```

Response

200304401404

PNG icon

```
// No response body
```
