Reporting
Use these endpoints to read reporting periods, results, markbooks and reports, and the comments, outcomes, standards and indicators that go with them.
All endpoints on this page are under /api/reporting/.
See Authentication for how to send your API token.
Reporting/periods:get
Gets a list of reporting periods for a year.
Request
GET /api/reporting/periods[/<year>]
Parameters
<year>: OPTIONAL. The calendar year in question. If omitted, the current calendar year is used.
Response
GET /api/reporting/periods/2018
{
"data": [
{
"period_id": "31",
"period_name": "Term 1",
"period_start": "2018-01-01",
"period_end": "2018-12-02",
"period_publish": "2018-12-02 12:00:00"
}
],
"message": "Reporting periods from year 2018",
"response": {
"error": "OK",
"code": 200
}
}
The data attribute contains an array of 0 or more reporting period objects.
period_idis the internal identifier for the reporting period in question.period_nameis the user-provided descriptor for that reporting period.period_startis the starting date of the reporting period. This is often set as the start of term, but some schools, who run concurrent or additional reporting periods may not align reporting periods with terms.period_endis the date on which the reporting period is deemed to have finished.period_publishis the date and time when the reports are made available on the parent portal. This date may change at the user discretion and so this value should always be double checked on or after this time if important actions are to occur.
Reporting/results:get
Gets all academic results for a reporting period.
Request
GET /api/reporting/results/<reportingperiod>
Parameters
<reportingperiod>is the value of the reporting period identifier. See theperiod_idproperty returned in the Reporting/periods/get request above.
Response
GET /api/reporting/results/31
{
"data": [
{
"pupil_id": 1754,
"pupil_admin": "55012",
"pupil_grade": 9,
"results": [
{
"subject_id": 1,
"subject_name": "English",
"dbe_subject_code": "",
"result_term": 50,
"result_ytd": 50
},
{
"subject_id": 40,
"subject_name": "Technology",
"dbe_subject_code": "15351142",
"result_term": null,
"result_ytd": null
}
],
"report_aggregate": 72.5,
"report_aggregate_ytd": 72.5,
"report_modified": "2016-02-11 11:36:17"
}
],
"message": "",
"response": {
"error": "OK",
"code": 200
}
}
The data attribute contains an array of 0 or more pupil objects. The pupil object has the following attributes:
pupil_idthe internal identifier of the pupil.pupil_adminis a user-provided identifier. These should be consistent but can change at the school’s discretion.pupil_gradegives the grade that the pupil was in for this reporting period. Values are integers between -3 (Grade 0000) and 13 (Post Matric).-
results is an array of 0 or more subject result objects. These objects have the following properties:
-
subject_idis the internal identifier for the subject in ADAM. Note that these may not be consistent as some schools have multiple versions of the same subject (e.g. English for Junior School vs English for High School). These values are not consistent across schools. subject_nameis the user-provided name for that subject.dbe_subject_codeis the Department of Basic Education’s subject code. Typically, this is specific to the grade and subject. Because some schools offer their curriculum in different configurations, some codes may be duplicated, and yet other subjects may not have a code assigned (which is represented by an empty string).result_termis the pupil’s result for this reporting period (normally akin to a term). A null value represents an absent result. This result is otherwise returned as a float and decimal places should be anticipated-
result_ytdis the pupil’s year-to-date result, a result that is often an aggregated result across a number of reporting periods. A null value represents an absent result.This result is otherwise returned as a float and decimal places should be anticipated. -
report_aggregateis a summary result (often, but not always, an average of all the subject results) for the pupil for that term. report_aggregate_ytdis a summary year-to-date result. Again, this is often, but not always an average of the subject results.report_modifiedis a timestamp of the last modification time of that report.
Reporting/pupilreportingperiods:get
Returns the reporting periods in which a pupil has a report, with the pupil’s aggregates and the archived report document for each period.
Request
GET /api/reporting/pupilreportingperiods/<pupil>
Parameters
<pupil>: ADAM internal pupil identifier (required)
Response
GET /api/reporting/pupilreportingperiods/123
{
"data": [
{
"period_id": 3,
"period_name": "Term 1 2026",
"period_start": "2026-01-15",
"period_end": "2026-03-31",
"period_publish": "2026-04-01 12:00:00",
"report_aggregate": "72.5000000",
"report_aggregate_ytd": "-1.0000000",
"document_id": 456,
"document_upload_date": "2026-04-01 09:15:00",
"pupil_gradetext": "Grade 10"
}
],
"message": "",
"response": {
"error": "OK",
"code": 200
}
}
The data attribute contains an array of 0 or more reporting period objects, with the most recent period (by end date) first. A period is included only if the pupil has a report in it and the period’s Show on Parent/Pupil Portals setting is Yes. The period’s publish date is not checked, so the list can include periods whose reports are not yet published.
period_id,period_name,period_start,period_endandperiod_publishare as described under Reporting/periods:get.report_aggregateandreport_aggregate_ytdare the pupil’s summary result for the period and for the year to date, as stored on the pupil’s report. Each is a string holding a decimal number with seven decimal places, for example"72.5000000". A value of"-1.0000000"means that no aggregate is stored, not a mark of -1. These are not always the same values that Reporting/results:get returns: that endpoint calculates an aggregate when none is stored, and this endpoint does not.document_idis the identifier of the archived report document for this period, anddocument_upload_dateis the date and time it was stored. Both arenullwhen no report document has been archived for the period.pupil_gradetextis the name of the grade the pupil was in during the year in which the period ended, using the grade names set up in ADAM, for example “Grade 10”.
Reporting/subjectmarksbypupil:get
Returns subject marks for a pupil across all reporting periods.
Request
GET /api/reporting/subjectmarksbypupil/<pupil>
Parameters
<pupil>: ADAM internal pupil identifier (required)
Response
Data attribute contains an array of reporting periods, each with a nested subjects array:
{
"data": [
{
"period_id": 3,
"period_name": "Term 1 2026",
"subjects": [
{
"subject_id": 5,
"grade": 10,
"subject_name": "Mathematics",
"subject_short": "Maths",
"teacher_email": "smith@school.co.za",
"teacher_name": "Mr Smith",
"result": 78,
"class_friendly": "10A Maths"
}
]
}
]
}
Reporting/markbook:get
Returns the markbook (assessment results by category) for a pupil in a specific reporting period.
Request
GET /api/reporting/markbook/<period>/<pupil>
Parameters
<period>: Reporting period identifier (required)<pupil>: ADAM internal pupil identifier (required)
Response
Data attribute contains an array of subjects with assessment categories and individual assessments.
{
"data": [
{
"subject_name": "Mathematics",
"subject_short": "Maths",
"class_teacher": "Mr Smith",
"class_gradeyear": 10,
"class_description": "10A",
"class_friendly": "10A Maths",
"assessment_categories": [
{
"category_name": "Tests",
"assessments": []
}
]
}
]
}
Reporting/report:get
Returns a pupil’s report as a PDF document.
Request
GET /api/reporting/report/<period>/<pupil>
Parameters
<period>: Reporting period identifier (required)<pupil>: ADAM internal pupil identifier (required)
Response
Binary PDF response with content type application/pdf.
Reporting/previousreports:get
Returns historical report information for a pupil.
Request
GET /api/reporting/previousreports/<pupil>
Parameters
<pupil>: ADAM internal pupil identifier (required)
Response
Data attribute contains previous report table data.
Note
Report detail endpoints and publication
The four reporting/… endpoints that follow (and their reporting/grade/… counterparts) expose the
detail that appears on a pupil’s printed report — subject comments, learning outcomes, assessment
standards and behavioural indicators — as JSON. Every value is read through the same report engine
that renders the PDF, so the figures match the printed report exactly.
Only published reporting periods are exposed. A period is published once its publish date and time
has passed (see period_publish under Reporting/periods). Behaviour
for the period identifier supplied in the request:
- Period not yet published →
403 (Forbidden), with no data. - Period identifier not recognised →
400 (Bad Request). - Published period with no captured detail →
200 (OK)with an emptydataarray.
Wherever a value has not been captured it is returned as null. This covers absent marks and any text
field left blank on the report.
Reporting/comments:get
Returns the subject comments and result summary for a pupil’s report in a published reporting period.
Request
GET /api/reporting/comments/<pupil>/<period>
Parameters
<pupil>: ADAM internal pupil identifier (required).<period>: Reporting period identifier (required). The period must be published (see the note above).
Response
The data attribute contains an array with one object per reporting subject on the pupil’s report.
{
"data": [
{
"subject_id": 5,
"subject_name": "Mathematics",
"subject_short": "Maths",
"subject_category_id": 2,
"class_id": 812,
"class_friendly": "10A Maths",
"teacher_name": "Mr Smith",
"comment": "A pleasing term's work.",
"comment_generic": null,
"result_term": 78,
"result_ytd": 74.5,
"symbol_term": "B",
"symbol_ytd": "B",
"level": null
}
],
"message": "",
"response": {
"error": "OK",
"code": 200
}
}
subject_idis the internal identifier for the subject in ADAM (see Reporting/results).subject_nameis the subject’s full name.subject_shortis the subject’s short name.subject_category_idis the identifier of the subject category the subject belongs to.class_idis the identifier of the class the pupil is registered in for this subject.class_friendlyis a human-readable class name, ornullif none is configured.teacher_nameis the class teacher’s name, ornull.commentis the pupil’s subject comment for this period, ornullif none was captured.comment_genericis the generic (shared) subject comment, ornull.result_termis the term result as a float, ornullif absent.result_ytdis the year-to-date result as a float, ornullif absent.symbol_termis the term result symbol, ornull.symbol_ytdis the year-to-date result symbol, ornull.levelis the subject level descriptor, ornull.
Reporting/outcomes:get
Returns the learning outcomes captured on a pupil’s report in a published reporting period.
Request
GET /api/reporting/outcomes/<pupil>/<period>
Parameters
<pupil>: ADAM internal pupil identifier (required).<period>: Reporting period identifier (required). The period must be published (see the note above).
Response
The data attribute contains an array with one object per populated learning outcome, across all of the pupil’s subjects. Outcomes with no captured value are omitted, matching the printed report.
{
"data": [
{
"subject_id": 5,
"outcome_id": 41,
"outcome_number": "1",
"outcome_name": "Numbers, Operations and Relationships",
"outcome_description": "Recognises, describes and represents numbers.",
"symbol": "4",
"symbol_name": "Adequate",
"symbol_description": "Adequate achievement (50 – 59%)",
"mark": null,
"weighting": 25,
"comment": null
}
],
"message": "",
"response": {
"error": "OK",
"code": 200
}
}
subject_idis the subject the learning outcome belongs to.outcome_idis the internal identifier of the learning outcome.outcome_numberis the outcome’s display number.outcome_nameis the outcome’s name.outcome_descriptionis the outcome’s longer description.symbolis the captured symbol/level for the outcome, ornull.symbol_nameis the name associated with that symbol, ornull.symbol_descriptionis the description associated with that symbol, ornull.markis the numeric mark for the outcome as a float, ornullwhen the outcome is assessed by symbol rather than a mark.weightingis the outcome’s weighting as a float, ornull.commentis the outcome comment, ornull.
Reporting/standards:get
Returns the assessment standards captured on a pupil’s report in a published reporting period.
Request
GET /api/reporting/standards/<pupil>/<period>
Parameters
<pupil>: ADAM internal pupil identifier (required).<period>: Reporting period identifier (required). The period must be published (see the note above).
Response
The data attribute contains an array with one object per assessment standard that has a captured symbol, across all of the pupil’s learning outcomes. Standards with no captured symbol are omitted, matching the printed report.
{
"data": [
{
"subject_id": 5,
"outcome_id": 41,
"criterion_id": 233,
"criterion_number": "1.1",
"criterion_name": "Counts objects",
"criterion_description": "Counts to at least 100 everyday objects reliably.",
"symbol": "3"
}
],
"message": "",
"response": {
"error": "OK",
"code": 200
}
}
subject_idis the subject the assessment standard belongs to.outcome_idis the learning outcome the standard falls under.criterion_idis the internal identifier of the assessment standard (criterion).criterion_numberis the standard’s display number, ornull.criterion_nameis the standard’s name, ornull.criterion_descriptionis the standard’s longer description, ornull.symbolis the captured symbol for the standard, ornull.
Reporting/indicators:get
Returns the behavioural indicators captured on a pupil’s report in a published reporting period.
Request
GET /api/reporting/indicators/<pupil>/<period>
Parameters
<pupil>: ADAM internal pupil identifier (required).<period>: Reporting period identifier (required). The period must be published (see the note above).
Response
The data attribute contains an array with one object per behavioural indicator captured against a subject. Behavioural indicators are configured per grade and period, so a period/grade without a behavioural-indicator configuration returns an empty array.
{
"data": [
{
"subject_id": 5,
"descriptor": "Participates in class",
"value": "Often"
}
],
"message": "",
"response": {
"error": "OK",
"code": 200
}
}
subject_idis the subject the behavioural indicator was captured against.descriptoris the behavioural indicator descriptor.valueis the captured value for the indicator, ornull.
Reporting/grade/comments:get
Returns the same detail as Reporting/comments, but for every pupil registered for a given subject in a given grade during a published reporting period, rather than a single pupil.
Each row carries two extra leading keys — pupil_id and pupil_admin — identifying the pupil the row
belongs to. The remaining keys are exactly those of the pupil-scoped endpoint. The publication rules and
null handling described in the note above apply identically.
Request
GET /api/reporting/grade/comments/<grade>/<subject>/<period>
Parameters
<grade>: The grade identifier (required). Values are integers between -3 (Grade 0000) and 13 (Post Matric); negative values denote pre-primary grades.<subject>: The internal subject identifier (required).<period>: Reporting period identifier (required). The period must be published (see the note above).
Response
The data attribute contains an array with one object per subject per pupil in the cohort.
{
"data": [
{
"pupil_id": 1754,
"pupil_admin": "55012",
"subject_id": 5,
"subject_name": "Mathematics",
"subject_short": "Maths",
"subject_category_id": 2,
"class_id": 812,
"class_friendly": "10A Maths",
"teacher_name": "Mr Smith",
"comment": "A pleasing term's work.",
"comment_generic": null,
"result_term": 78,
"result_ytd": 74.5,
"symbol_term": "B",
"symbol_ytd": "B",
"level": null
}
],
"message": "",
"response": {
"error": "OK",
"code": 200
}
}
pupil_idis the internal identifier of the pupil the row belongs to.pupil_adminis that pupil’s user-provided identifier.- All remaining fields are as described under Reporting/comments.
Reporting/grade/outcomes:get
Returns the same detail as Reporting/outcomes, for every pupil registered
for a given subject in a given grade during a published reporting period. Each row is prefixed with
pupil_id and pupil_admin; the remaining fields match the pupil-scoped endpoint.
Request
GET /api/reporting/grade/outcomes/<grade>/<subject>/<period>
Parameters
<grade>: The grade identifier (required). Values are integers between -3 (Grade 0000) and 13 (Post Matric); negative values denote pre-primary grades.<subject>: The internal subject identifier (required).<period>: Reporting period identifier (required). The period must be published (see the note above).
Response
As Reporting/outcomes, with each row prefixed by pupil_id and
pupil_admin.
Reporting/grade/standards:get
Returns the same detail as Reporting/standards, for every pupil
registered for a given subject in a given grade during a published reporting period. Each row is prefixed
with pupil_id and pupil_admin; the remaining fields match the pupil-scoped endpoint.
Request
GET /api/reporting/grade/standards/<grade>/<subject>/<period>
Parameters
<grade>: The grade identifier (required). Values are integers between -3 (Grade 0000) and 13 (Post Matric); negative values denote pre-primary grades.<subject>: The internal subject identifier (required).<period>: Reporting period identifier (required). The period must be published (see the note above).
Response
As Reporting/standards, with each row prefixed by pupil_id and
pupil_admin.
Reporting/grade/indicators:get
Returns the same detail as Reporting/indicators, for every pupil
registered for a given subject in a given grade during a published reporting period. Each row is prefixed
with pupil_id and pupil_admin; the remaining fields match the pupil-scoped endpoint.
Request
GET /api/reporting/grade/indicators/<grade>/<subject>/<period>
Parameters
<grade>: The grade identifier (required). Values are integers between -3 (Grade 0000) and 13 (Post Matric); negative values denote pre-primary grades.<subject>: The internal subject identifier (required).<period>: Reporting period identifier (required). The period must be published (see the note above).
Response
As Reporting/indicators, with each row prefixed by pupil_id and
pupil_admin.
