Data Schema

Complete reference for the PaperStack v4 JSON response schema.

Data Schema

All PaperStack API responses follow the v4 schema. This page documents every field across the response wrapper, question objects, and related data types.

PaperResponse (Top-Level Wrapper)

Every data endpoint returns a PaperResponse object with the following structure:

{
  "schema": "v4",
  "exam": "neet",
  "year": 2024,
  "shift": "05may-s1",
  "paper": null,
  "subjects": ["physics", "chemistry", "biology"],
  "total": 50,
  "duration": 200,
  "marksCorrect": 4,
  "marksIncorrect": -1,
  "marksUnanswered": 0,
  "sections": { "...": "..." },
  "scrapedAt": "2026-05-21T05:30:13.506Z",
  "answerKeyFound": true,
  "checksum": "59f420b3...",
  "provenance": { "...": "..." },
  "questions": ["..."]  ,
  "passages": []
}

Fields

FieldTypeRequiredDescription
schemastringSchema version (v4)
examstringExam code: neet, jeemain, jeeadv
yearnumberExam year (e.g. 2024)
shiftstringShift in {dd}{mmm}-s{n} format (e.g. 05may-s1)
paperstringPaper code. Usually null for single-paper exams
subjectsstring[]Subjects in this response
totalnumberNumber of questions in this response
durationnumberExam duration in minutes
marksCorrectnumberMarks per correct answer
marksIncorrectnumberPenalty per incorrect answer
marksUnanswerednumberMarks for unanswered questions (usually 0)
sectionsobjectSection configuration (see below)
scrapedAtstringISO 8601 timestamp of last scrape
answerKeyFoundbooleanWhether the official answer key was available
checksumstringSHA-256 hex digest of this dataset
provenanceobjectData origin metadata
questionsQuestion[]Array of question objects
passagesPassage[]Array of comprehension passages

sections

{
  "a": {
    "label": "section a",
    "total": 100,
    "required": 100,
    "mandatory": true
  },
  "b": {
    "label": "section b",
    "total": 100,
    "required": 100,
    "mandatory": true
  }
}
FieldTypeDescription
labelstringSection display name
totalnumberTotal marks in this section
requirednumberMarks required to complete the section
mandatorybooleanWhether the section is mandatory

provenance

{
  "author": "Naman Dhakad",
  "repo": "https://github.com/rankify-ai/PaperStack-API",
  "license": "PolyForm-Noncommercial-1.0.0",
  "pipelineVersion": "1.0.0",
  "generatedAt": "2026-05-21T05:30:13.506Z"
}
FieldTypeDescription
authorstringCreator of the dataset
repostringSource repository URL
licensestringLicense identifier
pipelineVersionstringExtraction pipeline version
generatedAtstringISO 8601 generation timestamp

Question

Each question in the questions array has the following structure:

{
  "id": "neet-2024-05may-s1-ph-001",
  "number": 1,
  "numberLabel": null,
  "subject": "physics",
  "topic": "current-electricity",
  "section": "a",
  "type": "mcq",
  "text": "Question body with $\\LaTeX$ math...",
  "textHi": null,
  "options": ["Option A", "Option B", "Option C", "Option D"],
  "answer": "(3)",
  "answers": null,
  "answerPrecision": null,
  "marks": 4,
  "negativeMarks": -1,
  "passageId": null,
  "hasDiagram": false,
  "diagrams": null,
  "difficulty": null,
  "solution": null,
  "solutionFormat": null,
  "tags": ["battery", "internal-resistance"],
  "revision": 1,
  "source": "official-pdf",
  "confidence": null
}

Core Fields

FieldTypeRequiredDescription
idstringGlobally unique ID in format {exam}-{year}-{shift}-{subject}-{number}
numbernumberQuestion number (1-based). Global in paper.json, 1..N in subject files
numberLabelstringOptional label override for sub-parts
subjectstringphysics, chemistry, biology, mathematics
topicstringNormalized topic from controlled vocabulary
sectionstringSection identifier: a or b
typestringQuestion type (see below)
textstringFull question body. May contain $...$ LaTeX
textHistringHindi translation (if available)
marksnumberMarks awarded for correct answer
negativeMarksnumberPenalty for incorrect answer
hasDiagrambooleanWhether this question references diagram images
tagsstring[]Normalized topic tags for filtering
revisionnumberRevision counter, incremented on corrections
sourcestringofficial-pdf, answer-key, or reconstructed

