Parent Portal Mobile REST API
Exhaustive reference document containing every endpoint for the EduPulse Parent Mobile App, including all request parameters, example request JSON, and complete realistic success/error responses.
Authentication & Security
Protected endpoints require the Authorization: Bearer <API_TOKEN> HTTP header. Tokens are generated upon completing 4-digit PIN setup or login.
Authorization: Bearer d3be490a79bb4eedbe880b38411653d2771b807ddf9dda75204231b16b5f86ce
Content-Type: application/json
Standard Response Envelope
{
"success": true,
"status_code": 200,
"message": "Operation completed successfully",
"data": { ... },
"errors": null
}
{
"success": false,
"status_code": 422,
"message": "Please provide a valid 4-digit PIN.",
"data": null,
"errors": null
}
Authentication & Account Lifecycle
Submits parent's phone number. Checks if parent has a PIN set or initiates a 4-digit SMS OTP.
Request Payload:
{ "phone": "0757755338" }Sample Response (New Parent -> OTP Sent):
{
"success": true,
"status_code": 200,
"message": "A 4-digit verification code has been sent to your phone via SMS.",
"data": {
"phone": "0757755338",
"is_pin_set": false,
"step": "verify_otp",
"sms_sent": true,
"otp_code": null
},
"errors": null
}
Sample Response (Returning Parent -> Enter PIN):
{
"success": true,
"status_code": 200,
"message": "Phone verified. Please enter your 4-digit security PIN.",
"data": {
"phone": "0757755338",
"is_pin_set": true,
"step": "enter_pin",
"name": "Sarah Kimuli"
},
"errors": null
}
Verifies the 4-digit SMS OTP code.
Request Payload:
{ "phone": "0757755338", "otp_code": "7779" }Sample Response:
{
"success": true,
"status_code": 200,
"message": "Verification successful. Please set up your 4-digit security PIN and details.",
"data": {
"phone": "0757755338",
"step": "set_pin"
},
"errors": null
}
Dispatches a fresh 4-digit SMS OTP code.
Request Payload:
{ "phone": "0757755338" }Sample Response:
{
"success": true,
"status_code": 200,
"message": "A new verification code has been dispatched to your phone.",
"data": {
"phone": "0757755338",
"sms_sent": true
},
"errors": null
}
Completes registration by saving a 4-digit PIN and profile details. Returns user object with Bearer token.
Request Payload:
{
"phone": "0757755338",
"pin": "1234",
"confirm_pin": "1234",
"full_name": "Sarah Kimuli",
"email": "sarah.kimuli@gmail.com",
"occupation": "Accountant",
"address": "Muyenga, Kampala"
}
Sample Response:
{
"success": true,
"status_code": 200,
"message": "Parent account setup completed successfully!",
"data": {
"token": "d3be490a79bb4eedbe880b38411653d2771b807ddf9dda75204231b16b5f86ce",
"user": {
"id": 28,
"name": "Sarah Kimuli",
"email": "sarah.kimuli@gmail.com",
"phone": "0757755338",
"role_id": 6,
"role_name": "parent"
},
"parent": {
"id": 14,
"user_id": 28,
"full_name": "Sarah Kimuli",
"phone": "0757755338",
"email": "sarah.kimuli@gmail.com",
"occupation": "Accountant",
"address": "Muyenga, Kampala"
}
},
"errors": null
}
Fast login for returning parents using registered phone number and 4-digit PIN.
Request Payload:
{ "phone": "0757755338", "pin": "1234" }Sample Response:
{
"success": true,
"status_code": 200,
"message": "Login successful. Welcome back!",
"data": {
"token": "d3be490a79bb4eedbe880b38411653d2771b807ddf9dda75204231b16b5f86ce",
"user": {
"id": 28,
"name": "Sarah Kimuli",
"phone": "0757755338",
"role_name": "parent"
},
"parent": {
"id": 14,
"full_name": "Sarah Kimuli",
"phone": "0757755338",
"occupation": "Accountant",
"address": "Muyenga, Kampala"
}
},
"errors": null
}
Requests a 4-digit PIN reset code via SMS.
Request Payload:
{ "phone": "0757755338" }Sample Response:
{
"success": true,
"status_code": 200,
"message": "A 4-digit PIN reset code has been sent to your phone via SMS.",
"data": {
"phone": "0757755338",
"sms_sent": true
},
"errors": null
}
Saves new PIN with verified OTP code.
Request Payload:
{ "phone": "0757755338", "otp_code": "5421", "new_pin": "9876", "confirm_pin": "9876" }Sample Response:
{
"success": true,
"status_code": 200,
"message": "Your security PIN has been reset successfully!",
"data": {
"token": "a823b1239c44dd9211029384756abcdef1234567890abcdef1234567890abc",
"user": {
"id": 28,
"name": "Sarah Kimuli",
"phone": "0757755338"
}
},
"errors": null
}
Revokes the active Bearer token and logs out.
Sample Response:
{
"success": true,
"status_code": 200,
"message": "You have been logged out successfully.",
"data": null,
"errors": null
}
Retrieves logged-in parent details (name, email, phone, occupation, address, national ID, avatar).
Sample Response:
{
"success": true,
"status_code": 200,
"message": "Parent profile retrieved",
"data": {
"user": {
"id": 28,
"name": "Sarah Kimuli",
"email": "sarah.kimuli@gmail.com",
"phone": "0757755338",
"photo_url": "uploads/parents/parent_1784619000_123.jpg",
"role_name": "parent"
},
"parent": {
"id": 14,
"user_id": 28,
"full_name": "Sarah Kimuli",
"phone": "0757755338",
"email": "sarah.kimuli@gmail.com",
"occupation": "Accountant",
"address": "Muyenga, Kampala",
"national_id": "CM9012345678AB"
}
},
"errors": null
}
Updates parent profile & avatar image (Multipart form data: avatar_file).
Sample Response:
{
"success": true,
"status_code": 200,
"message": "Profile updated successfully!",
"data": {
"user": {
"id": 28,
"name": "Sarah Kimuli Namakula",
"photo_url": "uploads/parents/parent_1784620000_456.jpg"
}
},
"errors": null
}
Children & Student Management
Lists all linked children with school name, logo, class, stream, photo, and active subscription status.
Sample Response:
{
"success": true,
"status_code": 200,
"message": "Children retrieved",
"data": [
{
"id": 8,
"student_code": "STU-2026-008",
"admission_no": "ADM-008",
"first_name": "Mukibi",
"last_name": "Henry",
"gender": "Male",
"dob": "2015-05-12",
"photo_url": "uploads/students/stu_1784617116_101.jpg",
"class_id": 1,
"class_name": "Primary 1",
"stream_id": 2,
"stream_name": "Blue",
"school_id": 1,
"school_name": "Zana Mixed Secondary School",
"school_logo": "uploads/logos/school_logo_1.png",
"billing_type": "paid",
"parent_term_fee_usd": "1.00",
"parent_term_fee_ugx": "3700.00",
"has_active_subscription": true
}
],
"errors": null
}
Single unified live dashboard: today rollcall, active live lesson, next lesson, fee balance, active medical alerts, boarding roll call, and bus status.
Sample Response:
{
"success": true,
"status_code": 200,
"message": "Dashboard data retrieved",
"data": {
"student": {
"id": 8,
"first_name": "Mukibi",
"last_name": "Henry",
"student_code": "STU-2026-008",
"class_name": "Primary 1",
"stream_name": "Blue",
"school_name": "Zana Mixed Secondary School"
},
"subscription": {
"has_active_subscription": true,
"term_name": "Term 2 2026",
"term_fee_ugx": 3700.00
},
"today_rollcall": {
"status": "present",
"arrival_time": "07:45:00",
"teacher_name": "Mr. Okello John",
"teacher_phone": "+256 701 444 555"
},
"active_lesson": {
"subject_name": "Mathematics",
"room_no": "Room 4A",
"teacher_name": "Mr. Ssemakula Ben",
"start_time": "10:30:00",
"end_time": "11:50:00",
"lesson_state": "in_progress"
},
"fees_summary": {
"total_required_ugx": 850000.00,
"discount_ugx": 50000.00,
"total_paid_ugx": 600000.00,
"balance_ugx": 200000.00
},
"health_alerts": [],
"dorm_rollcall": {
"status": "present",
"dorm_name": "Lumumba House"
},
"bus_transport": {
"status": "dropped_home",
"vehicle_number": "UBJ 452K",
"driver_name": "Mugisha David"
}
},
"errors": null
}
Searches and lists registered schools for child claiming.
Sample Response:
{
"success": true,
"status_code": 200,
"message": "Schools retrieved",
"data": [
{
"id": 1,
"name": "Zana Mixed Secondary School",
"school_code": "SCH-ZANA-01",
"logo_url": "uploads/logos/school_logo_1.png",
"district": "Wakiso",
"address": "Entebbe Road, Zana",
"phone": "+256 700 111 222",
"level_category": "Secondary",
"ownership_type": "Private"
}
],
"errors": null
}
Returns all classes for a selected school.
Sample Response:
{
"success": true,
"status_code": 200,
"message": "Classes retrieved",
"data": [
{ "id": 1, "class_name": "Primary 1", "level_type": "Primary", "numeric_order": 1 },
{ "id": 2, "class_name": "Primary 2", "level_type": "Primary", "numeric_order": 2 }
],
"errors": null
}
Returns student roster in a class with claim limits and whether claimed.
Sample Response:
{
"success": true,
"status_code": 200,
"message": "Class students retrieved",
"data": {
"max_parents_allowed": 2,
"students": [
{
"id": 8,
"first_name": "Mukibi",
"last_name": "Henry",
"student_code": "STU-2026-008",
"admission_no": "ADM-008",
"gender": "Male",
"photo_url": "uploads/students/stu_8.jpg",
"class_name": "Primary 1",
"stream_name": "Blue",
"linked_parents_count": 1,
"linked_by_me": 1,
"max_parents_allowed": 2,
"is_fully_claimed": false
}
]
},
"errors": null
}
Self-links one or more students to the parent account.
Request Payload:
{ "student_ids": [8, 10] }Sample Response:
{
"success": true,
"status_code": 200,
"message": "Student linking processed successfully",
"data": {
"linked_students": ["Mukibi Henry", "Mukibi Ham"],
"blocked_students": []
},
"errors": null
}
Returns digital student & parent ID card data (barcode data, QR code string, school stamp, signature).
Sample Response:
{
"success": true,
"status_code": 200,
"message": "Digital ID card payload retrieved",
"data": {
"student": {
"id": 8,
"first_name": "Mukibi",
"last_name": "Henry",
"student_code": "STU-2026-008",
"class_name": "Primary 1",
"school_name": "Zana Mixed Secondary School",
"school_logo": "uploads/logos/school_logo_1.png",
"stamp_url": "uploads/stamps/stamp_1.jpg",
"signature_url": "uploads/signatures/sig_1.jpeg"
},
"parent": {
"full_name": "Sarah Kimuli",
"phone": "0757755338"
},
"barcode_data": "STU-2026-008",
"qr_string": "EDUPULSE-ID:8:STU-2026-008:SCH-ZANA-01"
},
"errors": null
}
Daily Roll & Live Lesson Accountability
Today morning roll call status (present, absent, late), arrival time, teacher photo & phone.
Sample Response:
{
"success": true,
"status_code": 200,
"message": "Today attendance retrieved",
"data": {
"status": "present",
"arrival_time": "07:45:00",
"date": "2026-08-30",
"notes": null,
"teacher_name": "Mr. Okello John",
"teacher_photo": "uploads/teachers/tch_1.jpg",
"teacher_phone": "+256 701 444 555"
},
"errors": null
}
Attendance summary (total days, present, absent, late, percentage rate) + date-by-date history log.
Sample Response:
{
"success": true,
"status_code": 200,
"message": "Attendance history retrieved",
"data": {
"summary": {
"total_days_recorded": 58,
"present": 56,
"absent": 1,
"late": 1,
"attendance_rate_pct": 96.6
},
"records": [
{
"id": 142,
"date": "2026-08-29",
"status": "present",
"arrival_time": "07:40:00",
"notes": null,
"teacher_name": "Mr. Okello John"
}
]
},
"errors": null
}
Today timetable with live lesson status and student attendance per lesson.
Sample Response:
{
"success": true,
"status_code": 200,
"message": "Today timetable and lesson accountability retrieved",
"data": [
{
"id": 14,
"room_no": "Room 4A",
"day_of_week": "Monday",
"start_time": "10:30:00",
"end_time": "11:50:00",
"lesson_state": "in_progress",
"subject_name": "Mathematics",
"subject_code": "MTC",
"teacher_name": "Mr. Ssemakula Ben",
"teacher_phone": "+256 702 333 444",
"student_lesson_status": "present",
"marked_at": "2026-08-30 10:35:12"
}
],
"errors": null
}
Fees & IoTec Mobile Money Gateway
Total fees required, bursary/discounts, net required, amount paid, and outstanding balance.
Sample Response:
{
"success": true,
"status_code": 200,
"message": "Fee summary retrieved",
"data": {
"total_structure_fees_ugx": 850000.00,
"discount_ugx": 50000.00,
"discount_reason": "Bursary Discount",
"net_required_ugx": 800000.00,
"total_paid_ugx": 600000.00,
"outstanding_balance_ugx": 200000.00
},
"errors": null
}
Itemized fee breakdown with per-item paid/balance status.
Sample Response:
{
"success": true,
"status_code": 200,
"message": "Fee structure retrieved",
"data": [
{
"id": 1,
"fee_type": "Tuition Fee",
"amount_ugx": "500000.00",
"item_paid_ugx": 500000.00,
"item_balance_ugx": 0.00,
"item_status": "paid"
},
{
"id": 2,
"fee_type": "Development Fee",
"amount_ugx": "200000.00",
"item_paid_ugx": 100000.00,
"item_balance_ugx": 100000.00,
"item_status": "partial"
},
{
"id": 3,
"fee_type": "School Meals",
"amount_ugx": "150000.00",
"item_paid_ugx": 0.00,
"item_balance_ugx": 150000.00,
"item_status": "unpaid"
}
],
"errors": null
}
List of all historical payments, receipt numbers, and verification statuses.
Sample Response:
{
"success": true,
"status_code": 200,
"message": "Payment history retrieved",
"data": [
{
"id": 102,
"receipt_no": "REC-20260830-101",
"amount_paid_ugx": "250000.00",
"payment_method": "mobile_money",
"payment_reference": "IOTEC-MM-109283",
"payment_date": "2026-08-30 08:30:00",
"verification_status": "verified",
"notes": "Payment for: Tuition Fee via Mobile Money"
}
],
"errors": null
}
Full digital receipt breakdown with school stamp, bursar signature, and fee line items.
Sample Response:
{
"success": true,
"status_code": 200,
"message": "Receipt details retrieved",
"data": {
"id": 102,
"receipt_no": "REC-20260830-101",
"amount_paid_ugx": "250000.00",
"first_name": "Mukibi",
"last_name": "Henry",
"class_name": "Primary 1",
"school_name": "Zana Mixed Secondary School",
"school_logo": "uploads/logos/school_logo_1.png",
"stamp_url": "uploads/stamps/stamp_1.jpg",
"bursar_signature_url": "uploads/signatures/bursar_sig.png"
},
"errors": null
}
Initiates School Fee payment via IoTec Mobile Money prompt.
Request Payload:
{
"student_id": 8,
"amount_ugx": 250000,
"phone": "256752999888",
"fee_type": "Tuition Fee"
}
Sample Response:
{
"success": true,
"status_code": 200,
"message": "Mobile Money PIN prompt sent to 256752999888. Please enter your PIN on your phone to complete payment.",
"data": {
"transaction_id": "IOTEC-MM-20260830-109283",
"reference": "FEE-MM-20260830-4921",
"amount_ugx": 250000,
"phone": "256752999888"
},
"errors": null
}
Pays Term Accountability Portal subscription ($1 / 3,700 UGX) via Mobile Money.
Request Payload:
{ "student_id": 8, "phone_number": "256752999888" }Sample Response:
{
"success": true,
"status_code": 200,
"message": "Mobile Money PIN prompt sent to 256752999888. Complete on your device to unlock Term Accountability.",
"data": {
"transaction_id": "SUB-MM-2026-9182",
"amount_ugx": 3700.00
},
"errors": null
}
Polls transaction status (SUCCESSFUL, PENDING, FAILED).
Sample Response:
{
"success": true,
"status_code": 200,
"message": "Payment status checked",
"data": {
"success": true,
"status": "SUCCESSFUL",
"transaction_id": "IOTEC-MM-20260830-109283",
"message": "Transaction completed successfully."
},
"errors": null
}
Academics & UNEB Report Cards
Lists available academic terms and years.
Sample Response:
{
"success": true,
"status_code": 200,
"message": "Terms and academic years retrieved",
"data": {
"terms": [
{ "id": 2, "term_name": "Term 2 2026", "start_date": "2026-05-25", "end_date": "2026-08-28", "is_current": 1 }
],
"academic_years": [
{ "id": 1, "year_label": "2026", "is_current": 1 }
]
},
"errors": null
}
Returns full UNEB report card data: subject marks, UNEB grades (D1-F9), class position, teacher remarks, headteacher remarks, and digital school stamp.
Sample Response:
{
"success": true,
"status_code": 200,
"message": "Report card data retrieved",
"data": {
"student": {
"first_name": "Mukibi",
"last_name": "Henry",
"class_name": "Primary 1",
"school_name": "Zana Mixed Secondary School",
"stamp_url": "uploads/stamps/stamp_1.jpg",
"signature_url": "uploads/signatures/sig_1.jpeg"
},
"report_card": {
"overall_percentage": "88.50",
"overall_grade": "D1",
"teacher_remarks": "Outstanding grasp of concepts and active participation.",
"headteacher_remarks": "Promoted with distinction.",
"attendance_days_present": 62,
"attendance_days_absent": 1
},
"results": [
{
"subject_name": "Mathematics",
"mark_score": "92.00",
"max_score": "100.00",
"grade": "D1",
"teacher_comment": "Excellent numerical skills."
},
{
"subject_name": "English Language",
"mark_score": "85.00",
"max_score": "100.00",
"grade": "D2",
"teacher_comment": "Very good grammar."
}
]
},
"errors": null
}
Health & Infirmary / Clinic Monitoring
Lists active and historical clinic visits (symptoms, temperature, BP, diagnosis, nurse notes, discharge status).
Sample Response:
{
"success": true,
"status_code": 200,
"message": "Health records retrieved",
"data": [
{
"id": 5,
"incident_type": "Mild Fever & Headache",
"symptoms": "High temperature, body weakness",
"diagnosis": "Early Stage Malaria",
"temperature_celsius": "38.6",
"blood_pressure": "110/75",
"nurse_notes": "Administered Coartem & Paracetamol. Resting in school clinic.",
"status": "Admitted in Clinic",
"parent_authorized_at": null,
"created_at": "2026-08-30 09:15:00"
}
],
"errors": null
}
Medical timeline audit trail for treatment changes and nurse notes.
Sample Response:
{
"success": true,
"status_code": 200,
"message": "Health incident timeline retrieved",
"data": [
{
"id": 12,
"incident_id": 5,
"action_type": "Vital Signs Checked",
"action_details": "Temperature measured at 38.6C, BP 110/75. Oral medication given.",
"performed_by_id": 9,
"created_at": "2026-08-30 09:20:00"
}
],
"errors": null
}
Parent medical consent for hospital referral or specialized medication.
Request Payload:
{
"incident_id": 5,
"authorization_type": "hospital_referral",
"notes": "Approved for transfer to Nsambya Hospital"
}
Sample Response:
{
"success": true,
"status_code": 200,
"message": "Medical procedure / hospital referral authorization recorded successfully.",
"data": null,
"errors": null
}
Dismisses active health alert banner from mobile dashboard.
Request Payload:
{ "incident_id": 5 }Sample Response:
{
"success": true,
"status_code": 200,
"message": "Health alert dismissed from dashboard.",
"data": null,
"errors": null
}
Boarding & Dormitory Accountability
Night dormitory roll call history: present, absent, sick_in_clinic with roll call timestamp, dormitory name, and matron/patron name.
Sample Response:
{
"success": true,
"status_code": 200,
"message": "Boarding roll call history retrieved",
"data": [
{
"id": 89,
"status": "present",
"notes": null,
"is_resolved": 1,
"roll_call_date": "2026-08-29",
"roll_call_time": "21:30:00",
"dorm_name": "Lumumba House",
"dorm_gender": "Boys",
"taken_by_name": "Patron David"
}
],
"errors": null
}
Bus & Transport Tracking
Latest bus trip status: morning_pickup / evening_dropoff, route, vehicle plate number, driver name, driver phone, and pickup/dropoff timestamp.
Sample Response:
{
"success": true,
"status_code": 200,
"message": "Latest transport status retrieved",
"data": {
"trip_type": "evening_dropoff",
"vehicle_number": "UBJ 452K",
"route_name": "Muyenga - Bunga Route",
"driver_name": "Mugisha David",
"driver_phone": "+256 772 112 233",
"driver_code": "DRV-004",
"status": "dropped_home",
"start_time": "16:30:00",
"created_at": "2026-08-29 17:45:00"
},
"errors": null
}
Gate Passes & Exit Permissions
Lists issued gate passes / permission slips with status (active, completed, overdue).
Sample Response:
{
"success": true,
"status_code": 200,
"message": "Gate passes retrieved",
"data": [
{
"id": 15,
"pass_number": "GP-20260830-742",
"reason": "Hospital Dental Appointment",
"departure_time": "2026-08-31 09:00:00",
"expected_return_time": "2026-08-31 15:00:00",
"status": "pending",
"first_name": "Mukibi",
"last_name": "Henry",
"class_name": "Primary 1"
}
],
"errors": null
}
Submits exit permission slip request from parent to school administration.
Request Payload:
{
"student_id": 8,
"reason": "Hospital Dental Appointment",
"departure_time": "2026-08-31 09:00:00",
"expected_return_time": "2026-08-31 15:00:00"
}
Sample Response:
{
"success": true,
"status_code": 200,
"message": "Gate pass request submitted successfully for school administration approval.",
"data": {
"pass_number": "GP-20260830-742"
},
"errors": null
}
Requirements & Uniforms / Stationeries
Lists mandatory and optional school items with student fulfillment status (fulfilled, partial, pending) and quantities.
Sample Response:
{
"success": true,
"status_code": 200,
"message": "Requirements retrieved",
"data": [
{
"id": 1,
"item_name": "Oxford Mathematical Set",
"quantity_description": "1 Piece",
"is_mandatory": 1,
"student_status": "fulfilled",
"quantity_provided": "1"
},
{
"id": 2,
"item_name": "Rotatrim Photocopy Paper (Ream)",
"quantity_description": "2 Reams (500 Sheets)",
"is_mandatory": 1,
"student_status": "pending",
"quantity_provided": "0"
}
],
"errors": null
}
Teachers Directory
Directory of subject instructors teaching the child's class with photos, subject names, phone numbers, and qualifications.
Sample Response:
{
"success": true,
"status_code": 200,
"message": "Teachers directory retrieved",
"data": [
{
"id": 2,
"teacher_name": "Mr. Ssemakula Ben",
"email": "ben.ssemakula@school.ug",
"phone": "+256 702 333 444",
"subject_name": "Mathematics",
"qualification": "B.Ed Mathematics (Mak)",
"photo_url": "uploads/teachers/tch_2.jpg",
"class_name": "Primary 1"
}
],
"errors": null
}
Support Chat & In-App Messaging
Lists all open and closed support tickets/chats for the parent.
Sample Response:
{
"success": true,
"status_code": 200,
"message": "Chats retrieved",
"data": [
{
"id": 9,
"ticket_number": "CHAT-20260830-8192",
"subject": "Inquiry regarding swimming gala fees",
"category": "school_admin",
"status": "open",
"priority": "medium",
"last_message_at": "2026-08-30 11:20:00",
"school_name": "Zana Mixed Secondary School",
"student_first": "Mukibi",
"student_last": "Henry"
}
],
"errors": null
}
Opens a new conversation with school staff. Multipart params: subject, message, category, student_id, attachment.
Sample Response:
{
"success": true,
"status_code": 200,
"message": "Support ticket created successfully",
"data": {
"chat_id": 9,
"ticket_number": "CHAT-20260830-8192"
},
"errors": null
}
Fetches message thread in a chat and automatically marks incoming messages as read.
Sample Response:
{
"success": true,
"status_code": 200,
"message": "Chat messages retrieved",
"data": {
"chat": {
"id": 9,
"ticket_number": "CHAT-20260830-8192",
"subject": "Inquiry regarding swimming gala fees"
},
"messages": [
{
"id": 21,
"chat_id": 9,
"sender_id": 28,
"sender_role": "parent",
"sender_name": "Sarah Kimuli",
"message": "Good morning, please clarify the uniform pickup dates.",
"attachment_url": null,
"is_read": 1,
"created_at": "2026-08-30 08:15:00"
},
{
"id": 22,
"chat_id": 9,
"sender_id": 4,
"sender_role": "school_admin",
"sender_name": "Headteacher Office",
"message": "Good morning Mrs. Kimuli. Uniforms will be distributed on Tuesday at the bursar's office.",
"attachment_url": null,
"is_read": 1,
"created_at": "2026-08-30 08:45:00"
}
]
},
"errors": null
}
Sends a reply message with optional photo/document attachment.
Request Payload:
{ "chat_id": 9, "message": "Thank you for the prompt update!" }Sample Response:
{
"success": true,
"status_code": 200,
"message": "Message sent successfully",
"data": {
"message_id": 23,
"attachment_url": null
},
"errors": null
}
Announcements & Notifications
Official school circulars and announcements targeted to parents.
Sample Response:
{
"success": true,
"status_code": 200,
"message": "Announcements retrieved",
"data": [
{
"id": 8,
"title": "End of Term 2 Academic Schedule & Visitation Day",
"content": "Dear Parents and Guardians, please note that our annual Visitation Day will be held on Friday, August 28th...",
"target_audience": "parents",
"created_at": "2026-08-25 14:00:00",
"author_name": "School Administration"
}
],
"errors": null
}
Real-time notification feed (arrival clock-in, missed lesson, medical incident, bus dropoff) with unread count.
Sample Response:
{
"success": true,
"status_code": 200,
"message": "Notifications retrieved",
"data": {
"unread_count": 2,
"notifications": [
{
"id": 41,
"title": "Arrival Clock-In Marked",
"message": "Mukibi Henry arrived at school at 07:45 AM and was marked present.",
"type": "attendance",
"is_read": 0,
"created_at": "2026-08-30 07:46:12"
},
{
"id": 40,
"title": "New School Announcement",
"message": "New circular published regarding Term 2 exams.",
"type": "announcement",
"is_read": 0,
"created_at": "2026-08-29 16:00:00"
}
]
},
"errors": null
}
Marks a specific notification as read.
Request Payload:
{ "id": 41 }Sample Response:
{
"success": true,
"status_code": 200,
"message": "Notification marked as read",
"data": null,
"errors": null
}
Marks all notifications for the user as read.
Sample Response:
{
"success": true,
"status_code": 200,
"message": "All notifications marked as read",
"data": null,
"errors": null
}
Academic Calendar & School Events
Term dates, exam schedules, visitation days, sports days, and public holidays.
Sample Response:
{
"success": true,
"status_code": 200,
"message": "Calendar events retrieved",
"data": [
{
"id": 3,
"event_title": "Mid-Term Examination Week",
"event_type": "exam",
"start_date": "2026-08-15",
"end_date": "2026-08-19",
"color_hex": "#dc2626"
},
{
"id": 4,
"event_title": "Term 2 Visitation & Sports Day",
"event_type": "event",
"start_date": "2026-08-28",
"end_date": "2026-08-28",
"color_hex": "#16a34a"
}
],
"errors": null
}
Emergency Response & Safety Hotlines
Active emergency alerts (lockdown, weather, fire) + emergency directory (Police, Ambulance, Fire Brigade, School Command).
Sample Response:
{
"success": true,
"status_code": 200,
"message": "Emergency alerts retrieved",
"data": {
"active_incidents": [],
"agency_contacts": [
{
"id": 1,
"agency_type": "Police Emergency",
"agency_name": "Kabalagala Police Division",
"phone_primary": "999",
"phone_secondary": "+256 414 123 456"
},
{
"id": 2,
"agency_type": "Medical / Ambulance",
"agency_name": "Nsambya Emergency Medical Rescue",
"phone_primary": "911",
"phone_secondary": "+256 772 000 111"
},
{
"id": 3,
"agency_type": "Fire Brigade",
"agency_name": "Kampala Central Fire Station",
"phone_primary": "112",
"phone_secondary": "+256 414 999 112"
}
]
},
"errors": null
}
Client SDK Code Examples
import axios from 'axios';
const BASE_URL = 'https://your-domain.com/index.php?api=parent';
export const parentApi = axios.create({ baseURL: BASE_URL });
export const setAuthToken = (token: string) => {
parentApi.defaults.headers.common['Authorization'] = `Bearer ${token}`;
};
// 1. PIN Login
export const loginWithPin = async (phone: string, pin: string) => {
const res = await parentApi.post('&action=auth_login_pin', { phone, pin });
if (res.data.success) {
setAuthToken(res.data.data.token);
}
return res.data;
};
// 2. Fetch Live Dashboard
export const getChildDashboard = async (studentId?: number) => {
const query = studentId ? `&action=child_dashboard&student_id=${studentId}` : '&action=child_dashboard';
const res = await parentApi.get(query);
return res.data.data;
};
// 3. Pay Fees via Mobile Money
export const payFeesMobileMoney = async (studentId: number, amountUgx: number, phone: string, feeType: string) => {
const res = await parentApi.post('&action=pay_fees_momo', {
student_id: studentId,
amount_ugx: amountUgx,
phone,
fee_type: feeType,
});
return res.data;
};
import 'dart:convert';
import 'package:http/http.dart' as http;
class ParentApiService {
static const String baseUrl = 'https://your-domain.com/index.php?api=parent';
String? _authToken;
void setToken(String token) => _authToken = token;
Map get _headers => {
'Content-Type': 'application/json',
if (_authToken != null) 'Authorization': 'Bearer $_authToken',
};
Future