Skip to main content
PATCH
cURL
Step 5 of 8 in Evaluate an exam. Call it twice: once to upload, once with isFinal to submit.

Rules

  • Send exactly one of documents, fileUrl, or isFinal per request.
  • Files must be .pdf, .jpg, .jpeg, or .png, and at most 20 MB each.
  • Declare each file’s type in its multipart part: application/pdf, image/jpeg, or image/png. The API reads the part’s Content-Type, not the file name. Most other values are rejected with 400 Invalid file type, but the Word .docx type is not, so do not send one by accident.
  • A PDF can have at most 50 pages, and a sheet takes one PDF. You cannot mix a PDF with images.
  • Upload images in page order. You can send them in one call or across several, and each call adds to what is there.
  • Every uploaded file goes through a readability check. A page the checker cannot read is rejected with 400, so scan or photograph pages in good light. The 400 occasionally arrives with an empty message: treat it as a rejected file and upload the page again. A fileUrl skips the check.
  • Send {"isFinal": true} once all the pages are uploaded. That starts evaluation.
In a multipart request, any value of isFinal submits the sheet, including isFinal=false. Leave the field out until you mean it, and use JSON when you submit.
Submitting counts against a daily limit for your API user and returns 429 Rate limit exceeded once you reach it. Rejected requests count too, and the limit resets at 00:01 server time.
Files are only accepted while the sheet is Open. Once evaluation is running or has failed, the call still returns 200 and quietly ignores the files. Submitting a sheet with no files returns 404 No documents found for this answer sheet, not 400.

How to know when it’s done

The response has no status field of its own. Two things tell you where evaluation is: Or register a webhook for exam_evaluation_student_answer_sheet_evaluation. See Async jobs and webhooks.

Next step

Get exam scores for review

Read the marks and feedback before anyone else sees them.

Authorizations

Authorization
string
header
required

Access token from Get an access token. A missing, invalid, or expired token returns 403.

Path Parameters

examId
string<uuid>
required

The exam id returned by Create an exam. Write it in lowercase: this path only matches lowercase hexadecimal characters and hyphens.

Example:

"d19e6868-98dd-4274-a2a5-4a616dd93ea7"

id
string<uuid>
required

The answer sheet id returned by Create an exam answer sheet.

Example:

"8a2f4c1e-5b3d-4e6f-9a7b-0c1d2e3f4a5b"

Body

documents
file[]

Scans or photos of the student's answer sheet. One .pdf of up to 50 pages, or any number of .jpg and .png images, in page order. Up to 20 MB per file. Each part's Content-Type decides the file type, so declare application/pdf, image/jpeg, or image/png. No mixing a PDF with images, and one PDF per sheet.

fileUrl
string<uri>

Public HTTPS link to a PDF instead of an upload. The API fetches it and rejects anything that does not start with %PDF.

Example:

"https://example.com/sheets/s-2043.pdf"

isFinal
boolean

Send true to submit the sheet for evaluation. Send it on its own. In a multipart request any value, including false, submits the sheet, so leave the field out until you mean it.

Response

The answer sheet was updated. With isFinal=true, evaluation has started.

One student's answer sheet. It never reports a status of its own.

id
string<uuid>

The answer sheet ID.

documents
object[]

Files attached to the answer sheet, oldest first.

studentId
string | null

Your own student reference.

instituteId
string | null

Your own school or institute reference.

teacherId
string | null

Your own teacher reference.

studentName
string | null
parentId
string | null

Your own parent reference.