---
title: "Live phase of the in-flight Priority Orbit derivation"
method: GET
path: "/projects/{id}/prioritization/progress"
tags: ["Projects"]
---

# Live phase of the in-flight Priority Orbit derivation

`GET /projects/{id}/prioritization/progress`

## Request

- Base URL: `https://api.apphandoff.com/api`
- URL: `https://api.apphandoff.com/api/projects/{id}/prioritization/progress`
- Auth: API key in cookie `sb-access-token`

What the derive pass is doing right now, so the portal button can name the real backend phase instead of guessing from a timer. Polled every 2s while a derivation runs. `phase: null` means the project has no run on record. `stale: true` means the run stopped moving for more than three minutes and is abandoned — the page stops waiting on it rather than spinning forever. Plain polling, not a realtime channel: one row, one reader, ~two minutes.

## Path parameters

- `id` string, uuid, required

## Response `200`

The project's current derivation run, or an all-null shape when there is none

- PrioritizationProgress: One project's current derivation run. Every field is null when the project has no run on record.
  - `run_id` string, uuid, nullable, required: Identifies one derivation attempt, so a poller can tell its own run from someone else's.
  - `phase` 'starting' | 'loading_tickets' | 'grouping' | 'saving' | 'done' | 'failed' | 'null', nullable, required: What the server is doing. `done` and `failed` are terminal — the page stops polling. `null` means no run has ever been recorded for this project.
  - `detail` string, nullable, required: Human-facing specific for the phase, rendered into the button label: the open-ticket count (`loading_tickets`), the model name (`grouping`), the topic count (`saving`), or the typed error's name (`failed`).
  - `started_at` string, date-time, nullable, required
  - `updated_at` string, date-time, nullable, required
  - `stale` boolean, required: `updated_at` is more than three minutes old on a non-terminal phase — the run died between phases and should not be waited on.

## Other responses

- `401`: Not authenticated
- `403`: Forbidden
- `429`: Rate limited

---

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