Recording marking
Proposed marks and feedback for a spoken or filmed answer, from its transcript, still frames and delivery.
- Price30 credits (£3.00) per submission
- Typical time60 s to 15 min
- Scope
marking:write - Runs asA background job
Run recording marking 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.
- Queued202 and a job id, straight away
- ProcessingPoll, stream or wait for a webhook
- SucceededResult and files on the job
Upload the recording with POST /v1/files first and pass its file_id. EduMark transcribes the speech, samples still frames after scene changes and measures pauses and pace, then marks each question against your guide. The AI cannot hear pronunciation or sound quality, or see motion between frames: anything that depends on those comes back with proposed_marks: null and a reason. The result is a proposal for a named person to review: official_result is always false and requires_review always true. The transcript is included.
Requires marking:write. Costs 30 credits per submission. 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.
Recording marking
POST/v1/marking/recordings
Scope marking:write
Headers
| Field | Details |
|---|---|
Idempotency-Key | stringRequiredA unique key per new operation; reuse it with the identical body when retrying. |
EduMark-Version | enumAPI version. Defaults to the latest.One of 2026-10-21 |
Request body
| Field | Details |
|---|---|
recording | FileReferenceRequiredAn uploaded recording (POST /v1/files): MP4, MOV, WEBM, M4A, MP3, WAV or OGG, up to 500 MiB and 60 minutes. |
file_idrecording.file_id | stringRequiredThe id returned by POST /v1/files, after POST /v1/files/{id}/complete reported ready.Pattern ^file_[a-f0-9]{32}$ |
questions | array of MarkedQuestionRequiredWhat the recording answers. Each is marked against the whole recording.1 to 20 items |
idquestions[].id | stringRequiredUp to 100 charactersPattern ^[A-Za-z0-9_.-]+$ |
question_textquestions[].question_text | stringRequiredUp to 12,000 characters |
max_marksquestions[].max_marks | integerRequired1 to 1,000 |
marking_guidequestions[].marking_guide | string, optionalWhat a good answer contains and how marks are awarded. Draft one with POST /v1/marking/guides.Up to 16,000 characters |
criteriaquestions[].criteria | array of CriterionOptional rubric. Criterion maxima must add up to max_marks.Up to 12 items |
idquestions[].criteria[].id | stringRequiredUp to 60 charactersPattern ^[A-Za-z0-9_.-]+$ |
titlequestions[].criteria[].title | stringRequiredUp to 300 characters |
descriptionquestions[].criteria[].description | string, optionalUp to 4,000 characters |
max_marksquestions[].criteria[].max_marks | integerRequired1 to 1,000 |
context_text | string, optionalAssignment-wide marking rules or the task brief.Up to 60,000 characters |
feedback | FeedbackPreferences, optionalHow feedback is written. Each field is optional; unset fields use your team's Assessment & feedback settings. |
tonefeedback.tone | enum, optionalprofessional_balanced, supportive_developmental, direct_concise or custom.One of professional_balanced, supportive_developmental, direct_concise, custom |
custom_tonefeedback.custom_tone | string, optionalDescribes the tone when tone is custom.Up to 500 characters |
lengthfeedback.length | enum, optionalbrief, standard or detailed.One of brief, standard, detailed |
addressfeedback.address | enum, optionaldirect ('you') or third_person ('the learner').One of direct, third_person |
instructionsfeedback.instructions | string, optionalExtra writing instructions. They shape wording only, never marks.Up to 2,000 characters |
Responses
| Status | Meaning |
|---|---|
| 202 | Successful Response |
| 400 | Request rejected. Inspect error.code and request_id; failed work is not billed. |
| 401 | Request rejected. Inspect error.code and request_id; failed work is not billed. |
| 402 | Request rejected. Inspect error.code and request_id; failed work is not billed. |
| 403 | Request rejected. Inspect error.code and request_id; failed work is not billed. |
| 404 | Request rejected. Inspect error.code and request_id; failed work is not billed. |
| 409 | Request rejected. Inspect error.code and request_id; failed work is not billed. |
| 410 | Request rejected. Inspect error.code and request_id; failed work is not billed. |
| 413 | Request rejected. Inspect error.code and request_id; failed work is not billed. |
| 415 | Request rejected. Inspect error.code and request_id; failed work is not billed. |
| 422 | Validation Error |
| 429 | Request rejected. Inspect error.code and request_id; failed work is not billed. |
| 503 | Request rejected. Inspect error.code and request_id; failed work is not billed. |