Skip to main content
This guide is for test-prep apps that run daily answer writing, such as UPSC Mains GS practice. Every day there is one question. Students write their answer by hand, upload it from your app, and get marks, feedback, a model answer and a checked copy.
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.
Your API key stays on your server. The mobile app talks to your backend; your backend talks to Evalezy. Never put an API key in an app build, even an obfuscated one.
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.
Run this from a scheduled job before the question goes live. 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 with 422 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
Tips for readable answers:
  • 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 as external_id: the first submission creates the student and registers them on the day’s exam, so there is no sign-up call.
A 3-page answer costs 3 credits, charged only when it is graded. Each student has one live answer per daily question. If a student resubmits, either refuse it in your app or send "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:
When a row reaches 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)
A good results screen shows:
  • Score and breakdown. totals.awarded out of totals.max, then each criterion with its reason. Students learn most from where marks were lost.
  • Feedback. The feedback text, 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.
Download the checked copy on your backend and serve it to the app from your own storage, because the download needs your API key:
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} (scope evaluation:review), in steps of 0.5 marks, with the mentor’s ID in reviewer.
Changes by mentors bump the submission in the feed, so your worker picks up the new marks and 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 /me shows daily_copy_quota, quota_used_today and quota_resets_at. Beyond it, submissions are refused with 429 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_review for 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.