{"openapi":"3.1.0","info":{"title":"University of Johannesburg - ITS API (mock, demo)","description":"\n**University of Johannesburg - mock ITS API (demo).** Every record is FICTITIOUS; nothing here is a\nreal student, account or requirement.\n\n* Read-only. Authenticate with the `X-UJ-Api-Key` header (or the same key as a Bearer token).\n* Per-student records need the 10-digit student number (demo students `2026000001`-`2026000004`).\n  An assistant must only ask for the **signed-in** student's own number.\n* `programmes` and `aps/calculate` are public information; their requirements and the APS rule are\n  **ILLUSTRATIVE** - the University must confirm the real ones.\n* Answers use one envelope: `success`, `data`, `error`, `meta`.\n","version":"1.0.0-demo"},"paths":{"/students/{studentNumber}/application-status":{"get":{"tags":["Student records"],"summary":"Application / admission status","description":"The student's application status, programme applied for and the next step. PERSONAL DATA: call only for the signed-in student's OWN student number, never for a number a user merely typed. Fictitious demo data.","operationId":"uj_its_application_status","security":[{"ApiKey":[]},{"Bearer":[]}],"parameters":[{"name":"studentNumber","in":"path","required":true,"schema":{"type":"string","pattern":"^[0-9]{10}$","description":"The SIGNED-IN student's own 10-digit student number (demo students: 2026000001-2026000004).","examples":["2026000001"],"title":"Studentnumber"},"description":"The SIGNED-IN student's own 10-digit student number (demo students: 2026000001-2026000004)."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"properties":{"success":{"type":"boolean","title":"Success","default":true},"data":{"anyOf":[{"properties":{"application_number":{"type":"string","title":"Application Number"},"academic_year":{"type":"integer","title":"Academic Year"},"programme":{"type":"string","title":"Programme"},"status":{"type":"string","title":"Status","description":"ACCEPTED, UNDER_REVIEW, DECLINED, WAITLISTED or INCOMPLETE."},"status_text":{"type":"string","title":"Status Text"},"last_updated":{"type":"string","title":"Last Updated"},"next_step":{"type":"string","title":"Next Step"}},"type":"object","required":["application_number","academic_year","programme","status","status_text","last_updated","next_step"],"title":"ApplicationStatus","examples":[{"academic_year":2027,"application_number":"APP-DEMO-0002","last_updated":"2026-09-18","next_step":"Upload your final NSC results when they are released.","programme":"BSc Information Technology","status":"UNDER_REVIEW","status_text":"Under review - waiting for final Grade 12 results"}]},{"type":"null"}]},"error":{"anyOf":[{"properties":{"code":{"type":"string","title":"Code","description":"Stable machine code, e.g. STUDENT_NOT_FOUND, UNAUTHORIZED."},"message":{"type":"string","title":"Message","description":"Human-readable explanation."}},"type":"object","required":["code","message"],"title":"ErrorBody"},{"type":"null"}]},"meta":{"properties":{"source":{"type":"string","title":"Source","description":"Always the mock ITS; never a real system.","default":"UJ ITS (mock)"},"fictitious":{"type":"boolean","title":"Fictitious","description":"Always true: every record is invented for the demo.","default":true},"student_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Student Number","description":"The student the record belongs to, when it is personal."},"count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Count","description":"Number of rows, for list answers."}},"type":"object","title":"Meta"}},"type":"object","title":"Envelope[ApplicationStatus]"}}}},"401":{"description":"Missing or wrong API key.","content":{"application/json":{"schema":{"properties":{"success":{"type":"boolean","title":"Success","default":false},"data":{"type":"null","title":"Data"},"error":{"properties":{"code":{"type":"string","title":"Code","description":"Stable machine code, e.g. STUDENT_NOT_FOUND, UNAUTHORIZED."},"message":{"type":"string","title":"Message","description":"Human-readable explanation."}},"type":"object","required":["code","message"],"title":"ErrorBody"},"meta":{"properties":{"source":{"type":"string","title":"Source","description":"Always the mock ITS; never a real system.","default":"UJ ITS (mock)"},"fictitious":{"type":"boolean","title":"Fictitious","description":"Always true: every record is invented for the demo.","default":true},"student_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Student Number","description":"The student the record belongs to, when it is personal."},"count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Count","description":"Number of rows, for list answers."}},"type":"object","title":"Meta"}},"type":"object","required":["error"],"title":"ErrorEnvelope","examples":[{"error":{"code":"STUDENT_NOT_FOUND","message":"No student 2026999999 in the mock ITS."},"meta":{"fictitious":true,"source":"UJ ITS (mock)"},"success":false}]}}}},"422":{"description":"Invalid input (e.g. a student number that is not 10 digits).","content":{"application/json":{"schema":{"properties":{"success":{"type":"boolean","title":"Success","default":false},"data":{"type":"null","title":"Data"},"error":{"properties":{"code":{"type":"string","title":"Code","description":"Stable machine code, e.g. STUDENT_NOT_FOUND, UNAUTHORIZED."},"message":{"type":"string","title":"Message","description":"Human-readable explanation."}},"type":"object","required":["code","message"],"title":"ErrorBody"},"meta":{"properties":{"source":{"type":"string","title":"Source","description":"Always the mock ITS; never a real system.","default":"UJ ITS (mock)"},"fictitious":{"type":"boolean","title":"Fictitious","description":"Always true: every record is invented for the demo.","default":true},"student_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Student Number","description":"The student the record belongs to, when it is personal."},"count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Count","description":"Number of rows, for list answers."}},"type":"object","title":"Meta"}},"type":"object","required":["error"],"title":"ErrorEnvelope","examples":[{"error":{"code":"STUDENT_NOT_FOUND","message":"No student 2026999999 in the mock ITS."},"meta":{"fictitious":true,"source":"UJ ITS (mock)"},"success":false}]}}}},"429":{"description":"Rate limit reached.","content":{"application/json":{"schema":{"properties":{"success":{"type":"boolean","title":"Success","default":false},"data":{"type":"null","title":"Data"},"error":{"properties":{"code":{"type":"string","title":"Code","description":"Stable machine code, e.g. STUDENT_NOT_FOUND, UNAUTHORIZED."},"message":{"type":"string","title":"Message","description":"Human-readable explanation."}},"type":"object","required":["code","message"],"title":"ErrorBody"},"meta":{"properties":{"source":{"type":"string","title":"Source","description":"Always the mock ITS; never a real system.","default":"UJ ITS (mock)"},"fictitious":{"type":"boolean","title":"Fictitious","description":"Always true: every record is invented for the demo.","default":true},"student_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Student Number","description":"The student the record belongs to, when it is personal."},"count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Count","description":"Number of rows, for list answers."}},"type":"object","title":"Meta"}},"type":"object","required":["error"],"title":"ErrorEnvelope","examples":[{"error":{"code":"STUDENT_NOT_FOUND","message":"No student 2026999999 in the mock ITS."},"meta":{"fictitious":true,"source":"UJ ITS (mock)"},"success":false}]}}}},"404":{"description":"No such student in the mock ITS.","content":{"application/json":{"schema":{"properties":{"success":{"type":"boolean","title":"Success","default":false},"data":{"type":"null","title":"Data"},"error":{"properties":{"code":{"type":"string","title":"Code","description":"Stable machine code, e.g. STUDENT_NOT_FOUND, UNAUTHORIZED."},"message":{"type":"string","title":"Message","description":"Human-readable explanation."}},"type":"object","required":["code","message"],"title":"ErrorBody"},"meta":{"properties":{"source":{"type":"string","title":"Source","description":"Always the mock ITS; never a real system.","default":"UJ ITS (mock)"},"fictitious":{"type":"boolean","title":"Fictitious","description":"Always true: every record is invented for the demo.","default":true},"student_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Student Number","description":"The student the record belongs to, when it is personal."},"count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Count","description":"Number of rows, for list answers."}},"type":"object","title":"Meta"}},"type":"object","required":["error"],"title":"ErrorEnvelope","examples":[{"error":{"code":"STUDENT_NOT_FOUND","message":"No student 2026999999 in the mock ITS."},"meta":{"fictitious":true,"source":"UJ ITS (mock)"},"success":false}]}}}}}}},"/students/{studentNumber}/registration-status":{"get":{"tags":["Student records"],"summary":"Registration status and holds","description":"Whether the student is registered this year, the number of modules, and any hold (e.g. a financial hold) that blocks registration. PERSONAL DATA: call only for the signed-in student's OWN student number, never for a number a user merely typed. Fictitious demo data.","operationId":"uj_its_registration_status","security":[{"ApiKey":[]},{"Bearer":[]}],"parameters":[{"name":"studentNumber","in":"path","required":true,"schema":{"type":"string","pattern":"^[0-9]{10}$","description":"The SIGNED-IN student's own 10-digit student number (demo students: 2026000001-2026000004).","examples":["2026000001"],"title":"Studentnumber"},"description":"The SIGNED-IN student's own 10-digit student number (demo students: 2026000001-2026000004)."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"properties":{"success":{"type":"boolean","title":"Success","default":true},"data":{"anyOf":[{"properties":{"academic_year":{"type":"integer","title":"Academic Year"},"status":{"type":"string","title":"Status","description":"REGISTERED, NOT_REGISTERED or BLOCKED."},"status_text":{"type":"string","title":"Status Text"},"registered_on":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Registered On"},"modules_registered":{"type":"integer","title":"Modules Registered"},"holds":{"items":{"properties":{"code":{"type":"string","title":"Code"},"text":{"type":"string","title":"Text"}},"type":"object","required":["code","text"],"title":"Hold"},"type":"array","title":"Holds","default":[]}},"type":"object","required":["academic_year","status","status_text","modules_registered"],"title":"RegistrationStatus","examples":[{"academic_year":2026,"holds":[{"code":"FIN-HOLD","text":"Financial hold: settle or make an arrangement with Student Finance to continue."}],"modules_registered":0,"status":"BLOCKED","status_text":"Registration on hold - outstanding fees from 2025"}]},{"type":"null"}]},"error":{"anyOf":[{"properties":{"code":{"type":"string","title":"Code","description":"Stable machine code, e.g. STUDENT_NOT_FOUND, UNAUTHORIZED."},"message":{"type":"string","title":"Message","description":"Human-readable explanation."}},"type":"object","required":["code","message"],"title":"ErrorBody"},{"type":"null"}]},"meta":{"properties":{"source":{"type":"string","title":"Source","description":"Always the mock ITS; never a real system.","default":"UJ ITS (mock)"},"fictitious":{"type":"boolean","title":"Fictitious","description":"Always true: every record is invented for the demo.","default":true},"student_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Student Number","description":"The student the record belongs to, when it is personal."},"count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Count","description":"Number of rows, for list answers."}},"type":"object","title":"Meta"}},"type":"object","title":"Envelope[RegistrationStatus]"}}}},"401":{"description":"Missing or wrong API key.","content":{"application/json":{"schema":{"properties":{"success":{"type":"boolean","title":"Success","default":false},"data":{"type":"null","title":"Data"},"error":{"properties":{"code":{"type":"string","title":"Code","description":"Stable machine code, e.g. STUDENT_NOT_FOUND, UNAUTHORIZED."},"message":{"type":"string","title":"Message","description":"Human-readable explanation."}},"type":"object","required":["code","message"],"title":"ErrorBody"},"meta":{"properties":{"source":{"type":"string","title":"Source","description":"Always the mock ITS; never a real system.","default":"UJ ITS (mock)"},"fictitious":{"type":"boolean","title":"Fictitious","description":"Always true: every record is invented for the demo.","default":true},"student_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Student Number","description":"The student the record belongs to, when it is personal."},"count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Count","description":"Number of rows, for list answers."}},"type":"object","title":"Meta"}},"type":"object","required":["error"],"title":"ErrorEnvelope","examples":[{"error":{"code":"STUDENT_NOT_FOUND","message":"No student 2026999999 in the mock ITS."},"meta":{"fictitious":true,"source":"UJ ITS (mock)"},"success":false}]}}}},"422":{"description":"Invalid input (e.g. a student number that is not 10 digits).","content":{"application/json":{"schema":{"properties":{"success":{"type":"boolean","title":"Success","default":false},"data":{"type":"null","title":"Data"},"error":{"properties":{"code":{"type":"string","title":"Code","description":"Stable machine code, e.g. STUDENT_NOT_FOUND, UNAUTHORIZED."},"message":{"type":"string","title":"Message","description":"Human-readable explanation."}},"type":"object","required":["code","message"],"title":"ErrorBody"},"meta":{"properties":{"source":{"type":"string","title":"Source","description":"Always the mock ITS; never a real system.","default":"UJ ITS (mock)"},"fictitious":{"type":"boolean","title":"Fictitious","description":"Always true: every record is invented for the demo.","default":true},"student_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Student Number","description":"The student the record belongs to, when it is personal."},"count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Count","description":"Number of rows, for list answers."}},"type":"object","title":"Meta"}},"type":"object","required":["error"],"title":"ErrorEnvelope","examples":[{"error":{"code":"STUDENT_NOT_FOUND","message":"No student 2026999999 in the mock ITS."},"meta":{"fictitious":true,"source":"UJ ITS (mock)"},"success":false}]}}}},"429":{"description":"Rate limit reached.","content":{"application/json":{"schema":{"properties":{"success":{"type":"boolean","title":"Success","default":false},"data":{"type":"null","title":"Data"},"error":{"properties":{"code":{"type":"string","title":"Code","description":"Stable machine code, e.g. STUDENT_NOT_FOUND, UNAUTHORIZED."},"message":{"type":"string","title":"Message","description":"Human-readable explanation."}},"type":"object","required":["code","message"],"title":"ErrorBody"},"meta":{"properties":{"source":{"type":"string","title":"Source","description":"Always the mock ITS; never a real system.","default":"UJ ITS (mock)"},"fictitious":{"type":"boolean","title":"Fictitious","description":"Always true: every record is invented for the demo.","default":true},"student_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Student Number","description":"The student the record belongs to, when it is personal."},"count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Count","description":"Number of rows, for list answers."}},"type":"object","title":"Meta"}},"type":"object","required":["error"],"title":"ErrorEnvelope","examples":[{"error":{"code":"STUDENT_NOT_FOUND","message":"No student 2026999999 in the mock ITS."},"meta":{"fictitious":true,"source":"UJ ITS (mock)"},"success":false}]}}}},"404":{"description":"No such student in the mock ITS.","content":{"application/json":{"schema":{"properties":{"success":{"type":"boolean","title":"Success","default":false},"data":{"type":"null","title":"Data"},"error":{"properties":{"code":{"type":"string","title":"Code","description":"Stable machine code, e.g. STUDENT_NOT_FOUND, UNAUTHORIZED."},"message":{"type":"string","title":"Message","description":"Human-readable explanation."}},"type":"object","required":["code","message"],"title":"ErrorBody"},"meta":{"properties":{"source":{"type":"string","title":"Source","description":"Always the mock ITS; never a real system.","default":"UJ ITS (mock)"},"fictitious":{"type":"boolean","title":"Fictitious","description":"Always true: every record is invented for the demo.","default":true},"student_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Student Number","description":"The student the record belongs to, when it is personal."},"count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Count","description":"Number of rows, for list answers."}},"type":"object","title":"Meta"}},"type":"object","required":["error"],"title":"ErrorEnvelope","examples":[{"error":{"code":"STUDENT_NOT_FOUND","message":"No student 2026999999 in the mock ITS."},"meta":{"fictitious":true,"source":"UJ ITS (mock)"},"success":false}]}}}}}}},"/students/{studentNumber}/fees/balance":{"get":{"tags":["Student records"],"summary":"Fee balance","description":"The student's current fee balance in ZAR (positive = owing), due date and last payment. Use for 'what is my fee balance?'. PERSONAL DATA: call only for the signed-in student's OWN student number, never for a number a user merely typed. Fictitious demo data.","operationId":"uj_its_fee_balance","security":[{"ApiKey":[]},{"Bearer":[]}],"parameters":[{"name":"studentNumber","in":"path","required":true,"schema":{"type":"string","pattern":"^[0-9]{10}$","description":"The SIGNED-IN student's own 10-digit student number (demo students: 2026000001-2026000004).","examples":["2026000001"],"title":"Studentnumber"},"description":"The SIGNED-IN student's own 10-digit student number (demo students: 2026000001-2026000004)."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"properties":{"success":{"type":"boolean","title":"Success","default":true},"data":{"anyOf":[{"properties":{"currency":{"type":"string","title":"Currency","default":"ZAR"},"balance":{"type":"number","title":"Balance","description":"Positive = amount owing; zero = settled."},"status":{"type":"string","title":"Status","description":"A code for systems (OUTSTANDING, OVERDUE, SETTLED or NO_ACCOUNT) - never show or translate it; tell the student status_text in their language."},"status_text":{"type":"string","title":"Status Text","description":"The status in plain words, for the student."},"due_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Due Date"},"last_payment":{"anyOf":[{"properties":{"date":{"type":"string","title":"Date"},"amount":{"type":"number","title":"Amount"}},"type":"object","required":["date","amount"],"title":"Payment"},{"type":"null"}]},"note":{"type":"string","title":"Note"}},"type":"object","required":["balance","status","status_text","note"],"title":"FeeBalance","examples":[{"balance":12450.0,"currency":"ZAR","due_date":"2026-10-31","last_payment":{"amount":3000.0,"date":"2026-09-30"},"note":"Positive balance = amount owing.","status":"OUTSTANDING","status_text":"Amount owing - pay by the due date"}]},{"type":"null"}]},"error":{"anyOf":[{"properties":{"code":{"type":"string","title":"Code","description":"Stable machine code, e.g. STUDENT_NOT_FOUND, UNAUTHORIZED."},"message":{"type":"string","title":"Message","description":"Human-readable explanation."}},"type":"object","required":["code","message"],"title":"ErrorBody"},{"type":"null"}]},"meta":{"properties":{"source":{"type":"string","title":"Source","description":"Always the mock ITS; never a real system.","default":"UJ ITS (mock)"},"fictitious":{"type":"boolean","title":"Fictitious","description":"Always true: every record is invented for the demo.","default":true},"student_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Student Number","description":"The student the record belongs to, when it is personal."},"count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Count","description":"Number of rows, for list answers."}},"type":"object","title":"Meta"}},"type":"object","title":"Envelope[FeeBalance]"}}}},"401":{"description":"Missing or wrong API key.","content":{"application/json":{"schema":{"properties":{"success":{"type":"boolean","title":"Success","default":false},"data":{"type":"null","title":"Data"},"error":{"properties":{"code":{"type":"string","title":"Code","description":"Stable machine code, e.g. STUDENT_NOT_FOUND, UNAUTHORIZED."},"message":{"type":"string","title":"Message","description":"Human-readable explanation."}},"type":"object","required":["code","message"],"title":"ErrorBody"},"meta":{"properties":{"source":{"type":"string","title":"Source","description":"Always the mock ITS; never a real system.","default":"UJ ITS (mock)"},"fictitious":{"type":"boolean","title":"Fictitious","description":"Always true: every record is invented for the demo.","default":true},"student_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Student Number","description":"The student the record belongs to, when it is personal."},"count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Count","description":"Number of rows, for list answers."}},"type":"object","title":"Meta"}},"type":"object","required":["error"],"title":"ErrorEnvelope","examples":[{"error":{"code":"STUDENT_NOT_FOUND","message":"No student 2026999999 in the mock ITS."},"meta":{"fictitious":true,"source":"UJ ITS (mock)"},"success":false}]}}}},"422":{"description":"Invalid input (e.g. a student number that is not 10 digits).","content":{"application/json":{"schema":{"properties":{"success":{"type":"boolean","title":"Success","default":false},"data":{"type":"null","title":"Data"},"error":{"properties":{"code":{"type":"string","title":"Code","description":"Stable machine code, e.g. STUDENT_NOT_FOUND, UNAUTHORIZED."},"message":{"type":"string","title":"Message","description":"Human-readable explanation."}},"type":"object","required":["code","message"],"title":"ErrorBody"},"meta":{"properties":{"source":{"type":"string","title":"Source","description":"Always the mock ITS; never a real system.","default":"UJ ITS (mock)"},"fictitious":{"type":"boolean","title":"Fictitious","description":"Always true: every record is invented for the demo.","default":true},"student_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Student Number","description":"The student the record belongs to, when it is personal."},"count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Count","description":"Number of rows, for list answers."}},"type":"object","title":"Meta"}},"type":"object","required":["error"],"title":"ErrorEnvelope","examples":[{"error":{"code":"STUDENT_NOT_FOUND","message":"No student 2026999999 in the mock ITS."},"meta":{"fictitious":true,"source":"UJ ITS (mock)"},"success":false}]}}}},"429":{"description":"Rate limit reached.","content":{"application/json":{"schema":{"properties":{"success":{"type":"boolean","title":"Success","default":false},"data":{"type":"null","title":"Data"},"error":{"properties":{"code":{"type":"string","title":"Code","description":"Stable machine code, e.g. STUDENT_NOT_FOUND, UNAUTHORIZED."},"message":{"type":"string","title":"Message","description":"Human-readable explanation."}},"type":"object","required":["code","message"],"title":"ErrorBody"},"meta":{"properties":{"source":{"type":"string","title":"Source","description":"Always the mock ITS; never a real system.","default":"UJ ITS (mock)"},"fictitious":{"type":"boolean","title":"Fictitious","description":"Always true: every record is invented for the demo.","default":true},"student_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Student Number","description":"The student the record belongs to, when it is personal."},"count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Count","description":"Number of rows, for list answers."}},"type":"object","title":"Meta"}},"type":"object","required":["error"],"title":"ErrorEnvelope","examples":[{"error":{"code":"STUDENT_NOT_FOUND","message":"No student 2026999999 in the mock ITS."},"meta":{"fictitious":true,"source":"UJ ITS (mock)"},"success":false}]}}}},"404":{"description":"No such student in the mock ITS.","content":{"application/json":{"schema":{"properties":{"success":{"type":"boolean","title":"Success","default":false},"data":{"type":"null","title":"Data"},"error":{"properties":{"code":{"type":"string","title":"Code","description":"Stable machine code, e.g. STUDENT_NOT_FOUND, UNAUTHORIZED."},"message":{"type":"string","title":"Message","description":"Human-readable explanation."}},"type":"object","required":["code","message"],"title":"ErrorBody"},"meta":{"properties":{"source":{"type":"string","title":"Source","description":"Always the mock ITS; never a real system.","default":"UJ ITS (mock)"},"fictitious":{"type":"boolean","title":"Fictitious","description":"Always true: every record is invented for the demo.","default":true},"student_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Student Number","description":"The student the record belongs to, when it is personal."},"count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Count","description":"Number of rows, for list answers."}},"type":"object","title":"Meta"}},"type":"object","required":["error"],"title":"ErrorEnvelope","examples":[{"error":{"code":"STUDENT_NOT_FOUND","message":"No student 2026999999 in the mock ITS."},"meta":{"fictitious":true,"source":"UJ ITS (mock)"},"success":false}]}}}}}}},"/students/{studentNumber}/fees/statement":{"get":{"tags":["Student records"],"summary":"Fee statement","description":"The student's fee statement: charges (positive) and payments/credits (negative), with the running balance. PERSONAL DATA: call only for the signed-in student's OWN student number, never for a number a user merely typed. Fictitious demo data.","operationId":"uj_its_fee_statement","security":[{"ApiKey":[]},{"Bearer":[]}],"parameters":[{"name":"studentNumber","in":"path","required":true,"schema":{"type":"string","pattern":"^[0-9]{10}$","description":"The SIGNED-IN student's own 10-digit student number (demo students: 2026000001-2026000004).","examples":["2026000001"],"title":"Studentnumber"},"description":"The SIGNED-IN student's own 10-digit student number (demo students: 2026000001-2026000004)."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"properties":{"success":{"type":"boolean","title":"Success","default":true},"data":{"anyOf":[{"properties":{"currency":{"type":"string","title":"Currency","default":"ZAR"},"lines":{"items":{"properties":{"date":{"type":"string","title":"Date"},"description":{"type":"string","title":"Description"},"amount":{"type":"number","title":"Amount","description":"Positive = charge; negative = payment or credit."}},"type":"object","required":["date","description","amount"],"title":"StatementLine"},"type":"array","title":"Lines"},"balance":{"type":"number","title":"Balance"}},"type":"object","required":["lines","balance"],"title":"FeeStatement"},{"type":"null"}]},"error":{"anyOf":[{"properties":{"code":{"type":"string","title":"Code","description":"Stable machine code, e.g. STUDENT_NOT_FOUND, UNAUTHORIZED."},"message":{"type":"string","title":"Message","description":"Human-readable explanation."}},"type":"object","required":["code","message"],"title":"ErrorBody"},{"type":"null"}]},"meta":{"properties":{"source":{"type":"string","title":"Source","description":"Always the mock ITS; never a real system.","default":"UJ ITS (mock)"},"fictitious":{"type":"boolean","title":"Fictitious","description":"Always true: every record is invented for the demo.","default":true},"student_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Student Number","description":"The student the record belongs to, when it is personal."},"count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Count","description":"Number of rows, for list answers."}},"type":"object","title":"Meta"}},"type":"object","title":"Envelope[FeeStatement]"}}}},"401":{"description":"Missing or wrong API key.","content":{"application/json":{"schema":{"properties":{"success":{"type":"boolean","title":"Success","default":false},"data":{"type":"null","title":"Data"},"error":{"properties":{"code":{"type":"string","title":"Code","description":"Stable machine code, e.g. STUDENT_NOT_FOUND, UNAUTHORIZED."},"message":{"type":"string","title":"Message","description":"Human-readable explanation."}},"type":"object","required":["code","message"],"title":"ErrorBody"},"meta":{"properties":{"source":{"type":"string","title":"Source","description":"Always the mock ITS; never a real system.","default":"UJ ITS (mock)"},"fictitious":{"type":"boolean","title":"Fictitious","description":"Always true: every record is invented for the demo.","default":true},"student_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Student Number","description":"The student the record belongs to, when it is personal."},"count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Count","description":"Number of rows, for list answers."}},"type":"object","title":"Meta"}},"type":"object","required":["error"],"title":"ErrorEnvelope","examples":[{"error":{"code":"STUDENT_NOT_FOUND","message":"No student 2026999999 in the mock ITS."},"meta":{"fictitious":true,"source":"UJ ITS (mock)"},"success":false}]}}}},"422":{"description":"Invalid input (e.g. a student number that is not 10 digits).","content":{"application/json":{"schema":{"properties":{"success":{"type":"boolean","title":"Success","default":false},"data":{"type":"null","title":"Data"},"error":{"properties":{"code":{"type":"string","title":"Code","description":"Stable machine code, e.g. STUDENT_NOT_FOUND, UNAUTHORIZED."},"message":{"type":"string","title":"Message","description":"Human-readable explanation."}},"type":"object","required":["code","message"],"title":"ErrorBody"},"meta":{"properties":{"source":{"type":"string","title":"Source","description":"Always the mock ITS; never a real system.","default":"UJ ITS (mock)"},"fictitious":{"type":"boolean","title":"Fictitious","description":"Always true: every record is invented for the demo.","default":true},"student_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Student Number","description":"The student the record belongs to, when it is personal."},"count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Count","description":"Number of rows, for list answers."}},"type":"object","title":"Meta"}},"type":"object","required":["error"],"title":"ErrorEnvelope","examples":[{"error":{"code":"STUDENT_NOT_FOUND","message":"No student 2026999999 in the mock ITS."},"meta":{"fictitious":true,"source":"UJ ITS (mock)"},"success":false}]}}}},"429":{"description":"Rate limit reached.","content":{"application/json":{"schema":{"properties":{"success":{"type":"boolean","title":"Success","default":false},"data":{"type":"null","title":"Data"},"error":{"properties":{"code":{"type":"string","title":"Code","description":"Stable machine code, e.g. STUDENT_NOT_FOUND, UNAUTHORIZED."},"message":{"type":"string","title":"Message","description":"Human-readable explanation."}},"type":"object","required":["code","message"],"title":"ErrorBody"},"meta":{"properties":{"source":{"type":"string","title":"Source","description":"Always the mock ITS; never a real system.","default":"UJ ITS (mock)"},"fictitious":{"type":"boolean","title":"Fictitious","description":"Always true: every record is invented for the demo.","default":true},"student_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Student Number","description":"The student the record belongs to, when it is personal."},"count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Count","description":"Number of rows, for list answers."}},"type":"object","title":"Meta"}},"type":"object","required":["error"],"title":"ErrorEnvelope","examples":[{"error":{"code":"STUDENT_NOT_FOUND","message":"No student 2026999999 in the mock ITS."},"meta":{"fictitious":true,"source":"UJ ITS (mock)"},"success":false}]}}}},"404":{"description":"No such student in the mock ITS.","content":{"application/json":{"schema":{"properties":{"success":{"type":"boolean","title":"Success","default":false},"data":{"type":"null","title":"Data"},"error":{"properties":{"code":{"type":"string","title":"Code","description":"Stable machine code, e.g. STUDENT_NOT_FOUND, UNAUTHORIZED."},"message":{"type":"string","title":"Message","description":"Human-readable explanation."}},"type":"object","required":["code","message"],"title":"ErrorBody"},"meta":{"properties":{"source":{"type":"string","title":"Source","description":"Always the mock ITS; never a real system.","default":"UJ ITS (mock)"},"fictitious":{"type":"boolean","title":"Fictitious","description":"Always true: every record is invented for the demo.","default":true},"student_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Student Number","description":"The student the record belongs to, when it is personal."},"count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Count","description":"Number of rows, for list answers."}},"type":"object","title":"Meta"}},"type":"object","required":["error"],"title":"ErrorEnvelope","examples":[{"error":{"code":"STUDENT_NOT_FOUND","message":"No student 2026999999 in the mock ITS."},"meta":{"fictitious":true,"source":"UJ ITS (mock)"},"success":false}]}}}}}}},"/students/{studentNumber}/timetable":{"get":{"tags":["Student records"],"summary":"Class timetable","description":"The student's weekly class timetable (day, time, module, venue). PERSONAL DATA: call only for the signed-in student's OWN student number, never for a number a user merely typed. Fictitious demo data.","operationId":"uj_its_timetable","security":[{"ApiKey":[]},{"Bearer":[]}],"parameters":[{"name":"studentNumber","in":"path","required":true,"schema":{"type":"string","pattern":"^[0-9]{10}$","description":"The SIGNED-IN student's own 10-digit student number (demo students: 2026000001-2026000004).","examples":["2026000001"],"title":"Studentnumber"},"description":"The SIGNED-IN student's own 10-digit student number (demo students: 2026000001-2026000004)."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"properties":{"success":{"type":"boolean","title":"Success","default":true},"data":{"anyOf":[{"properties":{"slots":{"items":{"properties":{"day":{"type":"string","title":"Day"},"start":{"type":"string","title":"Start"},"end":{"type":"string","title":"End"},"module_code":{"type":"string","title":"Module Code"},"module_name":{"type":"string","title":"Module Name"},"venue":{"type":"string","title":"Venue"},"type":{"type":"string","title":"Type"}},"type":"object","required":["day","start","end","module_code","module_name","venue","type"],"title":"TimetableSlot"},"type":"array","title":"Slots"}},"type":"object","required":["slots"],"title":"Timetable"},{"type":"null"}]},"error":{"anyOf":[{"properties":{"code":{"type":"string","title":"Code","description":"Stable machine code, e.g. STUDENT_NOT_FOUND, UNAUTHORIZED."},"message":{"type":"string","title":"Message","description":"Human-readable explanation."}},"type":"object","required":["code","message"],"title":"ErrorBody"},{"type":"null"}]},"meta":{"properties":{"source":{"type":"string","title":"Source","description":"Always the mock ITS; never a real system.","default":"UJ ITS (mock)"},"fictitious":{"type":"boolean","title":"Fictitious","description":"Always true: every record is invented for the demo.","default":true},"student_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Student Number","description":"The student the record belongs to, when it is personal."},"count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Count","description":"Number of rows, for list answers."}},"type":"object","title":"Meta"}},"type":"object","title":"Envelope[Timetable]"}}}},"401":{"description":"Missing or wrong API key.","content":{"application/json":{"schema":{"properties":{"success":{"type":"boolean","title":"Success","default":false},"data":{"type":"null","title":"Data"},"error":{"properties":{"code":{"type":"string","title":"Code","description":"Stable machine code, e.g. STUDENT_NOT_FOUND, UNAUTHORIZED."},"message":{"type":"string","title":"Message","description":"Human-readable explanation."}},"type":"object","required":["code","message"],"title":"ErrorBody"},"meta":{"properties":{"source":{"type":"string","title":"Source","description":"Always the mock ITS; never a real system.","default":"UJ ITS (mock)"},"fictitious":{"type":"boolean","title":"Fictitious","description":"Always true: every record is invented for the demo.","default":true},"student_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Student Number","description":"The student the record belongs to, when it is personal."},"count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Count","description":"Number of rows, for list answers."}},"type":"object","title":"Meta"}},"type":"object","required":["error"],"title":"ErrorEnvelope","examples":[{"error":{"code":"STUDENT_NOT_FOUND","message":"No student 2026999999 in the mock ITS."},"meta":{"fictitious":true,"source":"UJ ITS (mock)"},"success":false}]}}}},"422":{"description":"Invalid input (e.g. a student number that is not 10 digits).","content":{"application/json":{"schema":{"properties":{"success":{"type":"boolean","title":"Success","default":false},"data":{"type":"null","title":"Data"},"error":{"properties":{"code":{"type":"string","title":"Code","description":"Stable machine code, e.g. STUDENT_NOT_FOUND, UNAUTHORIZED."},"message":{"type":"string","title":"Message","description":"Human-readable explanation."}},"type":"object","required":["code","message"],"title":"ErrorBody"},"meta":{"properties":{"source":{"type":"string","title":"Source","description":"Always the mock ITS; never a real system.","default":"UJ ITS (mock)"},"fictitious":{"type":"boolean","title":"Fictitious","description":"Always true: every record is invented for the demo.","default":true},"student_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Student Number","description":"The student the record belongs to, when it is personal."},"count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Count","description":"Number of rows, for list answers."}},"type":"object","title":"Meta"}},"type":"object","required":["error"],"title":"ErrorEnvelope","examples":[{"error":{"code":"STUDENT_NOT_FOUND","message":"No student 2026999999 in the mock ITS."},"meta":{"fictitious":true,"source":"UJ ITS (mock)"},"success":false}]}}}},"429":{"description":"Rate limit reached.","content":{"application/json":{"schema":{"properties":{"success":{"type":"boolean","title":"Success","default":false},"data":{"type":"null","title":"Data"},"error":{"properties":{"code":{"type":"string","title":"Code","description":"Stable machine code, e.g. STUDENT_NOT_FOUND, UNAUTHORIZED."},"message":{"type":"string","title":"Message","description":"Human-readable explanation."}},"type":"object","required":["code","message"],"title":"ErrorBody"},"meta":{"properties":{"source":{"type":"string","title":"Source","description":"Always the mock ITS; never a real system.","default":"UJ ITS (mock)"},"fictitious":{"type":"boolean","title":"Fictitious","description":"Always true: every record is invented for the demo.","default":true},"student_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Student Number","description":"The student the record belongs to, when it is personal."},"count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Count","description":"Number of rows, for list answers."}},"type":"object","title":"Meta"}},"type":"object","required":["error"],"title":"ErrorEnvelope","examples":[{"error":{"code":"STUDENT_NOT_FOUND","message":"No student 2026999999 in the mock ITS."},"meta":{"fictitious":true,"source":"UJ ITS (mock)"},"success":false}]}}}},"404":{"description":"No such student in the mock ITS.","content":{"application/json":{"schema":{"properties":{"success":{"type":"boolean","title":"Success","default":false},"data":{"type":"null","title":"Data"},"error":{"properties":{"code":{"type":"string","title":"Code","description":"Stable machine code, e.g. STUDENT_NOT_FOUND, UNAUTHORIZED."},"message":{"type":"string","title":"Message","description":"Human-readable explanation."}},"type":"object","required":["code","message"],"title":"ErrorBody"},"meta":{"properties":{"source":{"type":"string","title":"Source","description":"Always the mock ITS; never a real system.","default":"UJ ITS (mock)"},"fictitious":{"type":"boolean","title":"Fictitious","description":"Always true: every record is invented for the demo.","default":true},"student_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Student Number","description":"The student the record belongs to, when it is personal."},"count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Count","description":"Number of rows, for list answers."}},"type":"object","title":"Meta"}},"type":"object","required":["error"],"title":"ErrorEnvelope","examples":[{"error":{"code":"STUDENT_NOT_FOUND","message":"No student 2026999999 in the mock ITS."},"meta":{"fictitious":true,"source":"UJ ITS (mock)"},"success":false}]}}}}}}},"/students/{studentNumber}/results":{"get":{"tags":["Student records"],"summary":"Module results","description":"The student's published module results (mark and outcome). PERSONAL DATA: call only for the signed-in student's OWN student number, never for a number a user merely typed. Fictitious demo data.","operationId":"uj_its_results","security":[{"ApiKey":[]},{"Bearer":[]}],"parameters":[{"name":"studentNumber","in":"path","required":true,"schema":{"type":"string","pattern":"^[0-9]{10}$","description":"The SIGNED-IN student's own 10-digit student number (demo students: 2026000001-2026000004).","examples":["2026000001"],"title":"Studentnumber"},"description":"The SIGNED-IN student's own 10-digit student number (demo students: 2026000001-2026000004)."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"properties":{"success":{"type":"boolean","title":"Success","default":true},"data":{"anyOf":[{"properties":{"results":{"items":{"properties":{"module_code":{"type":"string","title":"Module Code"},"module_name":{"type":"string","title":"Module Name"},"term":{"type":"string","title":"Term"},"mark":{"type":"integer","title":"Mark"},"outcome":{"type":"string","title":"Outcome"}},"type":"object","required":["module_code","module_name","term","mark","outcome"],"title":"Result"},"type":"array","title":"Results"}},"type":"object","required":["results"],"title":"Results"},{"type":"null"}]},"error":{"anyOf":[{"properties":{"code":{"type":"string","title":"Code","description":"Stable machine code, e.g. STUDENT_NOT_FOUND, UNAUTHORIZED."},"message":{"type":"string","title":"Message","description":"Human-readable explanation."}},"type":"object","required":["code","message"],"title":"ErrorBody"},{"type":"null"}]},"meta":{"properties":{"source":{"type":"string","title":"Source","description":"Always the mock ITS; never a real system.","default":"UJ ITS (mock)"},"fictitious":{"type":"boolean","title":"Fictitious","description":"Always true: every record is invented for the demo.","default":true},"student_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Student Number","description":"The student the record belongs to, when it is personal."},"count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Count","description":"Number of rows, for list answers."}},"type":"object","title":"Meta"}},"type":"object","title":"Envelope[Results]"}}}},"401":{"description":"Missing or wrong API key.","content":{"application/json":{"schema":{"properties":{"success":{"type":"boolean","title":"Success","default":false},"data":{"type":"null","title":"Data"},"error":{"properties":{"code":{"type":"string","title":"Code","description":"Stable machine code, e.g. STUDENT_NOT_FOUND, UNAUTHORIZED."},"message":{"type":"string","title":"Message","description":"Human-readable explanation."}},"type":"object","required":["code","message"],"title":"ErrorBody"},"meta":{"properties":{"source":{"type":"string","title":"Source","description":"Always the mock ITS; never a real system.","default":"UJ ITS (mock)"},"fictitious":{"type":"boolean","title":"Fictitious","description":"Always true: every record is invented for the demo.","default":true},"student_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Student Number","description":"The student the record belongs to, when it is personal."},"count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Count","description":"Number of rows, for list answers."}},"type":"object","title":"Meta"}},"type":"object","required":["error"],"title":"ErrorEnvelope","examples":[{"error":{"code":"STUDENT_NOT_FOUND","message":"No student 2026999999 in the mock ITS."},"meta":{"fictitious":true,"source":"UJ ITS (mock)"},"success":false}]}}}},"422":{"description":"Invalid input (e.g. a student number that is not 10 digits).","content":{"application/json":{"schema":{"properties":{"success":{"type":"boolean","title":"Success","default":false},"data":{"type":"null","title":"Data"},"error":{"properties":{"code":{"type":"string","title":"Code","description":"Stable machine code, e.g. STUDENT_NOT_FOUND, UNAUTHORIZED."},"message":{"type":"string","title":"Message","description":"Human-readable explanation."}},"type":"object","required":["code","message"],"title":"ErrorBody"},"meta":{"properties":{"source":{"type":"string","title":"Source","description":"Always the mock ITS; never a real system.","default":"UJ ITS (mock)"},"fictitious":{"type":"boolean","title":"Fictitious","description":"Always true: every record is invented for the demo.","default":true},"student_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Student Number","description":"The student the record belongs to, when it is personal."},"count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Count","description":"Number of rows, for list answers."}},"type":"object","title":"Meta"}},"type":"object","required":["error"],"title":"ErrorEnvelope","examples":[{"error":{"code":"STUDENT_NOT_FOUND","message":"No student 2026999999 in the mock ITS."},"meta":{"fictitious":true,"source":"UJ ITS (mock)"},"success":false}]}}}},"429":{"description":"Rate limit reached.","content":{"application/json":{"schema":{"properties":{"success":{"type":"boolean","title":"Success","default":false},"data":{"type":"null","title":"Data"},"error":{"properties":{"code":{"type":"string","title":"Code","description":"Stable machine code, e.g. STUDENT_NOT_FOUND, UNAUTHORIZED."},"message":{"type":"string","title":"Message","description":"Human-readable explanation."}},"type":"object","required":["code","message"],"title":"ErrorBody"},"meta":{"properties":{"source":{"type":"string","title":"Source","description":"Always the mock ITS; never a real system.","default":"UJ ITS (mock)"},"fictitious":{"type":"boolean","title":"Fictitious","description":"Always true: every record is invented for the demo.","default":true},"student_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Student Number","description":"The student the record belongs to, when it is personal."},"count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Count","description":"Number of rows, for list answers."}},"type":"object","title":"Meta"}},"type":"object","required":["error"],"title":"ErrorEnvelope","examples":[{"error":{"code":"STUDENT_NOT_FOUND","message":"No student 2026999999 in the mock ITS."},"meta":{"fictitious":true,"source":"UJ ITS (mock)"},"success":false}]}}}},"404":{"description":"No such student in the mock ITS.","content":{"application/json":{"schema":{"properties":{"success":{"type":"boolean","title":"Success","default":false},"data":{"type":"null","title":"Data"},"error":{"properties":{"code":{"type":"string","title":"Code","description":"Stable machine code, e.g. STUDENT_NOT_FOUND, UNAUTHORIZED."},"message":{"type":"string","title":"Message","description":"Human-readable explanation."}},"type":"object","required":["code","message"],"title":"ErrorBody"},"meta":{"properties":{"source":{"type":"string","title":"Source","description":"Always the mock ITS; never a real system.","default":"UJ ITS (mock)"},"fictitious":{"type":"boolean","title":"Fictitious","description":"Always true: every record is invented for the demo.","default":true},"student_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Student Number","description":"The student the record belongs to, when it is personal."},"count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Count","description":"Number of rows, for list answers."}},"type":"object","title":"Meta"}},"type":"object","required":["error"],"title":"ErrorEnvelope","examples":[{"error":{"code":"STUDENT_NOT_FOUND","message":"No student 2026999999 in the mock ITS."},"meta":{"fictitious":true,"source":"UJ ITS (mock)"},"success":false}]}}}}}}},"/students/{studentNumber}/residence-status":{"get":{"tags":["Student records"],"summary":"Residence status","description":"The student's residence application or allocation. PERSONAL DATA: call only for the signed-in student's OWN student number, never for a number a user merely typed. Fictitious demo data.","operationId":"uj_its_residence_status","security":[{"ApiKey":[]},{"Bearer":[]}],"parameters":[{"name":"studentNumber","in":"path","required":true,"schema":{"type":"string","pattern":"^[0-9]{10}$","description":"The SIGNED-IN student's own 10-digit student number (demo students: 2026000001-2026000004).","examples":["2026000001"],"title":"Studentnumber"},"description":"The SIGNED-IN student's own 10-digit student number (demo students: 2026000001-2026000004)."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"properties":{"success":{"type":"boolean","title":"Success","default":true},"data":{"anyOf":[{"properties":{"status":{"type":"string","title":"Status","description":"ALLOCATED, APPLIED, WAITLISTED or NOT_APPLIED."},"status_text":{"type":"string","title":"Status Text"},"residence":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Residence"},"room":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Room"},"academic_year":{"type":"integer","title":"Academic Year"}},"type":"object","required":["status","status_text","academic_year"],"title":"ResidenceStatus"},{"type":"null"}]},"error":{"anyOf":[{"properties":{"code":{"type":"string","title":"Code","description":"Stable machine code, e.g. STUDENT_NOT_FOUND, UNAUTHORIZED."},"message":{"type":"string","title":"Message","description":"Human-readable explanation."}},"type":"object","required":["code","message"],"title":"ErrorBody"},{"type":"null"}]},"meta":{"properties":{"source":{"type":"string","title":"Source","description":"Always the mock ITS; never a real system.","default":"UJ ITS (mock)"},"fictitious":{"type":"boolean","title":"Fictitious","description":"Always true: every record is invented for the demo.","default":true},"student_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Student Number","description":"The student the record belongs to, when it is personal."},"count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Count","description":"Number of rows, for list answers."}},"type":"object","title":"Meta"}},"type":"object","title":"Envelope[ResidenceStatus]"}}}},"401":{"description":"Missing or wrong API key.","content":{"application/json":{"schema":{"properties":{"success":{"type":"boolean","title":"Success","default":false},"data":{"type":"null","title":"Data"},"error":{"properties":{"code":{"type":"string","title":"Code","description":"Stable machine code, e.g. STUDENT_NOT_FOUND, UNAUTHORIZED."},"message":{"type":"string","title":"Message","description":"Human-readable explanation."}},"type":"object","required":["code","message"],"title":"ErrorBody"},"meta":{"properties":{"source":{"type":"string","title":"Source","description":"Always the mock ITS; never a real system.","default":"UJ ITS (mock)"},"fictitious":{"type":"boolean","title":"Fictitious","description":"Always true: every record is invented for the demo.","default":true},"student_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Student Number","description":"The student the record belongs to, when it is personal."},"count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Count","description":"Number of rows, for list answers."}},"type":"object","title":"Meta"}},"type":"object","required":["error"],"title":"ErrorEnvelope","examples":[{"error":{"code":"STUDENT_NOT_FOUND","message":"No student 2026999999 in the mock ITS."},"meta":{"fictitious":true,"source":"UJ ITS (mock)"},"success":false}]}}}},"422":{"description":"Invalid input (e.g. a student number that is not 10 digits).","content":{"application/json":{"schema":{"properties":{"success":{"type":"boolean","title":"Success","default":false},"data":{"type":"null","title":"Data"},"error":{"properties":{"code":{"type":"string","title":"Code","description":"Stable machine code, e.g. STUDENT_NOT_FOUND, UNAUTHORIZED."},"message":{"type":"string","title":"Message","description":"Human-readable explanation."}},"type":"object","required":["code","message"],"title":"ErrorBody"},"meta":{"properties":{"source":{"type":"string","title":"Source","description":"Always the mock ITS; never a real system.","default":"UJ ITS (mock)"},"fictitious":{"type":"boolean","title":"Fictitious","description":"Always true: every record is invented for the demo.","default":true},"student_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Student Number","description":"The student the record belongs to, when it is personal."},"count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Count","description":"Number of rows, for list answers."}},"type":"object","title":"Meta"}},"type":"object","required":["error"],"title":"ErrorEnvelope","examples":[{"error":{"code":"STUDENT_NOT_FOUND","message":"No student 2026999999 in the mock ITS."},"meta":{"fictitious":true,"source":"UJ ITS (mock)"},"success":false}]}}}},"429":{"description":"Rate limit reached.","content":{"application/json":{"schema":{"properties":{"success":{"type":"boolean","title":"Success","default":false},"data":{"type":"null","title":"Data"},"error":{"properties":{"code":{"type":"string","title":"Code","description":"Stable machine code, e.g. STUDENT_NOT_FOUND, UNAUTHORIZED."},"message":{"type":"string","title":"Message","description":"Human-readable explanation."}},"type":"object","required":["code","message"],"title":"ErrorBody"},"meta":{"properties":{"source":{"type":"string","title":"Source","description":"Always the mock ITS; never a real system.","default":"UJ ITS (mock)"},"fictitious":{"type":"boolean","title":"Fictitious","description":"Always true: every record is invented for the demo.","default":true},"student_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Student Number","description":"The student the record belongs to, when it is personal."},"count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Count","description":"Number of rows, for list answers."}},"type":"object","title":"Meta"}},"type":"object","required":["error"],"title":"ErrorEnvelope","examples":[{"error":{"code":"STUDENT_NOT_FOUND","message":"No student 2026999999 in the mock ITS."},"meta":{"fictitious":true,"source":"UJ ITS (mock)"},"success":false}]}}}},"404":{"description":"No such student in the mock ITS.","content":{"application/json":{"schema":{"properties":{"success":{"type":"boolean","title":"Success","default":false},"data":{"type":"null","title":"Data"},"error":{"properties":{"code":{"type":"string","title":"Code","description":"Stable machine code, e.g. STUDENT_NOT_FOUND, UNAUTHORIZED."},"message":{"type":"string","title":"Message","description":"Human-readable explanation."}},"type":"object","required":["code","message"],"title":"ErrorBody"},"meta":{"properties":{"source":{"type":"string","title":"Source","description":"Always the mock ITS; never a real system.","default":"UJ ITS (mock)"},"fictitious":{"type":"boolean","title":"Fictitious","description":"Always true: every record is invented for the demo.","default":true},"student_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Student Number","description":"The student the record belongs to, when it is personal."},"count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Count","description":"Number of rows, for list answers."}},"type":"object","title":"Meta"}},"type":"object","required":["error"],"title":"ErrorEnvelope","examples":[{"error":{"code":"STUDENT_NOT_FOUND","message":"No student 2026999999 in the mock ITS."},"meta":{"fictitious":true,"source":"UJ ITS (mock)"},"success":false}]}}}}}}},"/students/{studentNumber}/graduation-status":{"get":{"tags":["Student records"],"summary":"Graduation status","description":"Whether the student is (provisionally) eligible to graduate and the ceremony. PERSONAL DATA: call only for the signed-in student's OWN student number, never for a number a user merely typed. Fictitious demo data.","operationId":"uj_its_graduation_status","security":[{"ApiKey":[]},{"Bearer":[]}],"parameters":[{"name":"studentNumber","in":"path","required":true,"schema":{"type":"string","pattern":"^[0-9]{10}$","description":"The SIGNED-IN student's own 10-digit student number (demo students: 2026000001-2026000004).","examples":["2026000001"],"title":"Studentnumber"},"description":"The SIGNED-IN student's own 10-digit student number (demo students: 2026000001-2026000004)."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"properties":{"success":{"type":"boolean","title":"Success","default":true},"data":{"anyOf":[{"properties":{"eligible":{"type":"boolean","title":"Eligible"},"status":{"type":"string","title":"Status"},"status_text":{"type":"string","title":"Status Text"},"expected_completion":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Expected Completion"},"ceremony":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ceremony"}},"type":"object","required":["eligible","status","status_text"],"title":"GraduationStatus"},{"type":"null"}]},"error":{"anyOf":[{"properties":{"code":{"type":"string","title":"Code","description":"Stable machine code, e.g. STUDENT_NOT_FOUND, UNAUTHORIZED."},"message":{"type":"string","title":"Message","description":"Human-readable explanation."}},"type":"object","required":["code","message"],"title":"ErrorBody"},{"type":"null"}]},"meta":{"properties":{"source":{"type":"string","title":"Source","description":"Always the mock ITS; never a real system.","default":"UJ ITS (mock)"},"fictitious":{"type":"boolean","title":"Fictitious","description":"Always true: every record is invented for the demo.","default":true},"student_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Student Number","description":"The student the record belongs to, when it is personal."},"count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Count","description":"Number of rows, for list answers."}},"type":"object","title":"Meta"}},"type":"object","title":"Envelope[GraduationStatus]"}}}},"401":{"description":"Missing or wrong API key.","content":{"application/json":{"schema":{"properties":{"success":{"type":"boolean","title":"Success","default":false},"data":{"type":"null","title":"Data"},"error":{"properties":{"code":{"type":"string","title":"Code","description":"Stable machine code, e.g. STUDENT_NOT_FOUND, UNAUTHORIZED."},"message":{"type":"string","title":"Message","description":"Human-readable explanation."}},"type":"object","required":["code","message"],"title":"ErrorBody"},"meta":{"properties":{"source":{"type":"string","title":"Source","description":"Always the mock ITS; never a real system.","default":"UJ ITS (mock)"},"fictitious":{"type":"boolean","title":"Fictitious","description":"Always true: every record is invented for the demo.","default":true},"student_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Student Number","description":"The student the record belongs to, when it is personal."},"count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Count","description":"Number of rows, for list answers."}},"type":"object","title":"Meta"}},"type":"object","required":["error"],"title":"ErrorEnvelope","examples":[{"error":{"code":"STUDENT_NOT_FOUND","message":"No student 2026999999 in the mock ITS."},"meta":{"fictitious":true,"source":"UJ ITS (mock)"},"success":false}]}}}},"422":{"description":"Invalid input (e.g. a student number that is not 10 digits).","content":{"application/json":{"schema":{"properties":{"success":{"type":"boolean","title":"Success","default":false},"data":{"type":"null","title":"Data"},"error":{"properties":{"code":{"type":"string","title":"Code","description":"Stable machine code, e.g. STUDENT_NOT_FOUND, UNAUTHORIZED."},"message":{"type":"string","title":"Message","description":"Human-readable explanation."}},"type":"object","required":["code","message"],"title":"ErrorBody"},"meta":{"properties":{"source":{"type":"string","title":"Source","description":"Always the mock ITS; never a real system.","default":"UJ ITS (mock)"},"fictitious":{"type":"boolean","title":"Fictitious","description":"Always true: every record is invented for the demo.","default":true},"student_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Student Number","description":"The student the record belongs to, when it is personal."},"count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Count","description":"Number of rows, for list answers."}},"type":"object","title":"Meta"}},"type":"object","required":["error"],"title":"ErrorEnvelope","examples":[{"error":{"code":"STUDENT_NOT_FOUND","message":"No student 2026999999 in the mock ITS."},"meta":{"fictitious":true,"source":"UJ ITS (mock)"},"success":false}]}}}},"429":{"description":"Rate limit reached.","content":{"application/json":{"schema":{"properties":{"success":{"type":"boolean","title":"Success","default":false},"data":{"type":"null","title":"Data"},"error":{"properties":{"code":{"type":"string","title":"Code","description":"Stable machine code, e.g. STUDENT_NOT_FOUND, UNAUTHORIZED."},"message":{"type":"string","title":"Message","description":"Human-readable explanation."}},"type":"object","required":["code","message"],"title":"ErrorBody"},"meta":{"properties":{"source":{"type":"string","title":"Source","description":"Always the mock ITS; never a real system.","default":"UJ ITS (mock)"},"fictitious":{"type":"boolean","title":"Fictitious","description":"Always true: every record is invented for the demo.","default":true},"student_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Student Number","description":"The student the record belongs to, when it is personal."},"count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Count","description":"Number of rows, for list answers."}},"type":"object","title":"Meta"}},"type":"object","required":["error"],"title":"ErrorEnvelope","examples":[{"error":{"code":"STUDENT_NOT_FOUND","message":"No student 2026999999 in the mock ITS."},"meta":{"fictitious":true,"source":"UJ ITS (mock)"},"success":false}]}}}},"404":{"description":"No such student in the mock ITS.","content":{"application/json":{"schema":{"properties":{"success":{"type":"boolean","title":"Success","default":false},"data":{"type":"null","title":"Data"},"error":{"properties":{"code":{"type":"string","title":"Code","description":"Stable machine code, e.g. STUDENT_NOT_FOUND, UNAUTHORIZED."},"message":{"type":"string","title":"Message","description":"Human-readable explanation."}},"type":"object","required":["code","message"],"title":"ErrorBody"},"meta":{"properties":{"source":{"type":"string","title":"Source","description":"Always the mock ITS; never a real system.","default":"UJ ITS (mock)"},"fictitious":{"type":"boolean","title":"Fictitious","description":"Always true: every record is invented for the demo.","default":true},"student_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Student Number","description":"The student the record belongs to, when it is personal."},"count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Count","description":"Number of rows, for list answers."}},"type":"object","title":"Meta"}},"type":"object","required":["error"],"title":"ErrorEnvelope","examples":[{"error":{"code":"STUDENT_NOT_FOUND","message":"No student 2026999999 in the mock ITS."},"meta":{"fictitious":true,"source":"UJ ITS (mock)"},"success":false}]}}}}}}},"/programmes":{"get":{"tags":["Programmes & APS"],"summary":"Programmes (illustrative)","description":"Public list of a few programmes with ILLUSTRATIVE minimum APS and subject levels (not the University's official requirements). Optional `search` filters by words in the name, faculty or code (all programmes when nothing matches).","operationId":"uj_its_programmes","security":[{"ApiKey":[]},{"Bearer":[]}],"parameters":[{"name":"field","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"description":"Field of study or words to look for, e.g. 'accounting', 'information technology' or 'Science'.","examples":["information technology"],"title":"Field"},"description":"Field of study or words to look for, e.g. 'accounting', 'information technology' or 'Science'."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"properties":{"success":{"type":"boolean","title":"Success","default":true},"data":{"anyOf":[{"properties":{"illustrative_notice":{"type":"string","title":"Illustrative Notice"},"programmes":{"items":{"properties":{"code":{"type":"string","title":"Code"},"name":{"type":"string","title":"Name"},"faculty":{"type":"string","title":"Faculty"},"qualification":{"type":"string","title":"Qualification"},"duration_years":{"type":"integer","title":"Duration Years"},"min_aps":{"type":"integer","title":"Min Aps","description":"ILLUSTRATIVE minimum APS."},"subject_minimums":{"items":{"properties":{"subject":{"type":"string","title":"Subject"},"level":{"type":"integer","title":"Level"}},"type":"object","required":["subject","level"],"title":"SubjectMinimum"},"type":"array","title":"Subject Minimums","description":"ILLUSTRATIVE minimum NSC levels."}},"type":"object","required":["code","name","faculty","qualification","duration_years","min_aps","subject_minimums"],"title":"Programme"},"type":"array","title":"Programmes"},"note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note","description":"Set when nothing matched and every programme is listed."}},"type":"object","required":["illustrative_notice","programmes"],"title":"Programmes"},{"type":"null"}]},"error":{"anyOf":[{"properties":{"code":{"type":"string","title":"Code","description":"Stable machine code, e.g. STUDENT_NOT_FOUND, UNAUTHORIZED."},"message":{"type":"string","title":"Message","description":"Human-readable explanation."}},"type":"object","required":["code","message"],"title":"ErrorBody"},{"type":"null"}]},"meta":{"properties":{"source":{"type":"string","title":"Source","description":"Always the mock ITS; never a real system.","default":"UJ ITS (mock)"},"fictitious":{"type":"boolean","title":"Fictitious","description":"Always true: every record is invented for the demo.","default":true},"student_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Student Number","description":"The student the record belongs to, when it is personal."},"count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Count","description":"Number of rows, for list answers."}},"type":"object","title":"Meta"}},"type":"object","title":"Envelope[Programmes]"}}}},"401":{"description":"Missing or wrong API key.","content":{"application/json":{"schema":{"properties":{"success":{"type":"boolean","title":"Success","default":false},"data":{"type":"null","title":"Data"},"error":{"properties":{"code":{"type":"string","title":"Code","description":"Stable machine code, e.g. STUDENT_NOT_FOUND, UNAUTHORIZED."},"message":{"type":"string","title":"Message","description":"Human-readable explanation."}},"type":"object","required":["code","message"],"title":"ErrorBody"},"meta":{"properties":{"source":{"type":"string","title":"Source","description":"Always the mock ITS; never a real system.","default":"UJ ITS (mock)"},"fictitious":{"type":"boolean","title":"Fictitious","description":"Always true: every record is invented for the demo.","default":true},"student_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Student Number","description":"The student the record belongs to, when it is personal."},"count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Count","description":"Number of rows, for list answers."}},"type":"object","title":"Meta"}},"type":"object","required":["error"],"title":"ErrorEnvelope","examples":[{"error":{"code":"STUDENT_NOT_FOUND","message":"No student 2026999999 in the mock ITS."},"meta":{"fictitious":true,"source":"UJ ITS (mock)"},"success":false}]}}}},"422":{"description":"Invalid input (e.g. a student number that is not 10 digits).","content":{"application/json":{"schema":{"properties":{"success":{"type":"boolean","title":"Success","default":false},"data":{"type":"null","title":"Data"},"error":{"properties":{"code":{"type":"string","title":"Code","description":"Stable machine code, e.g. STUDENT_NOT_FOUND, UNAUTHORIZED."},"message":{"type":"string","title":"Message","description":"Human-readable explanation."}},"type":"object","required":["code","message"],"title":"ErrorBody"},"meta":{"properties":{"source":{"type":"string","title":"Source","description":"Always the mock ITS; never a real system.","default":"UJ ITS (mock)"},"fictitious":{"type":"boolean","title":"Fictitious","description":"Always true: every record is invented for the demo.","default":true},"student_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Student Number","description":"The student the record belongs to, when it is personal."},"count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Count","description":"Number of rows, for list answers."}},"type":"object","title":"Meta"}},"type":"object","required":["error"],"title":"ErrorEnvelope","examples":[{"error":{"code":"STUDENT_NOT_FOUND","message":"No student 2026999999 in the mock ITS."},"meta":{"fictitious":true,"source":"UJ ITS (mock)"},"success":false}]}}}},"429":{"description":"Rate limit reached.","content":{"application/json":{"schema":{"properties":{"success":{"type":"boolean","title":"Success","default":false},"data":{"type":"null","title":"Data"},"error":{"properties":{"code":{"type":"string","title":"Code","description":"Stable machine code, e.g. STUDENT_NOT_FOUND, UNAUTHORIZED."},"message":{"type":"string","title":"Message","description":"Human-readable explanation."}},"type":"object","required":["code","message"],"title":"ErrorBody"},"meta":{"properties":{"source":{"type":"string","title":"Source","description":"Always the mock ITS; never a real system.","default":"UJ ITS (mock)"},"fictitious":{"type":"boolean","title":"Fictitious","description":"Always true: every record is invented for the demo.","default":true},"student_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Student Number","description":"The student the record belongs to, when it is personal."},"count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Count","description":"Number of rows, for list answers."}},"type":"object","title":"Meta"}},"type":"object","required":["error"],"title":"ErrorEnvelope","examples":[{"error":{"code":"STUDENT_NOT_FOUND","message":"No student 2026999999 in the mock ITS."},"meta":{"fictitious":true,"source":"UJ ITS (mock)"},"success":false}]}}}}}}},"/aps/calculate":{"post":{"tags":["Programmes & APS"],"summary":"APS calculator (illustrative)","description":"Deterministic, ILLUSTRATIVE Admission Point Score: the sum of the NSC achievement levels (1-7) of the best six subjects, EXCLUDING Life Orientation. Each subject takes a `level` (1-7) or a `percentage` (0-100, mapped 80+=7, 70-79=6, 60-69=5, 50-59=4, 40-49=3, 30-39=2, 0-29=1). Optionally compare with a programme's illustrative minimums (`programme_code`). The University must confirm the real formula.","operationId":"uj_its_aps_calculate","requestBody":{"content":{"application/json":{"schema":{"properties":{"subjects":{"items":{"properties":{"subject":{"type":"string","maxLength":60,"minLength":1,"title":"Subject","description":"NSC subject name, e.g. Mathematics (`subject`; `name` is accepted too)."},"level":{"anyOf":[{"type":"integer","maximum":7.0,"minimum":1.0},{"type":"null"}],"title":"Level","description":"NSC achievement level 1-7."},"percentage":{"anyOf":[{"type":"integer","maximum":100.0,"minimum":0.0},{"type":"null"}],"title":"Percentage","description":"Final mark 0-100 (mapped to a level)."}},"type":"object","required":["subject"],"title":"Subject","description":"One NSC subject: give EITHER the achievement level (1-7) OR the percentage (0-100).","examples":[{"level":6,"subject":"Mathematics"},{"percentage":72,"subject":"English Home Language"}]},"type":"array","maxItems":12,"minItems":1,"title":"Subjects","description":"Up to 12 NSC subjects, each with a level OR a percentage."},"programme_code":{"anyOf":[{"type":"string","maxLength":32,"pattern":"^[A-Za-z0-9-]+$"},{"type":"null"}],"title":"Programme Code","description":"Optional: compare with this programme's illustrative minimums."}},"type":"object","required":["subjects"],"title":"ApsRequest","examples":[{"programme_code":"DEMO-BSC-IT","subjects":[{"level":5,"subject":"English Home Language"},{"percentage":75,"subject":"Mathematics"},{"level":5,"subject":"Physical Sciences"},{"level":6,"subject":"Life Sciences"},{"level":7,"subject":"Accounting"},{"level":6,"subject":"isiZulu First Additional Language"},{"level":7,"subject":"Life Orientation"}]}]}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"properties":{"success":{"type":"boolean","title":"Success","default":true},"data":{"anyOf":[{"properties":{"aps":{"type":"integer","title":"Aps"},"counted":{"items":{"properties":{"name":{"type":"string","title":"Name"},"level":{"type":"integer","title":"Level"},"points":{"type":"integer","title":"Points"},"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason"}},"type":"object","required":["name","level","points"],"title":"ApsRow"},"type":"array","title":"Counted"},"excluded":{"items":{"properties":{"name":{"type":"string","title":"Name"},"level":{"type":"integer","title":"Level"},"points":{"type":"integer","title":"Points"},"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason"}},"type":"object","required":["name","level","points"],"title":"ApsRow"},"type":"array","title":"Excluded"},"subjects_counted":{"type":"integer","title":"Subjects Counted"},"complete":{"type":"boolean","title":"Complete"},"rule":{"type":"string","title":"Rule"},"illustrative":{"type":"boolean","title":"Illustrative"},"note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note"},"programme_check":{"anyOf":[{"properties":{"programme_code":{"type":"string","title":"Programme Code"},"found":{"type":"boolean","title":"Found"},"programme":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Programme"},"min_aps":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Min Aps"},"subject_minimums":{"anyOf":[{"items":{"properties":{"subject":{"type":"string","title":"Subject"},"level":{"type":"integer","title":"Level"}},"type":"object","required":["subject","level"],"title":"SubjectMinimum"},"type":"array"},{"type":"null"}],"title":"Subject Minimums"},"meets_illustrative_minimums":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Meets Illustrative Minimums"},"unmet":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Unmet"},"illustrative":{"type":"boolean","title":"Illustrative","default":true},"note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note"}},"type":"object","required":["programme_code","found"],"title":"ProgrammeCheck"},{"type":"null"}]}},"type":"object","required":["aps","counted","excluded","subjects_counted","complete","rule","illustrative"],"title":"ApsResult","examples":[{"aps":35,"complete":true,"counted":[{"level":7,"name":"Accounting","points":7}],"excluded":[{"level":7,"name":"Life Orientation","points":0,"reason":"Life Orientation is excluded"}],"illustrative":true,"rule":"ILLUSTRATIVE: APS = sum of NSC achievement levels (1-7) of the best six subjects, excluding Life Orientation.","subjects_counted":6}]},{"type":"null"}]},"error":{"anyOf":[{"properties":{"code":{"type":"string","title":"Code","description":"Stable machine code, e.g. STUDENT_NOT_FOUND, UNAUTHORIZED."},"message":{"type":"string","title":"Message","description":"Human-readable explanation."}},"type":"object","required":["code","message"],"title":"ErrorBody"},{"type":"null"}]},"meta":{"properties":{"source":{"type":"string","title":"Source","description":"Always the mock ITS; never a real system.","default":"UJ ITS (mock)"},"fictitious":{"type":"boolean","title":"Fictitious","description":"Always true: every record is invented for the demo.","default":true},"student_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Student Number","description":"The student the record belongs to, when it is personal."},"count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Count","description":"Number of rows, for list answers."}},"type":"object","title":"Meta"}},"type":"object","title":"Envelope[ApsResult]"}}}},"401":{"description":"Missing or wrong API key.","content":{"application/json":{"schema":{"properties":{"success":{"type":"boolean","title":"Success","default":false},"data":{"type":"null","title":"Data"},"error":{"properties":{"code":{"type":"string","title":"Code","description":"Stable machine code, e.g. STUDENT_NOT_FOUND, UNAUTHORIZED."},"message":{"type":"string","title":"Message","description":"Human-readable explanation."}},"type":"object","required":["code","message"],"title":"ErrorBody"},"meta":{"properties":{"source":{"type":"string","title":"Source","description":"Always the mock ITS; never a real system.","default":"UJ ITS (mock)"},"fictitious":{"type":"boolean","title":"Fictitious","description":"Always true: every record is invented for the demo.","default":true},"student_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Student Number","description":"The student the record belongs to, when it is personal."},"count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Count","description":"Number of rows, for list answers."}},"type":"object","title":"Meta"}},"type":"object","required":["error"],"title":"ErrorEnvelope","examples":[{"error":{"code":"STUDENT_NOT_FOUND","message":"No student 2026999999 in the mock ITS."},"meta":{"fictitious":true,"source":"UJ ITS (mock)"},"success":false}]}}}},"422":{"description":"Invalid input (e.g. a student number that is not 10 digits).","content":{"application/json":{"schema":{"properties":{"success":{"type":"boolean","title":"Success","default":false},"data":{"type":"null","title":"Data"},"error":{"properties":{"code":{"type":"string","title":"Code","description":"Stable machine code, e.g. STUDENT_NOT_FOUND, UNAUTHORIZED."},"message":{"type":"string","title":"Message","description":"Human-readable explanation."}},"type":"object","required":["code","message"],"title":"ErrorBody"},"meta":{"properties":{"source":{"type":"string","title":"Source","description":"Always the mock ITS; never a real system.","default":"UJ ITS (mock)"},"fictitious":{"type":"boolean","title":"Fictitious","description":"Always true: every record is invented for the demo.","default":true},"student_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Student Number","description":"The student the record belongs to, when it is personal."},"count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Count","description":"Number of rows, for list answers."}},"type":"object","title":"Meta"}},"type":"object","required":["error"],"title":"ErrorEnvelope","examples":[{"error":{"code":"STUDENT_NOT_FOUND","message":"No student 2026999999 in the mock ITS."},"meta":{"fictitious":true,"source":"UJ ITS (mock)"},"success":false}]}}}},"429":{"description":"Rate limit reached.","content":{"application/json":{"schema":{"properties":{"success":{"type":"boolean","title":"Success","default":false},"data":{"type":"null","title":"Data"},"error":{"properties":{"code":{"type":"string","title":"Code","description":"Stable machine code, e.g. STUDENT_NOT_FOUND, UNAUTHORIZED."},"message":{"type":"string","title":"Message","description":"Human-readable explanation."}},"type":"object","required":["code","message"],"title":"ErrorBody"},"meta":{"properties":{"source":{"type":"string","title":"Source","description":"Always the mock ITS; never a real system.","default":"UJ ITS (mock)"},"fictitious":{"type":"boolean","title":"Fictitious","description":"Always true: every record is invented for the demo.","default":true},"student_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Student Number","description":"The student the record belongs to, when it is personal."},"count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Count","description":"Number of rows, for list answers."}},"type":"object","title":"Meta"}},"type":"object","required":["error"],"title":"ErrorEnvelope","examples":[{"error":{"code":"STUDENT_NOT_FOUND","message":"No student 2026999999 in the mock ITS."},"meta":{"fictitious":true,"source":"UJ ITS (mock)"},"success":false}]}}}}},"security":[{"ApiKey":[]},{"Bearer":[]}]}}},"components":{"securitySchemes":{"ApiKey":{"type":"apiKey","description":"The ITS API key (secret file `its-api-key`).","in":"header","name":"X-API-Key"},"Bearer":{"type":"http","description":"Alternative: the same ITS API key as a Bearer token.","scheme":"bearer"}}},"servers":[{"url":"http://uj-webapp:8080/its/v1","description":"In-network URL for AICraft's tool runtime (Import OpenAPI)"},{"url":"/its/v1","description":"This origin (browser / Swagger UI)"}]}