Create a test
Create a sitting of an approved question paper. One paper can back multiple tests.
The paper must already be APPROVED — approve it in the Acadine dashboard first. A paper in any other status is rejected with 409 rather than approved automatically, so machine-extracted questions are never put in front of students unreviewed.
By default the test is scheduled for every batch on the question paper's course. Pass batch_ids to narrow it to specific batches; each must be on that same course. Scheduling a test for a batch notifies its students, so pass an explicit list if the default is wider than you intend. The batches actually used come back on the response.
A test is always scheduled for at least one batch: an empty batch_ids is rejected, and a course with no batches gets one named Default created for it.
Scheduling and timing
Every test runs over an availability window: starts_at and ends_at are both required, and ends_at must be after starts_at. The window may be in the past, so a test that has already been sat can be recorded after the fact.
duration_mins is what makes the test timed. It is a per-student clock that starts when each student starts, so the window says when the test is open and duration_mins says how long any one student gets:
| Window | duration_mins | Result |
|---|---|---|
| 09:00–12:00 | omitted | Three hours, open to all — students may use the whole window. |
| 09:00–12:00 | 60 | A one-hour test that can be started any time between 09:00 and 12:00. |
An attempt ends at whichever comes first: the student's own clock or ends_at.
How students answer
Pick at most one of these — a test is answered one way, so combining them is rejected:
| Flag | How answers reach us |
|---|---|
| (none set) | Students write on paper; you upload the scanned sheets. |
| is_cbt | Students answer on screen in the app. Nothing is scanned. |
| is_omr | Students fill a paper bubble sheet; you upload the scans. |
| allow_student_answer_sheet_upload | Students photograph and upload their own sheets. |
Request
- Base URL: https://api.acadine.ai (the document declares no server; this is the origin it was published from)
- URL: https://api.acadine.ai/v1/tests
- Auth: API key in header X-API-Key
Request body
Example request
{
"duration_mins": 180,
"ends_at": "2026-03-14T12:00:00Z",
"name": "Physics Term 1 — Morning",
"question_paper_id": "QPR_2msnplIgOEXImjfvuihUqhIqNJO",
"starts_at": "2026-03-14T09:00:00Z"
}Response
Successful Response
Example response
{
"test_id": "TST_2msnplIgOEXImjfvuihUqhIqNJO",
"name": "Physics Term 1 — Morning",
"question_paper_id": "QPR_2msnplIgOEXImjfvuihUqhIqNJO",
"course_id": "ORG_CRS_2msnplIgOEXImjfvuihUqhIqNJO",
"subject_id": "ORG_SUB_2msnplIgOEXImjfvuihUqhIqNJO",
"total_marks": 100,
"duration_mins": 180,
"batch_ids": [
"BCH_2msnplIgOEXImjfvuihUqhIqNJO"
],
"created_by": {
"id": "USR_2msnplIgOEXImjfvuihUqhIqNJO",
"name": "Anita Sharma"
},
"external_test_ref": "their-test-4471"
}Changes
No recorded changes to this operation across all 1 revision of this API.