# List apps

List apps ordered by id with cursor pagination. A credential restricted to specific apps sees only those apps.

`GET /api/platform/v1/apps`

Required permission: `project:read`.

## Parameters

| Name | In | Type | Required | Description |

| --- | --- | --- | --- | --- |

| `limit` | query | `integer` | No | Maximum apps to return, 1-100 (default 100). |

| `cursor` | query | `string` | No | nextCursor from the previous page. |

| `externalId` | query | `string` | No | Return only the app with this externalId. |

## Example request

```bash
curl --request GET \
  --url https://api.hoplite.sh/api/platform/v1/apps \
  --header "X-Api-Key: $HOPLITE_API_KEY"
```

## 200 response

Success

Content type: `application/json`. Response type: `object`.

| Field | Type | Required | Constraints | Description |
| --- | --- | --- | --- | --- |
| `ok` | `boolean` | Yes | true | — |
| `apps` | `object[]` | Yes | — | — |
| `apps.id` | `string` | Yes | — | — |
| `apps.name` | `string` | Yes | — | — |
| `apps.externalId` | `string` | Yes | — | — |
| `apps.metadata` | `object` | Yes | — | — |
| `apps.metadata.[key]` | `__schema0` | No | — | — |
| `apps.runScript` | `string` | Yes | — | — |
| `apps.setupScript` | `string` | Yes | — | — |
| `apps.previewPort` | `integer` | Yes | min -9007199254740991, max 9007199254740991 | — |
| `apps.defaultModel` | `string` | Yes | — | — |
| `apps.instructions` | `string` | Yes | — | — |
| `apps.idleTimeoutMinutes` | `integer` | Yes | min -9007199254740991, max 9007199254740991 | — |
| `apps.createdAt` | `string<date-time>` | Yes | — | — |
| `apps.updatedAt` | `string<date-time>` | Yes | — | — |
| `nextCursor` | `string` | Yes | — | — |

```json

```

## Status codes

- `200` — Success

- `400` — Invalid request

- `401` — Authentication required

- `403` — Permission, app scope or entitlement denied

- `404` — App, source or thread not found

- `409` — Idempotency conflict or request in progress

- `413` — Request too large

- `503` — Source storage or execution unavailable