Answer Fields

FieldTypeMCQMSQNATAssertion-Reason
answerstring"(3)""""9.301""(0)"-"(3)"
answersnumber[]null[1, 3]nullnull
answerPrecisionobjectnullnull{ type, min, max, unit }null
optionsstring[]3-5 options4-6 optionsnullnull

Answer format details:

TypeAnswer FormatExample
MCQZero-indexed index in parentheses"(2)" means the 3rd option (0-indexed)
MSQArray of zero-indexed indices in answers[1, 3] means options 2 and 4
NATNumeric string in answer"9.301"
Assertion-ReasonIndex in parentheses: "(0)" for A, "(1)" for B, etc."(2)"

Diagram Fields

FieldTypeDescription
hasDiagrambooleanWhether diagrams exist for this question
diagramsDiagram[]Array of diagram references (see below)
"diagrams": [
  {
    "file": "diagrams/q013-img-7.jpeg",
    "label": "fig. 1",
    "caption": null
  }
]
FieldTypeDescription
filestringRelative path to image within the paper's diagrams/ directory
labelstringDisplay label (e.g. fig. 1)
captionstringOptional diagram description

To fetch the image: GET /neet/{year}/{shift}/diagrams/{file} (requires auth).


Passage

Some questions belong to a comprehension passage. Passages are stored in a separate passages array at the top level:

{
  "id": "passage-1",
  "text": "Passage body text with $\\LaTeX$...",
  "textHi": null,
  "diagrams": null,
  "questions": ["neet-2024-05may-s1-ph-010", "neet-2024-05may-s1-ph-011"]
}

A question links to its passage via the passageId field.


Question Types

MCQ (Multiple Choice Question)

Single correct answer from 3–5 options.

{
  "type": "mcq",
  "options": ["1/10N", "1/100(N + 1)", "100N", "10(N + 1)"],
  "answer": "(2)",
  "answers": null,
  "answerPrecision": null,
  "negativeMarks": -1
}

MSQ (Multiple Select Question)

Multiple correct answers selected from 4–6 options.

{
  "type": "msq",
  "options": [
    "A-III, B-IV, C-I, D-II",
    "A-IV, B-I, C-III, D-II",
    "A-II, B-I, C-IV, D-III",
    "A-III, B-I, C-IV, D-II"
  ],
  "answer": "",
  "answers": [1, 3],
  "negativeMarks": -1
}

NAT (Numerical Answer Type)

A numeric value is required. No options provided.

{
  "type": "nat",
  "options": null,
  "answer": "9.301",
  "answers": null,
  "answerPrecision": {
    "type": "range",
    "min": 9.301,
    "max": 9.301,
    "unit": ""
  },
  "negativeMarks": 0
}

Assertion-Reason

Consists of an Assertion (A) and Reason (R). Answer selects the correct relationship.

{
  "type": "assertion-reason",
  "options": null,
  "answer": "(2)",
  "answers": null,
  "negativeMarks": -1
}

Answer mapping for assertion-reason:

AnswerMeaning
(0)Both A and R are true and R is the correct explanation of A
(1)Both A and R are true but R is NOT the correct explanation of A
(2)A is true but R is false
(3)A is false but R is true

Question ID Format

{exam}-{year}-{shift}-{subject-code}-{zero-padded-number}
ComponentDescriptionExample
examExam codeneet
year4-digit year2024
shiftFull shift name05may-s1
subject-codeTwo-letter abbreviationph, ch, bi, ma
numberZero-padded 3-digit number001

Subject codes: ph (physics), ch (chemistry), bi (biology), ma (mathematics)

Example: neet-2024-05may-s1-ph-001

On this page