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

# Get app

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

## Request

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

Read one app, including the release it is serving.

## 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

## Response `200`

OK

- App
  - `id` string, required
  - `name` string, required: The installer's label, and the only text an app has of its own: what the thing IS belongs to the image, which is where a listing reads its description from.
  - `owner` AppOwner, required
    - `kind` 'user' | 'project', required
    - `handle` string, required: "@username" for a personal scope, the bare slug for a project.
    - `name` string, required
  - `image` AppImageRef, required
    - `handle` string, required: "@username" or a project slug — the first half of the image's address.
    - `slug` string, required
    - `name` string, required
    - `description` string, required: What the app is for, in one line. Empty until its author writes one.
    - `current_release` number, nullable, required: The release the image points at. An app reaches it once that release's migrations have run against its own database, so the two differ while an update is stuck.
  - `current_release` number, nullable, required: The release this app is actually serving: the newest one of its image whose migrations have all run against this app's own database. Behind `image.current_release` means an update has not landed here yet.
  - `released_at` string, nullable, required: When the served release was deployed, null while there is none.
  - `pending_decisions` number, required: How many of the app's decisions are waiting for a ruling.
  - `created_at` string, required
  - `updated_at` string, required
  - `config` unknown, required
  - `api_grant` unknown, required
  - `secrets` AppSecret[], required: The app's secrets, by name only.
    - `name` string, required
    - `required` boolean, required: Whether the image's manifest says the app needs this one. False for a name the manifest never declared: nothing in the app asks for it, so nothing breaks without it.
    - `pageUsable` boolean, required: Whether a request triggered from the app's page may spend this secret. A task, the app's own server-side code, may spend every one of them regardless.
  - `release_count` number, required: How many releases the IMAGE has shipped. An app has none of its own.

## Other responses

- `401`: Not authenticated
- `403`: Forbidden
- `404`: No such app under that handle, or a scope you are not in. An app is only readable under the handle that owns it.

---

[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)
