---
title: "Deploy progress"
method: GET
path: "/client/apps/{id}/progress"
tags: ["Apps"]
---

# Deploy progress

`GET /client/apps/{id}/progress`

## Request

- Base URL: `https://api.roar-ai.com`
- URL: `https://api.roar-ai.com/client/apps/{id}/progress`
- Auth: HTTP bearer

Where the last deploy got to (`phase`), whether the app is running right now (`runState`), and its address. The two are separate questions: a paused app reports `phase: live` with `runState: paused`.

## Path parameters

- `id` string, uuid, required

## Response `200`

Build/deploy progress + URL

- AppProgress
  - `phase` 'queued' | 'building' | 'deploying' | 'securing' | 'live' | 'failed', required: How the last DEPLOY went. `live` means it finished and its address was confirmed serving — not that the app is running now, which a later pause does not change. Read `runState` for that.
  - `runState` 'running' | 'starting' | 'paused' | 'crashed' | 'unknown', required: Whether the app is running right now. `paused` is an owner having stopped it — its URL is still reported, because that is the address it comes back on, but nothing answers there until it is started again.
  - `deployment` object, nullable, required
    - `id` string, uuid, required
    - `status` string, required
  - `domain` object, nullable, required
    - `domain` string, required
    - `status` string, required
  - `url` string, nullable, required: The app's public address, once a deploy has been confirmed serving on it.
  - `serviceStatus` string, nullable, required
  - `error` string, nullable, required: Plain-language failure reason while `phase` is `failed`.
  - `fix` string, nullable, required: A suggested fix for that failure, when we have one.
  - `canAutoFix` boolean, required
  - `autoFixExhausted` boolean, required: The fixer handles this failure, but the attempt budget for this episode is spent. Distinct from canAutoFix:false, which also covers failures we never fix.
  - `failureKind` 'start' | 'code' | 'settings' | 'transient' | 'platform' | 'unsupported' | 'unknown' | 'null', nullable, required: What the failure needs: a start command, a code fix, a setting, a retry, us, or an unsupported app. Null while not failed.
  - `autoFixSummary` string, nullable, required
  - `canRetry` boolean, required: Whether a failed app is far enough provisioned for a redeploy to be worth trying.
  - `skippedPush` object, nullable, required: A push that arrived and was deliberately not deployed, because the app was paused. Null once anything has deployed since.
    - `branch` string, required
    - `commitSha` string, nullable, required
    - `at` string, date-time, required
  - `securingReason` string, nullable, required: Why the address is taking longer than the normal window. Null inside it.
  - `resourceWarning` string, nullable, required: Plain-language note about the app's own resource use — today, that it was killed for running out of memory.
  - `memoryLimitMb` integer, nullable, required: The most memory the app may use, in MB — a ceiling set automatically from the server it runs on, not a reservation and not a setting. Billing is on what the app actually uses. Null until the app has been placed on a server.
  - `cpuLimit` number, nullable, required: The most CPU the app may use, in vCPU — set automatically, like memoryLimitMb. Null until the app has been placed on a server.
  - `updatedAt` string, date-time, required

## Other responses

- `404`: No such app

---

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