# Job status

Base URL `https://api.accessful.de/api/v1/upload-service`. Every request needs the `X-API-Key` header — see [Authentication](https://docs.accessful.de/authentication/).

```http
GET /job-status/{caseId}
```

**`200 OK`**

```json
{ "jobStatus": "completed", "stage": "finished", "score": 87 }
```

`score` is the accessibility quality of the result, **0–100** (final once
`completed`). `404` is returned for an unknown `caseId`.

The response has two independent fields: **`jobStatus`** is the coarse outcome —
use it to decide when the job is done — while **`stage`** is the fine-grained
pipeline phase of a running case, telling you *where* it currently is.

| `jobStatus` | Meaning | |
| --- | --- | --- |
| `queued` | Waiting in the queue. | |
| `running` | Currently processing. | |
| `completed` | Finished — result ready to download. | terminal |
| `failed` | Processing failed. | terminal |
| `analyzer_failed` | The accessibility analysis step failed. | terminal |
| `canceled` | The job was canceled. | terminal |
| `quota_pending` | Awaiting an asynchronous quota check. | |
| `quota_exceeded` | Rejected — contract quota exhausted. | terminal |

When polling, stop as soon as `jobStatus` reaches a **terminal** state.

`stage` reports the pipeline phase. `jobStatus: "completed"` always coincides with
`stage: "finished"` — the point at which `score` is final.

| `stage` | Meaning |
| --- | --- |
| `queued` | Accepted; waiting for the first analysis. |
| `analyzing` | Initial accessibility analysis is running. |
| `resolving` | AI remediation is running. |
| `revalidating` | The remediated file is being re-analyzed; `score` is being recomputed. |
| `finished` | Done — `score` reflects the final remediated file. |
| `failed` | Processing stopped on an error. |