Skip to main content

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).
case_study_id
string
Filter to a specific case study.
transcript_status
string
Filter by transcript state: available, partial, processing, missing, or failed.
start_date
datetime
Filter by latest attempt date (ISO 8601).
end_date
datetime
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.
sort_order
string
default:"desc"
asc or desc.
skip
integer
default:"0"
Number of records to skip.
limit
integer
default:"50"
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.

Export Student Performance (CSV)

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:
ColumnDescription
Student NameDisplay name
EmailStudent email
Case StudyCase study title
AttemptsNumber of graded attempts
Final ScoreBest attempt score
Best Session IDSession ID of the best attempt
Latest AttemptISO 8601 timestamp
Transcript Statusavailable, 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

user_id
string
required
The student’s user ID.

Query parameters

case_study_id
string
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

user_id
string
required
The student’s user ID.

Query parameters

case_study_id
string
required
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

FieldDescription
attempt_labelHuman-readable label (chronological: “Attempt 1”, “Attempt 2”, etc.)
scoreGrade score for this attempt, or null if not yet graded
statusSession status: pending, active, or ended
transcript_statusavailable, partial, processing, missing, or failed
grading_statuspending, complete, or failed
used_for_final_scoretrue if this is the best-scoring attempt
counted_as_attempttrue if the session lasted 60+ seconds
transcript_coverageBreakdown 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

session_id
string
required
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

session_id
string
required
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

StatusMeaning
availableFull transcript with messages
partialSession in progress, some messages logged
processingSession active but no messages yet
missingSession ended but no transcript was recorded
failedTranscript 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

session_id
string
required
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:
CriterionWeightScore range
Critical Thinking40%0–100
Comprehension30%0–100
Communication30%0–100
Final Score = (Critical Thinking × 0.4) + (Comprehension × 0.3) + (Communication × 0.3)

Error responses

StatusCodeCondition
404NOT_FOUNDSession not found or grade not yet available