List Student Summaries
GET /v1/console/student-performance
Returns one row per (student × case study) pair. Each row shows the student’s best score, total graded attempts, latest attempt date, and transcript availability for that case study.
Authentication
Requires STUDENT_PERFORMANCE.can_view permission.
Query parameters
Search by student name or email (case-insensitive).
Filter to a specific case study.
Filter by transcript state: available, partial, processing, missing, or failed.
Filter by latest attempt date (ISO 8601).
Filter by latest attempt date (ISO 8601).
sort_by
string
default:"latest_attempt_at"
Sort field: latest_attempt_at, final_score, attempt_count, or student_name.
Number of records to skip.
Max records to return (1-100).
Example request
curl "https://mind-be.staging.miva.university/v1/console/student-performance?case_study_id=6650a1b2c3d4e5f6a7b8c9d0&sort_by=final_score&sort_order=desc&limit=20" \
-H "Authorization: Bearer <access_token>"
Response
{
"success": true,
"data": [
{
"user_id": "6650a1b2c3d4e5f6a7b8c9d0",
"student_name": "Jane Smith",
"student_email": "jane.smith@example.com",
"case_study_id": "6650c3d4e5f6a7b8c9d0e1f2",
"case_study_title": "Ethiopian Airlines Case Study",
"attempt_count": 3,
"final_score": 82.5,
"best_session_id": "6650d4e5f6a7b8c9d0e1f2a3",
"latest_attempt_at": "2026-04-01T14:30:00Z",
"transcript_status": "available"
}
],
"total": 1,
"page": 1,
"page_size": 20,
"total_pages": 1,
"message": null
}
Notes
- Final score is the highest score across all graded attempts for that student × case study. If two attempts tie, the most recent one is used.
- Transcript status is an aggregate across all attempts: it shows the worst status (e.g. if one attempt is
missing and two are available, the summary shows missing).
- Only sessions that lasted 60+ seconds (counted as a real attempt) and have been graded are included in the summary.
GET /v1/console/student-performance/export
Download the current filtered view as a CSV file. Uses the same filters as the summary list endpoint.
Authentication
Requires STUDENT_PERFORMANCE.can_export permission.
Query parameters
Same as List Student Summaries: search, case_study_id, transcript_status, start_date, end_date.
Example request
curl "https://mind-be.staging.miva.university/v1/console/student-performance/export?case_study_id=6650c3d4e5f6a7b8c9d0e1f2" \
-H "Authorization: Bearer <access_token>" \
-o student_performance.csv
Response
Returns a text/csv file download.
Filename format: student_performance_{tenant_slug}_{YYYY-MM-DD}.csv
Columns:
| Column | Description |
|---|
| Student Name | Display name |
| Email | Student email |
| Case Study | Case study title |
| Attempts | Number of graded attempts |
| Final Score | Best attempt score |
| Best Session ID | Session ID of the best attempt |
| Latest Attempt | ISO 8601 timestamp |
| Transcript Status | available, partial, processing, missing, or failed |
Limits
Hard cap of 50,000 rows per export. If exceeded, narrow your filters.
Get Student Detail
GET /v1/console/student-performance/{user_id}
Get a single student’s performance summary across all their case studies (or a specific one).
Authentication
Requires STUDENT_PERFORMANCE.can_view permission.
Path parameters
Query parameters
Optionally scope to a single case study.
Example request
curl "https://mind-be.staging.miva.university/v1/console/student-performance/6650a1b2c3d4e5f6a7b8c9d0" \
-H "Authorization: Bearer <access_token>"
Response
{
"success": true,
"data": {
"user_id": "6650a1b2c3d4e5f6a7b8c9d0",
"student_name": "Jane Smith",
"student_email": "jane.smith@example.com",
"per_case_study": [
{
"case_study_id": "6650c3d4e5f6a7b8c9d0e1f2",
"case_study_title": "Ethiopian Airlines Case Study",
"attempt_count": 3,
"final_score": 82.5,
"best_session_id": "6650d4e5f6a7b8c9d0e1f2a3",
"latest_attempt_at": "2026-04-01T14:30:00Z",
"transcript_status": "available"
}
],
"total_attempts": 3,
"average_score": 82.5
},
"message": null
}
Get Attempt History
GET /v1/console/student-performance/{user_id}/attempts
List all attempts (sessions) for a student on a specific case study, newest first.
Authentication
Requires STUDENT_PERFORMANCE.can_view permission.
Path parameters
Query parameters
The case study to view attempts for.
Example request
curl "https://mind-be.staging.miva.university/v1/console/student-performance/6650a1b2c3d4e5f6a7b8c9d0/attempts?case_study_id=6650c3d4e5f6a7b8c9d0e1f2" \
-H "Authorization: Bearer <access_token>"
Response
{
"success": true,
"data": {
"user_id": "6650a1b2c3d4e5f6a7b8c9d0",
"student_name": "Jane Smith",
"student_email": "jane.smith@example.com",
"case_study_id": "6650c3d4e5f6a7b8c9d0e1f2",
"case_study_title": "Ethiopian Airlines Case Study",
"best_session_id": "6650d4e5f6a7b8c9d0e1f2a3",
"final_score": 82.5,
"transcript_coverage": {
"available": 2,
"partial": 0,
"processing": 0,
"missing": 1,
"failed": 0
},
"attempts": [
{
"session_id": "6650d4e5f6a7b8c9d0e1f2a3",
"attempt_label": "Attempt 3",
"score": 82.5,
"status": "ended",
"started_at": "2026-04-01T14:20:00Z",
"ended_at": "2026-04-01T14:30:00Z",
"duration_seconds": 542.0,
"transcript_status": "available",
"grading_status": "complete",
"used_for_final_score": true,
"counted_as_attempt": true
},
{
"session_id": "6650d3e4f5a6b7c8d9e0f1a2",
"attempt_label": "Attempt 2",
"score": 68.0,
"status": "ended",
"started_at": "2026-03-28T10:00:00Z",
"ended_at": "2026-03-28T10:08:30Z",
"duration_seconds": 480.0,
"transcript_status": "available",
"grading_status": "complete",
"used_for_final_score": false,
"counted_as_attempt": true
},
{
"session_id": "6650d2e3f4a5b6c7d8e9f0a1",
"attempt_label": "Attempt 1",
"score": 55.0,
"status": "ended",
"started_at": "2026-03-20T09:15:00Z",
"ended_at": "2026-03-20T09:25:00Z",
"duration_seconds": 600.0,
"transcript_status": "missing",
"grading_status": "complete",
"used_for_final_score": false,
"counted_as_attempt": true
}
]
},
"message": null
}
Field reference
| Field | Description |
|---|
attempt_label | Human-readable label (chronological: “Attempt 1”, “Attempt 2”, etc.) |
score | Grade score for this attempt, or null if not yet graded |
status | Session status: pending, active, or ended |
transcript_status | available, partial, processing, missing, or failed |
grading_status | pending, complete, or failed |
used_for_final_score | true if this is the best-scoring attempt |
counted_as_attempt | true if the session lasted 60+ seconds |
transcript_coverage | Breakdown of transcript states across all attempts |
Get Attempt Detail
GET /v1/console/student-performance/attempts/{session_id}
Full detail for a single attempt: transcript and grading breakdown together in one response.
Authentication
Requires STUDENT_PERFORMANCE.can_view permission.
Path parameters
The session ID of the attempt.
Example request
curl "https://mind-be.staging.miva.university/v1/console/student-performance/attempts/6650d4e5f6a7b8c9d0e1f2a3" \
-H "Authorization: Bearer <access_token>"
Response
{
"success": true,
"data": {
"session_id": "6650d4e5f6a7b8c9d0e1f2a3",
"user_id": "6650a1b2c3d4e5f6a7b8c9d0",
"student_name": "Jane Smith",
"student_email": "jane.smith@example.com",
"case_study_id": "6650c3d4e5f6a7b8c9d0e1f2",
"case_study_title": "Ethiopian Airlines Case Study",
"attempt_label": "Attempt 3",
"used_for_final_score": true,
"session": {
"status": "ended",
"start_time": "2026-04-01T14:20:00Z",
"end_time": "2026-04-01T14:30:00Z",
"duration_seconds": 542.0,
"end_reason": "user_ended"
},
"transcript": {
"session_id": "6650d4e5f6a7b8c9d0e1f2a3",
"status": "available",
"messages": [
{
"role": "assistant",
"content": "Welcome to the Ethiopian Airlines case study. Let's begin by discussing...",
"sequence": 1,
"timestamp": "2026-04-01T14:20:05Z"
},
{
"role": "user",
"content": "I think the key issue here is the fleet management strategy...",
"sequence": 2,
"timestamp": "2026-04-01T14:20:45Z"
}
],
"reason": null
},
"grade": {
"grade_id": "6650e5f6a7b8c9d0e1f2a3b4",
"session_id": "6650d4e5f6a7b8c9d0e1f2a3",
"final_score": 82.5,
"overall_summary": "The student demonstrated strong critical thinking with well-structured arguments...",
"items": [
{
"criterion_name": "Critical Thinking",
"score": 85.0,
"max_score": 100.0,
"weight": 0.4,
"feedback": "Strong analytical approach with evidence-based reasoning...",
"sequence": 1
},
{
"criterion_name": "Comprehension",
"score": 80.0,
"max_score": 100.0,
"weight": 0.3,
"feedback": "Good understanding of the case material...",
"sequence": 2
},
{
"criterion_name": "Communication",
"score": 82.0,
"max_score": 100.0,
"weight": 0.3,
"feedback": "Clear and articulate responses...",
"sequence": 3
}
],
"strengths": [
{
"title": "Analytical Depth",
"description": "Consistently broke down complex problems into manageable components"
}
],
"weaknesses": [
{
"title": "Time Management",
"description": "Could have explored more aspects of the case within the time limit"
}
],
"score_justifications": {
"Critical Thinking": "The student provided evidence from the case document when making arguments about fleet management..."
},
"created_at": "2026-04-01T14:31:00Z"
}
},
"message": null
}
Notes
- If transcript is unavailable,
transcript.status will indicate the state and transcript.reason provides a human-readable explanation. transcript.messages will be an empty array.
- If the attempt hasn’t been graded yet,
grade will be null.
Get Transcript
GET /v1/console/student-performance/attempts/{session_id}/transcript
Retrieve just the transcript for a specific attempt.
Authentication
Requires STUDENT_PERFORMANCE.can_view permission.
Path parameters
The session ID of the attempt.
Example request
curl "https://mind-be.staging.miva.university/v1/console/student-performance/attempts/6650d4e5f6a7b8c9d0e1f2a3/transcript" \
-H "Authorization: Bearer <access_token>"
Response
{
"success": true,
"data": {
"session_id": "6650d4e5f6a7b8c9d0e1f2a3",
"status": "available",
"messages": [
{
"role": "assistant",
"content": "Welcome to the Ethiopian Airlines case study...",
"sequence": 1,
"timestamp": "2026-04-01T14:20:05Z"
},
{
"role": "user",
"content": "I think the key issue here is...",
"sequence": 2,
"timestamp": "2026-04-01T14:20:45Z"
}
],
"reason": null
},
"message": null
}
Transcript statuses
| Status | Meaning |
|---|
available | Full transcript with messages |
partial | Session in progress, some messages logged |
processing | Session active but no messages yet |
missing | Session ended but no transcript was recorded |
failed | Transcript generation failed |
When status is not available or partial, messages will be an empty array and reason will explain why.
Get Grade
GET /v1/console/student-performance/attempts/{session_id}/grade
Retrieve just the grading breakdown for a specific attempt.
Authentication
Requires STUDENT_PERFORMANCE.can_view permission.
Path parameters
The session ID of the attempt.
Example request
curl "https://mind-be.staging.miva.university/v1/console/student-performance/attempts/6650d4e5f6a7b8c9d0e1f2a3/grade" \
-H "Authorization: Bearer <access_token>"
Response
{
"success": true,
"data": {
"grade_id": "6650e5f6a7b8c9d0e1f2a3b4",
"session_id": "6650d4e5f6a7b8c9d0e1f2a3",
"final_score": 82.5,
"overall_summary": "The student demonstrated strong critical thinking...",
"items": [
{
"criterion_name": "Critical Thinking",
"score": 85.0,
"max_score": 100.0,
"weight": 0.4,
"feedback": "Strong analytical approach...",
"sequence": 1
},
{
"criterion_name": "Comprehension",
"score": 80.0,
"max_score": 100.0,
"weight": 0.3,
"feedback": "Good understanding of the case material...",
"sequence": 2
},
{
"criterion_name": "Communication",
"score": 82.0,
"max_score": 100.0,
"weight": 0.3,
"feedback": "Clear and articulate responses...",
"sequence": 3
}
],
"strengths": [
{
"title": "Analytical Depth",
"description": "Consistently broke down complex problems into manageable components"
}
],
"weaknesses": [
{
"title": "Time Management",
"description": "Could have explored more aspects within the time limit"
}
],
"score_justifications": {
"Critical Thinking": "The student provided evidence from the case document..."
},
"created_at": "2026-04-01T14:31:00Z"
},
"message": null
}
Grading criteria
Scores are computed as a weighted average:
| Criterion | Weight | Score range |
|---|
| Critical Thinking | 40% | 0–100 |
| Comprehension | 30% | 0–100 |
| Communication | 30% | 0–100 |
Final Score = (Critical Thinking × 0.4) + (Comprehension × 0.3) + (Communication × 0.3)
Error responses
| Status | Code | Condition |
|---|
404 | NOT_FOUND | Session not found or grade not yet available |