Skip to main content
The course drop-off endpoints aggregate the per-(student × course) course warehouse (mlip_dropoff_prediction_synth.course_dashboard_30d) up to the course level. Read live from BigQuery (short server-side cache); nothing is stored in the MIND database. All endpoints require STUDENT_PERFORMANCE.can_view.
At-risk definition & bands. A student counts as at-risk for a course when the model labels them High or Medium (risk_level). A course’s at-risk rate is the share of its enrolled students that are at risk. Course bands (configurable): Critical rate ≥ 0.30, Elevated 0.20–0.29, otherwise Low.

Get Course Dashboard Stats

GET /v1/console/course-dropoff/stats
Summary cards: courses tracked, faculties, students affected, and Critical / Elevated course counts.

Query parameters

faculty
string
Filter by faculty.
programme
string
Filter by programme.
year
string
Filter by programme level.
cohort
string
Filter by cohort.
min_enrolled
integer
default:"1"
Exclude courses with fewer than this many enrolled students (keeps tiny courses from skewing bands).

Response

{
  "success": true,
  "data": {
    "courses_tracked": 766,
    "faculties": 4,
    "students_affected": 3000,
    "students_affected_change": -0.05,
    "critical": 0,
    "elevated": 23,
    "thresholds": {
      "critical_rate": 0.30,
      "elevated_rate": 0.20,
      "at_risk_levels": ["High", "Medium"],
      "bands": ["critical", "elevated", "low"]
    },
    "filters": {}
  },
  "message": null
}
students_affected_change is the week-over-week change in distinct at-risk students — the latest model run vs the previous, derived from run_history (a fraction, -0.05 = −5%; null if there’s only one run). Counts above are at min_enrolled=20; with these synthetic scores no course reaches the 30% Critical band.

List At-Risk Courses

GET /v1/console/course-dropoff/courses
Courses ranked by at-risk rate, one row per course.

Query parameters

faculty
string
Filter by faculty.
programme
string
Filter by programme.
year
string
Filter by programme level.
cohort
string
Filter by cohort.
risk_level
string
critical, elevated, or low. Omit for all courses.
Match on course code, course name, or programme.
min_enrolled
integer
default:"1"
Minimum enrolled students.
sort_by
string
default:"at_risk_rate"
at_risk_rate, at_risk_count, enrolled, or course_code.
sort_order
string
default:"desc"
asc or desc.
skip
integer
default:"0"
Records to skip.
limit
integer
default:"20"
Max records (1–100). Use limit=5 for the overview “Course drop-off prediction” widget.

Response

{
  "success": true,
  "data": [
    {
      "course_code": "ENT 224",
      "course_name": "ENT 224 - Entrepreneurship and Change Management",
      "programme": "BSc Public Health",
      "faculty": "Allied Health Sciences",
      "program_level": "200 Level",
      "enrolled": 50,
      "at_risk_count": 13,
      "at_risk_rate": 0.26,
      "band": "elevated",
      "high_count": 4,
      "avg_drop_off_score": 0.1731,
      "avg_score_trend_slope": -0.0022
    }
  ],
  "total": 766,
  "page": 1,
  "page_size": 20,
  "total_pages": 39,
  "message": null
}

Notes

  • at_risk_rate = at_risk_count / enrolled; band is derived from it. high_count is the students labelled High; avg_drop_off_score / avg_score_trend_slope are course averages.
  • Filters scope the underlying student rows, so e.g. programme=BSc Nursing counts only that programme’s students within each course.
  • programme / faculty are ANY_VALUE per course — a course is taken by students across programmes, so when no programme filter is applied the displayed programme is one of them.
  • Without min_enrolled, single-student courses (1 of 1 at risk = 100%) top the rate sort; set min_enrolled (e.g. 20) for a meaningful ranking.

Get Filter Options

GET /v1/console/course-dropoff/filter-options
{
  "success": true,
  "data": {
    "faculties": ["Allied Health Sciences", "Communication & Media Studies", "Computing", "..."],
    "programmes": ["BSc Computer Science", "..."],
    "years": ["100 Level", "200 Level", "300 Level", "400 Level"],
    "cohorts": ["January 2026 Cohort", "September 2025 Cohort", "..."]
  },
  "message": null
}

Export At-Risk Courses

GET /v1/console/course-dropoff/courses/export
Download the current filtered course list as CSV or XLSX. Same filters/search/sort/min_enrolled as the list endpoint.
format
string
default:"csv"
csv or xlsx.
Columns: Course Code, Course Name, Programme, Faculty, Year, Enrolled, At-Risk, At-Risk Rate, Band, High, Avg Drop-off Score, Trend Slope. Filename: at_risk_courses_{YYYY-MM-DD}.{csv|xlsx}. Hard cap 50,000 rows.