> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://docs-unsw-v6.advance-uac.com/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://docs-unsw-v6.advance-uac.com/_mcp/server.

# Assessment workflows

Every application is assessed by a **workflow** — an ordered set of steps it moves through,
from submission to a decision. Which workflow applies is decided by the program, its cohort
year and its stream.

You will want this for two reasons: to show an applicant where their application has got to,
and to know which of your programs can accept applications at all.

```
GET /institution/workflows
GET /institution/workflows/{id}
```

## What "available" means

A workflow is listed if **at least one of your programs is attached to it**. A workflow no
program of yours uses is not yours to see, and returns `404`.

The list carries a count of each one's steps and of your programs using it:

```json
[
  {
    "id": "76f509b0-0d63-49a8-bfcd-616ebea9d033",
    "name": "Generic Credit Assessment Workflow",
    "version": 1,
    "status": "PUBLISHED",
    "programCount": 4,
    "stepCount": 8
  }
]
```

> **Note**
>
> `programCount` counts distinct programs, not attachments. One program attached for three
> cohort years is one program.

## Steps, and where an application sits

`GET /institution/workflows/{id}` returns the steps in the order they run:

```json
{
  "name": "Generic Credit Assessment Workflow",
  "steps": [
    { "code": "SUBMITTED",          "label": "Submitted",           "automatic": false, "initial": true,  "terminal": false },
    { "code": "ARTICULATION_MATCH", "label": "Articulation match",  "automatic": true,  "initial": false, "terminal": false },
    { "code": "PRECEDENT_MATCH",    "label": "Precedent match",     "automatic": true,  "initial": false, "terminal": false },
    { "code": "CREDIT_MATCH",       "label": "RPL credit match",    "automatic": true,  "initial": false, "terminal": false },
    { "code": "ASSESSOR_ROUTING",   "label": "Assessor routing",    "automatic": true,  "initial": false, "terminal": false },
    { "code": "CREDIT_TEAM_REVIEW", "label": "Credit Team review",  "automatic": false, "initial": false, "terminal": false },
    { "code": "DECIDED",            "label": "Decided",             "automatic": false, "initial": false, "terminal": true  }
  ],
  "programs": [
    { "code": "8429", "name": "Master of Applied Economics", "cohortYear": 2026, "stream": "DOMESTIC_FP" }
  ]
}
```

**`code` is the same value as `workflowStatus`** on the [outcome endpoint](/credit-outcomes). That is what makes this useful: read the outcome, find its
`workflowStatus` in this list, and you know how far through the process the application is
and what is left.

`label` is written for people — show that, not the code.

### `automatic` tells you whether waiting is normal

### `automatic: true`

The system performs the step and moves on by itself. An application does not rest here, so
seeing one of these in `workflowStatus` means you have caught it mid-assessment — poll
again shortly.

### `automatic: false`

The step waits for a person. An application can legitimately sit here for days.
`CREDIT_TEAM_REVIEW` is the one to expect.

`terminal: true` marks an end state. Reaching one is what sets `finalOutcome` on the outcome
response — with [one caveat about academic approval](/academic-approval).

## Which programs accept applications

`programs` on the detail response is the authoritative list of your programs on that
workflow, per cohort year and stream. Submit against a `code` + `year` pair that appears on
some workflow.

For the flat answer across every workflow, use
`GET /institution/programs/accepting-applications` — a program with no workflow attached
cannot be assessed, and submitting against it is rejected during processing.

> **Note**
>
> This is read-only. Which workflow a program uses, and what steps it has, are UAC
> configuration decisions. Tell us if a program is on the wrong one.