> ## Documentation Index
> Fetch the complete documentation index at: https://opentrain.ai/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Results, Grading, and Release

> Read attempts and rosters, award manual grades, and release held results.

Auto-graded answers are scored on submission. Manually graded questions hold the attempt's verdict until you award points. Result visibility follows the form's release setting: `IMMEDIATE` shows scores on grading; `MANUAL` holds them until you release.

## Reads

* `GET /quizzes/results?jobId=…&formId=…` — attempts across the form's published versions, with scores, pass verdicts, and release status. Optionally filter by `formVersionId`.
* `GET /quizzes/attempts/{attemptId}` — one attempt with every answer. Employer-authorized reads may include the sanitized expected-answer projection; AI-trainer surfaces never receive answer keys.
* `GET /quizzes/roster?jobId=…&formId=…` — per-person assignment status, attempt counts, and remaining attempts.
* `GET /quizzes/export-csv?jobId=…&formId=…` — all attempts as spreadsheet-safe CSV with personal emails redacted.

All reads require `project_todos:read` and employer access to the job.

## `grade`

Awards points for manually graded questions on one attempt.

<ParamField body="action" type="string" required>`grade`</ParamField>

<ParamField body="idempotencyKey" type="string" required />

<ParamField body="attemptId" type="string" required />

<ParamField body="grades" type="array" required>
  Up to 500 rows of `{ "questionId": "…", "awardedPoints": n }` (0–10,000 points per question).
</ParamField>

<ParamField body="note" type="string">Optional grading note attached to the revision.</ParamField>

Grades are append-only revisions: regrading records a new revision instead of rewriting history. When grading completes a passing verdict under `ON_PASS`, the linked to-do completes automatically.

## `release` and `bulk_release`

<ParamField body="action" type="string" required>`release` or `bulk_release`</ParamField>

<ParamField body="idempotencyKey" type="string" required />

<ParamField body="attemptId" type="string">`release`: the single attempt to make visible.</ParamField>
<ParamField body="jobId" type="string">`bulk_release`: with `formId`, releases every releasable held result on the job.</ParamField>

<ParamField body="formId" type="string" />

Releasing notifies the AI trainer and makes their score visible. Attempts still awaiting manual grading are not releasable until graded.
