Workbook marking
Proposed marks and feedback for a completed spreadsheet: cells, formulas, charts and layout.
- Price10 credits (£1.00) per submission
- Typical time20 s to 4 min
- Scope
marking:write - Runs asA background job
Run workbook 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
Send an XLSX or CSV workbook and the questions it answers. EduMark reads every filled cell with its saved value and formula, redraws charts from the data saved in the file and renders the original layout. Point a question at its answer cells with cells (for example Budget!B14:M14) and the formulas' source cells are read too; otherwise EduMark finds the answer. Formulas and macros are never run. The result is a proposal for a named person to review: official_result is always false and requires_review always true.
Requires marking:write. Costs 10 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.
Workbook marking
POST/v1/marking/workbooks
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 |
|---|---|
workbook | FileReference or WorkbookInlineRequiredThe completed workbook: an uploaded XLSX or CSV file id, or inline base64. |
file_idworkbook.file_id | stringRequiredThe id returned by POST /v1/files, after POST /v1/files/{id}/complete reported ready.When sending FileReferencePattern ^file_[a-f0-9]{32}$ |
filenameworkbook.filename | stringRequiredWhen sending WorkbookInlineUp to 200 characters |
base64workbook.base64 | stringRequiredWhen sending WorkbookInlineUp to 27,962,028 characters |
mime_typeworkbook.mime_type | string, optionalWhen sending WorkbookInlineUp to 150 characters |
questions | array of WorkbookQuestionRequired1 to 30 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 |
cellsquestions[].cells | array of stringWhere the answer is, for example Budget!B2:B12. Leave empty to let EduMark find it.Up to 20 items |
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. |