Read a review's progress
One progress frame for a review that is still running, without collecting it or settling its bill.
Last updated 12 September 2026
Read a review's progress
GET https://api.quorumtech.ch/attest/v1/attest/draft/jobs/{jobId}/progress
Read a review's progress without collecting it.
One progress frame, and nothing else. Unlike the job route this neither hands over the finished review nor settles its bill, so a dashboard can show a review's counts moving without consuming it. Free.
Use this where something needs to show a review moving, such as a dashboard or a progress bar, and must not consume it. The job route is the only route that hands the finished review over and settles what it cost; this one answers with the counts as they stand and nothing else, whatever state the review is in.
Poll every few seconds. A frame carries the claims extracted and checked so far, how many passages of the draft are done, and the phase (extracting, checking, finished). A 404 means the job was never known or has been forgotten, which happens five minutes after a finished review is collected and on any restart.
Request
Path parameters:
| Parameter | Description |
| --- | --- |
| jobId | The jobId from a 202 response to POST /attest/v1/attest/draft. |
Example request
curl -X GET "https://api.quorumtech.ch/attest/v1/attest/draft/jobs/<jobId>/progress" \
-H "Authorization: Bearer $QUORUM_API_KEY"
Responses
200
The review's counts as they stand.
| Field | Type | Description |
| --- | --- | --- |
| jobId | string | |
| state | running or done or failed | |
| progress | JobProgress | |
| progress.extracted | integer | Claims found so far. It grows as each passage is read, and is final once phase leaves extracting. |
| progress.checked | integer | Claims checked so far |
| progress.passagesDone | integer | Passages read so far |
| progress.passagesTotal | integer | |
| progress.phase | extracting or checking or finished | |
| progress.failedPassages | FailedPassage[] | |
| progress.failedPassages[].chunk | integer | |
| progress.failedPassages[].excerpt | string | |
| progress.failedPassages[].reason | string | |
| updatedAt | string (date-time) | When the counts last changed. |
| error | object | Present on a failed frame. |
| error.code | string | |
| error.message | string | |
Errors
The body is { "error": { "code", "message" } }; the full catalogue with what to do about each code is on the Errors page.
| Status | Codes | When |
| --- | --- | --- |
| 401 | | The key is missing, not recognised, or revoked. |
| 403 | | The key is not scoped to Attest. |
| 404 | | No such job. |
| 503 | not_configured | The evaluator is not configured (not_configured). |
Cost
Free. Reading progress never settles a review, so the credits stay held until the job route hands the finished result over.
Related articles
Fetch a page in one call
The same work as the extract call, with the request held open until the page is done and the Markdown returned directly.
Watch an extraction
Server-sent events for one job: its state now, every change after it, and the finished page. Closes when the job does.
Read an extraction's progress
One frame of a job's state without its Markdown, for a progress bar that should not carry a page's text with every poll.
Collect an extraction
Poll a job that answered 202. Returns its state while it runs and the Markdown once it is done.
Still need help?
Ask Quincy in the chat bubble below, or write to support@quorumtech.ch and we will help you directly.