Skip to main content
GET
/
v1
/
mind
/
performance
Performance
curl --request GET \
  --url http://localhost:8000/v1/mind/performance \
  --header 'Authorization: Bearer <token>'
{
  "data": {
    "card": {
      "mastery_pct": 123,
      "band": "<string>",
      "programme": "<string>",
      "student_name": "<string>",
      "trend": "<string>"
    },
    "gaps": [
      {
        "competency": "<string>",
        "band": "<string>",
        "course": "<string>",
        "mastery_pct": 123,
        "status": "<string>"
      }
    ],
    "highlights": [
      {
        "competency": "<string>",
        "band": "<string>",
        "course": "<string>",
        "mastery_pct": 123,
        "status": "<string>"
      }
    ],
    "summary": "<string>",
    "score_date": "2023-12-25"
  },
  "message": "<string>",
  "success": true
}
Answers “how am I doing?” — one snapshot of the student’s mastery, drawn from the engine_mastery.how_am_i_doing table (one row per student, refreshed when the model re-scores). Identity is the verified token’s lms_user_id; there’s no request body.

The four fields

card
object
The headline / gauge: mastery_pct (0–100), band, trend, student_name, programme.
summary
string
A one-line read naming the student’s strongest competencies, with tone that shifts on their band — e.g. “You’re crushing Data Analysis (Advanced) and Research Methods (Mastered). Keep that going.”
highlights
array
What the student is strong in — competencies the model marks Advanced or Mastered. Each carries competency, mastery_pct, band, status, course.
gaps
array
What to keep an eye on — competencies marked Gap (including ones with no activity yet). Same shape.

How strong vs weak is decided

The mastery model already labels every competency in statusAdvanced / Mastered / In progress / Gap — so we use that directly: Advanced/Mastered become highlights, Gap becomes a gap, and In progress sits in neither. A percentage threshold is only a fallback for when status is absent. summary is a deterministic template today — it varies per student but costs nothing to produce. It can be swapped for an LLM-written line later, cached per (student, score_date) since the underlying data only changes when the model re-scores — no change to anything that calls it.
Identity is the verified lms_user_id claim. A token with no lms_user_id returns 400; a student who hasn’t been scored yet returns 404.

Authorizations

Authorization
string
header
required

Enter your JWT access token

Response

200 - application/json

Successful Response

data
PerformanceSnapshot · object
message
string | null
success
boolean
default:true