Scan a stack of multichoice answer sheets. Get back per-student scores, QR-decoded identities, and crops of any ambiguous bubble — billed per sheet.
curl -X POST https://aiquestions.intrazero.com/api/v1/grading/bubble-sheets \
-H "Authorization: Bearer $API_KEY" \
-H "Accept: application/json" \
-F "student_sheets[]=@CS201_midterm_stack.pdf" \
-F 'answer_key_json=[{"number":"1","answer":"B"},{"number":"2","answer":"A"},{"number":"3","answer":"D"}]' \
-F "subject=CS201 Midterm"
{
"job_id": "uuid",
"mode": "bubble_sheet",
"status": "needs_review",
"submissions_count": 21,
"bubble_sheets_charged": 21,
"bubble_quota_source": "subscription",
"template": { "questions": 30, "options": 4, "exam_label": "E10" },
"submissions": [
{
"student_index": 1,
"student_name": "Test Student 1",
"student_id": "22",
"qr_payload": "E10-S22",
"score": 18, "max_score": 30,
"status": "completed"
}
]
}
blank — no bubble filled (graded as 0, no review needed)multi_mark — more than one bubble filled (graded as 0, no review needed)ambiguous — confidence below threshold (status=`unreadable`, crop URL provided for manual review)missing — question expected by the key but not detected on the sheet (status=`unreadable`)Bubble sheet marking is a separately-priced add-on. Your package needs bubble_sheet_marking_enabled = true with bubble_sheets_included > 0, or an entity-level extra_bubble_sheets pool.