1
Create the day's question
One exam per daily question, created open.
2
Turn the student's pages into a PDF
Your backend combines the photos into one PDF.
3
Upload and submit
Upload the PDF and submit it. The student is created on first use.
4
Follow results across all days
One feed for every exam, polled by one worker.
5
Show the evaluation
Marks, feedback, model answer and the checked copy, in your app.
Setup for the code samples
Setup for the code samples
The Python and Node samples on this page assume this setup. The Node samples use top-level
await, so run them as ES modules (a .mjs file, or "type": "module" in package.json).1. Create the day’s question
Create one exam per daily question with"open": true, so it is ready for answers in a single call. Use "level": "upsc": the level, subject and exam instructions are passed to the AI as context, so it marks to the standard of the exam you are preparing students for.
external_ref makes it safe to run twice: the second call returns 409 exam_exists with the existing exam_id.
Write the rubric the way your evaluators already mark: what an introduction must contain, how many examples earn full credit, what a good conclusion looks like. Criterion marks must add up to max_marks, and guidance describes what to look for, never marks. See the rubric rules.
word_limit is stored with the question and returned when you read it. To have the AI weigh length, say so in the question text or the rubric, as in the example.2. Turn the student’s pages into one PDF
Students photograph their 2 to 3 pages in your app. Today the API takes one PDF per answer: phone photos sent directly are refused with422 feature_not_available. Native photo submission is on the Roadmap.
Your backend combines the photos, in page order, into a single PDF. For example, with Pillow:
Python
- Fix rotation before building the PDF; sideways pages read poorly.
- One photo per page, the whole page in frame, no heavy shadows.
- Keep the PDF under 50 MB. Compress large photos before combining.
- Every page of the PDF is billed. Drop accidental duplicate photos.
3. Upload and submit
Upload the PDF, then submit it for the student. Send the student inline with your user ID asexternal_id: the first submission creates the student and registers them on the day’s exam, so there is no sign-up call.
"replace": true; the new answer is graded and charged again.
4. Follow results across all days
Students submit through the evening and read results whenever they open the app. Don’t poll each answer. Run one worker over the submissions feed, which covers every exam:graded or partially_graded, fetch its result and store it. When it reaches failed, show the student what to do from error.code, for example copy_unreadable (“Please retake clearer photos”). Failed answers are not charged. Syncing results has a complete worker with checkpoints and retries.
Each submission also carries an ETA while it waits: queue.position and queue.estimated_ready_at. Show it in the app (“Expected by 9:40 pm”) rather than promising a fixed turnaround; evening peaks take longer.
5. Show the evaluation
Fetch the result with the model answer included:Response (abridged)
- Score and breakdown.
totals.awardedout oftotals.max, then each criterion with itsreason. Students learn most from where marks were lost. - Feedback. The
feedbacktext, rendered as plain text. - Model answer. From
include=model_answer, side by side with the student’s own pages. - Checked copy. The student’s answer with the evaluator’s marks and comments on it.
Python
Mentor review
AI marks are drafts until you finalize them. Many programmes show the AI evaluation immediately and let mentors adjust it:- On the dashboard. Each daily exam appears in your institute’s Vacademy dashboard, tagged Source: API. Mentors can open any answer and change marks and feedback there.
- In your own mentor tool. Send changes with
PATCH /submissions/{id}/questions/{question_id}(scopeevaluation:review), in steps of 0.5 marks, with the mentor’s ID inreviewer.
source becomes ai_reviewed. When a day’s evaluations are settled, finalize the exam with POST /exams/{id}/finalize and {"all_graded": true} to lock them.
Volume and limits
- Daily quota. Each institute has a daily copy quota, 2,000 copies by default, reset at 00:00 UTC.
GET /meshowsdaily_copy_quota,quota_used_todayandquota_resets_at. Beyond it, submissions are refused with429 daily_quota_exceeded. For a larger programme, ask hello@evalezy.com to raise it before launch. - English only. Hindi-medium answers are not supported yet. Such an answer fails with
error.code: "language_not_supported"and is not charged. Tell Hindi-medium students before they submit. - Answer length. Copies of up to 40 pages are graded normally. A full-length mains booklet of 41 to 80 pages is accepted, but pages after the 40th get a simpler text-only read and the copy is flagged
needs_reviewfor a mentor. Copies over 80 pages are refused.
Next steps
Syncing results
One feed for every daily exam.
Going live
Quotas, credits and retries before launch day.