mlip_dropoff_prediction_synth.student_dashboard_30d) — this data is not stored
in the MIND database; each request queries BigQuery directly (with a short server-side
cache). All endpoints require STUDENT_PERFORMANCE.can_view permission.
How risk bands are derived. The model emits
risk_level of High / Medium / Low
plus a drop_off_score. The dashboard adds a Critical band as the top slice of High
(drop_off_score ≥ critical cutoff, default 0.50). Because the synthetic drop_off_score
tops out around 0.55, the table’s threshold column (0.7) is not used for flagging — the
calibrated cutoffs are: flagged ≥ 0.15, high ≥ 0.40, critical ≥ 0.50 (all configurable).Get Aggregate Dashboard Stats
Query parameters
Filter by faculty.
Filter by programme.
Filter by programme level (e.g.
100L, 300L).Filter by cohort (e.g.
202402_S1).Model-run timestamp to report on. Defaults to the latest run. When a non-latest run is
requested, card counts are derived from
drop_off_score (basis scores) rather than the
model labels (basis labels).Accepted for API symmetry. The band cards always show the full breakdown, so this does
not change the aggregate counts (it scopes the at-risk list).
Example request
Response
Field reference
| Field | Description |
|---|---|
total_flagged / critical / high / medium | { count, pct_change }. pct_change is a fraction (-0.2886 = −28.86%) vs the previous run, derived from run_history scores. null when there is no prior run. |
cards_basis | labels (counts from the model’s risk_level on the latest snapshot) or scores (score-derived, for a historical period). |
current_period / previous_period | Model-run timestamps used for the comparison. |
thresholds | The calibrated cutoffs in effect, plus the informational model threshold. |
Get Filter Options
Response
Predicted Drop-off Over Time
run_history so
they are consistent across runs.
Query parameters
this_week, this_month, last_month, this_quarter, last_quarter, this_year, last_year, or all. Windows are relative to the latest run.Filter by faculty.
Filter by programme.
Filter by programme level.
Filter by cohort.
Response
Trend counts are score-derived (cutoffs flagged
≥0.15, high ≥0.40, critical ≥0.50),
so they reconcile with the latest aggregate cards at the most recent run but use scores —
not labels — for earlier runs (which have no stored label).List At-Risk Students
risk_level.
Query parameters
Filter by faculty.
Filter by programme.
Filter by programme level (e.g.
300L).Filter by cohort.
critical, high, medium, or low. Omit to return all flagged students (High + Medium).Run timestamp. Defaults to the latest run. A historical run is re-scored from
run_history (band derived from score; risk_level label is omitted for past runs).Match on name, email, student id, or programme (case-insensitive).
drop_off_score, days_since_last_activity, or fullname.asc or desc.Records to skip.
Max records (1-100).
Example request
Response
risk_reasons powers the “Key signals” chips on each row.
Export At-Risk Students
risk_level,
search, and sort as the list endpoint.
Query parameters
csv or xlsx.faculty, programme, year, cohort, risk_level, search, sort_by, sort_order.
Response
A file download. Columns: Student Name, Student ID, Email, Programme, Faculty, Year, Risk Band, Risk Score, Days Inactive, Missed Deadline, Key Signals, Last Scored. Filename:at_risk_students_{YYYY-MM-DD}.{csv|xlsx}. Hard cap of 50,000 rows.
Get Student Risk Profile & Trend
drop_off_score), risk trajectory, behavioural / academic / payment signals, per-course
risk, and the full 24-run score trend.
Path parameters
The student’s ID (BigQuery
student_id).Example request
Response
Notes
confidenceis the model’sdrop_off_score(probability of drop-off).trajectoryis derived fromscore_trend_slope:worsening(rising risk),improving, orstable.risk_score_deltais the change indrop_off_scorefrom the previous run to the latest.engagement_level(low/medium/high) is derived from 30-day active/login days.missed_assessmentscounts the student’s courses with a missed deadline.trendcontains only real runs — the warehouse padsrun_historyto a fixed length with empty entries, which are dropped.404 NOT_FOUNDif the student is not in the drop-off dataset.
Get Prediction History
Path parameters
The student’s ID.
Response
Field reference
| Field | Description |
|---|---|
runs[].risk_band | Score-derived band for that run (critical/high/medium/low). |
runs[].delta_vs_previous | Change in drop_off_score from the prior run; null for the first run. |
trajectory | Overall direction from score_trend_slope. |