Submission checks

Check uploaded work before you accept it: right brief, every question answered, word count, name and your own questions.

  • Price1 credit (10p) per request
  • Typical time5 s to 2 min
  • Scopemarking:write
  • Runs asA background job
Try it

Run submission checks in the sandbox

No key and nothing to pay. The sandbox returns a realistic example in a couple of seconds; no AI runs and no data is kept.

  1. Queued202 and a job id, straight away
  2. ProcessingPoll, stream or wait for a webhook
  3. SucceededResult and files on the job
Every AI request runs as a background job, so nothing times out.

Send the files a learner is about to hand in, the brief and the checks to run. Each check comes back pass, fail or unavailable with a plain explanation you can show the learner. Scans, photos and handwriting are read as images. Checks are evidence for a person, never a mark, and nothing is stored in your LMS. All checks in one request cost one charge.

Requires marking:write. Costs 1 credit per request. Send a unique Idempotency-Key; reuse it with the identical body when retrying. Returns 202 with a job: poll GET /jobs/{job_id}, stream GET /jobs/{job_id}/events, or use a signed webhook.

Submission checks

POST/v1/checks/submissions

Scope marking:write

Headers

Submission checks: headers
FieldDetails
Idempotency-KeystringRequiredA unique key per new operation; reuse it with the identical body when retrying.
EduMark-VersionenumAPI version. Defaults to the latest.One of 2026-10-21

Request body

Submission checks: request body
FieldDetails
filesarray of FileReference or DocumentInputRequiredThe uploaded work: PDF, DOCX or TXT (inline or uploaded), or PNG, JPEG or WEBP photos via file_id.1 to 5 items
file_idfiles[].file_idstringRequiredThe id returned by POST /v1/files, after POST /v1/files/{id}/complete reported ready.When sending FileReferencePattern ^file_[a-f0-9]{32}$
filenamefiles[].filenamestringRequiredWhen sending DocumentInputUp to 200 characters
base64files[].base64stringRequiredWhen sending DocumentInputUp to 27,962,028 characters
mime_typefiles[].mime_typestring, optionalWhen sending DocumentInputUp to 150 characters
checksarray of BriefMatchCheck or WordCountCheck or IdentityCheck or LanguageCheck or CustomCheckRequired1 to 10 items
namechecks[].namestring, optionalWhen sending BriefMatchCheckUp to 80 characters
kindchecks[].kind"brief_match"RequiredWhen sending BriefMatchCheck
matchchecks[].matchenumsame_work: the file is an attempt at this brief. every_question: it also answers every question in the brief.When sending BriefMatchCheckOne of same_work, every_questionDefault "same_work"
namechecks[].namestring, optionalWhen sending WordCountCheckUp to 80 characters
kindchecks[].kind"word_count"RequiredWhen sending WordCountCheck
min_wordschecks[].min_wordsinteger, optionalDefaults to the brief's word_count.When sending WordCountCheck1 to 100,000
max_wordschecks[].max_wordsinteger, optionalDefaults to the brief's word_count.When sending WordCountCheck1 to 100,000
tolerance_percentchecks[].tolerance_percentintegerWhen sending WordCountCheck0 to 50Default 0
exclude_referenceschecks[].exclude_referencesbooleanWhen sending WordCountCheckDefault true
namechecks[].namestring, optionalWhen sending IdentityCheckUp to 80 characters
kindchecks[].kind"learner_identity"RequiredWhen sending IdentityCheck
namechecks[].namestring, optionalWhen sending LanguageCheckUp to 80 characters
kindchecks[].kind"language"RequiredWhen sending LanguageCheck
languagechecks[].languagestringWhen sending LanguageCheckUp to 40 charactersDefault "English"
namechecks[].namestring, optionalWhen sending CustomCheckUp to 80 characters
kindchecks[].kind"custom"RequiredWhen sending CustomCheck
idchecks[].idstringRequiredWhen sending CustomCheckPattern ^[A-Za-z0-9_-]{1,64}$
promptchecks[].promptstringRequiredA question about the work, for example “Is there a signed declaration?”When sending CustomCheckUp to 2,000 characters
outputchecks[].outputenumRequiredWhen sending CustomCheckOne of yes_no, number, choice, text
pass_whenchecks[].pass_whenenumWhen sending CustomCheckOne of yes, noDefault "yes"
pass_minchecks[].pass_minnumber, optionalWhen sending CustomCheck-1,000,000 to 1,000,000
pass_maxchecks[].pass_maxnumber, optionalWhen sending CustomCheck-1,000,000 to 1,000,000
choiceschecks[].choicesarray of stringWhen sending CustomCheckUp to 10 items
pass_choiceschecks[].pass_choicesarray of stringWhen sending CustomCheckUp to 10 items
briefBrief, optionalThe assignment the work should answer. Needed for brief_match.
titlebrief.titlestringRequiredUp to 200 characters
instructionsbrief.instructionsstring, optionalUp to 3,000 characters
questionsbrief.questionsarray of BriefQuestionUp to 60 items
refbrief.questions[].refstringRequiredHow the brief labels it, for example 1a or Task 2.Up to 80 characters
promptbrief.questions[].promptstringRequiredUp to 1,500 characters
word_countbrief.word_countWordLimits, optional
minimumbrief.word_count.minimuminteger, optional1 to 100,000
maximumbrief.word_count.maximuminteger, optional1 to 100,000
learner_namestring, optionalNeeded for learner_identity.Up to 200 characters

Responses

StatusMeaning
202Successful Response
400Request rejected. Inspect error.code and request_id; failed work is not billed.
401Request rejected. Inspect error.code and request_id; failed work is not billed.
402Request rejected. Inspect error.code and request_id; failed work is not billed.
403Request rejected. Inspect error.code and request_id; failed work is not billed.
404Request rejected. Inspect error.code and request_id; failed work is not billed.
409Request rejected. Inspect error.code and request_id; failed work is not billed.
410Request rejected. Inspect error.code and request_id; failed work is not billed.
413Request rejected. Inspect error.code and request_id; failed work is not billed.
415Request rejected. Inspect error.code and request_id; failed work is not billed.
422Validation Error
429Request rejected. Inspect error.code and request_id; failed work is not billed.
503Request rejected. Inspect error.code and request_id; failed work is not billed.