PATCH, and then use the Copies and Corrections APIs to import student work and launch grading. All endpoints require a Bearer API key passed in the Authorization header.
List exams
string
Restrict results to a specific team. Defaults to the entire subtree accessible by your API key.
integer
default:50
Maximum number of exams to return per page. Cannot exceed 200.
integer
default:0
Number of exams to skip before returning results. Use with
limit to paginate.string
Pass
true to include archived exams in results. Archived exams are excluded by default.Results are sorted newest first (
createdAt descending).exams:read
Request
Response 200
Create an exam
Creates a new exam as a team-visible draft with an empty subject and neutral organization defaults. The exam is owned by the target workspace and attributed to the API key, it is not attached to the user who created that key and does not inherit that user’s preferences. After creation, usePATCH /exams/{examId} to set the title and configure grading options, then import the subject and validate the rubric in the web app before launching corrections.
Required scope: exams:write
string
The team that will own this exam. Defaults to the root team of your API key.
Request
Response 201
Get an exam
Returns the full detail object for a single exam, including validation flags that gate correction launches. Required scope:exams:read
Request
Response 200
Response fields
string
Unique UUID for the exam.
string
UUID of the team that owns this exam.
string | null
Display name of the exam, up to 300 characters.
string | null
Optional freeform description, up to 2000 characters.
string | null
Academic level label, e.g.
Bachelor 2. Up to 200 characters.string | null
Language code for the exam content, e.g.
fr, en, de, es.string
notes for numeric grading or competencies for competency-based grading.string
Style used for AI-generated feedback:
familiar (casual, encouraging) or formal (professional).integer
Grading strictness level:
1 = lenient, 2 = standard, 3 = strict.boolean
true if the exam has been archived and is hidden from default list results.boolean
true when the rubric has been validated. This must be true before you can launch a correction.boolean
true when the subject document has been validated.boolean
true when uploaded copy files have passed processing.Update an exam
Performs a partial update on an exam, only the fields you include in the request body are changed. Sending an empty body returns400 invalid_request.
Required scope: exams:write
string | null
Display name for the exam. Maximum 300 characters. Pass
null to clear.string | null
Optional description. Maximum 2000 characters. Pass
null to clear.string | null
Academic level, e.g.
Bachelor 2. Maximum 200 characters. Pass null to clear.string | null
Language code for the exam, between 2 and 10 characters (e.g.
fr, en, de, es). Pass null to clear.string
AI feedback style:
familiar or formal.integer
Grading strictness:
1 (lenient), 2 (standard), or 3 (strict).boolean
Pass
true to archive the exam or false to unarchive it.gradingMode is locked once the subject is validated and cannot be changed via the API. Class assignment is also managed exclusively in the web app. Neither field is available in the v1 API.Request
GET /exams/{examId} response.
Field validation rules
Field validation rules
title: string or null, max 300 charsdescription: string or null, max 2000 charslevel: string or null, max 200 charslang: string or null, 2–10 charstoneOfVoice: must be exactly"familiar"or"formal"severity: must be exactly1,2, or3archived: boolean, usingnullreturns400 invalid_request- Unknown fields are ignored and do not cause an error
What cannot be changed via PATCH
What cannot be changed via PATCH
The following properties are read-only through the v1 API:
gradingMode, locked once the subject is validated. Change it before importing subject files.teamId, exams cannot be moved between teams via the API.- Class assignment, managed in the web app only.