---
title: "List app updates"
method: GET
path: "/api/apps/{handle}/{appId}/updates"
---

# List app updates

`GET /api/apps/{handle}/{appId}/updates`

## Request

- Base URL: `https://reduck.ai`
- URL: `https://reduck.ai/api/apps/{handle}/{appId}/updates`
- Auth: one of:
  - HTTP bearer
  - API key in header `X-API-Key`

Every version of the app you installed, newest first, saying what this install did with each: `installed` for one it runs, `pending` for one it has not reached, `failed` when a version's schema change could not be applied and the install stayed where it was. An app has no versions of its own — it follows what it was installed from — so this is that history read through one install.

## Path parameters

- `handle` string, required: The owner a resource is addressed under: "@username" for a personal scope, or a bare slug for a project.
- `appId` string, uuid, required

## Query parameters

- `page` integer
- `pageSize` integer

## Response `200`

OK

- PaginatedResponseAppUpdate
  - `data` AppUpdate[], required
    - `version` number, required: The image's release number.
    - `published_at` string, nullable, required: When that version was published, null while its bytes are not verified yet.
    - `status` 'installed' | 'failed' | 'pending', required: `installed` once this app runs it, `failed` when a schema change could not be applied and the app stayed where it was, `pending` for a version it has not reached.
    - `error` string, nullable, required: What stopped it, on a failure. A version's schema changes run as ONE SQLite transaction, so a failure means none of them applied.
  - `hasNextPage` boolean, required
  - `totalCount` number

## Other responses

- `401`: Not authenticated
- `403`: Forbidden
- `404`: No such app under that handle, or a scope you are not in.

---

[API](https://skmtc.dev/reduck/apis/reduck-api.md) · [All operations](https://skmtc.dev/reduck/apis/reduck-api/llms.txt) · [OpenAPI document](https://skmtc.dev/reduck/apis/reduck-api/revisions/a573b91206d6?raw)
