---
title: "Watch a review as it runs"
summary: "A server-sent event stream of a review's progress, ending when the review does. It never carries the result."
category: "developer"
tags: ["attest", "reference", "draft", "job", "events", "sse", "streaming"]
updated: "2026-09-14T04:25:16.971Z"
url: "https://support.quorumtech.ch/articles/attest-draft-events"
markdown: "https://support.quorumtech.ch/articles/attest-draft-events.md"
---

# Watch a review as it runs

`GET https://api.quorumtech.ch/attest/v1/attest/draft/jobs/{jobId}/events`

Server-sent events: one `progress` event per change, and a final `done` or `failed`, with a
`: keep-alive` comment every fifteen seconds so an idle connection is not closed. Each
event's `data` is a progress frame.

The finished result is not carried here. Collect it from
`GET /attest/v1/attest/draft/jobs/{jobId}`, which is also what settles the bill, so watching
a review can never consume it. Free.

Open this alongside a review that answered 202 and the counts arrive as they change, rather than being asked for. Each event's `data` is one progress frame, the same shape the progress route returns. A `: keep-alive` comment every fifteen seconds keeps an idle connection open through proxies.

The stream ends with a `done` or a `failed` event. Neither carries the review: collect it from the job route, which is also what settles the bill, so nothing a watcher does can consume a review out from under the caller who started it. If the connection drops, reconnect, or fall back to polling the progress route.

## Request

Path parameters:

| Parameter | Description |
| --- | --- |
| `jobId` | The `jobId` from a `202` response to `POST /attest/v1/attest/draft`. |

## Example request

```bash
curl -X GET "https://api.quorumtech.ch/attest/v1/attest/draft/jobs/<jobId>/events" \
  -H "Authorization: Bearer $QUORUM_API_KEY"
```

## Responses

### 200

The stream. It ends when the review does.

## 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. Watching a review never settles it; the credits stay held until the job route hands the finished result over.
