Skip to main content
The feedback form was revamped in v2.2. The submission body now collects five 1–5 ratings, three yes/maybe/no answers, and five optional free-text fields. The response item on this endpoint reflects all of those. The analytics block returns five averages (one per rating) instead of a single average_rating. See the legacy doc for the older shapes if you’re maintaining a transitional integration.
Students submit feedback after completing a case study session — see POST /v1/feedbacks for the submission contract. This endpoint powers the admin Student Feedback dashboard: it returns a paginated feedback list joined to the student and case study, alongside aggregate analytics over the same filtered set. Each feedback record is automatically tied to:
  • The case study (resolved from the session, validated against the live CaseStudy document).
  • The student (taken from the session’s auth context at submission time).
  • The session (one feedback per session — enforced by a unique index).

List Feedbacks

GET /v1/console/feedbacks
Returns one page of feedback records plus analytics computed across the entire filtered set (not just the page). Analytics recompute whenever filters change.

Authentication

Requires FEEDBACK.can_view permission. Admins and faculty members granted this permission on their RBAC role can access the endpoint.

Query parameters

case_study_id
string
Filter analytics and feedback to a single case study.
Case-insensitive substring match against student first / middle / last name (and the legacy name field), student email, and case study title.
page
integer
default:"1"
1-based page number.
limit
integer
default:"50"
Page size (1–100).

Optional extras

user_id
string
Filter to a specific student.
min_rating
integer
Minimum session rating (1–5). Filters on rating.
max_rating
integer
Maximum session rating (1–5). Filters on rating.
start_date
datetime
ISO 8601 lower bound on submission time.
end_date
datetime
ISO 8601 upper bound on submission time.
sort_by
string
default:"created_at"
One of created_at, rating, difficulty_level, clarity_level, overall_experience_rating, interface_rating.
sort_order
string
default:"desc"
asc or desc.

Example request

curl "https://staging-be.mind.miva.university/v1/console/feedbacks?case_study_id=6650c3d4e5f6a7b8c9d0e1f2&page=1&limit=10" \
  -H "Authorization: Bearer <access_token>"

Success response

{
  "success": true,
  "data": {
    "filters": {
      "case_study_id": "6650c3d4e5f6a7b8c9d0e1f2",
      "search": null
    },
    "analytics": {
      "average_session_rating": 4.5,
      "average_difficulty": 3.8,
      "average_clarity": 4.6,
      "average_overall_experience": 4.7,
      "average_interface": 4.2,
      "feedback_received": 12,
      "case_studies": 1
    },
    "feedback": [
      {
        "feedback_id": "6650f1a2b3c4d5e6f7a8b9c0",
        "session_id": "6650d4e5f6a7b8c9d0e1f2a3",
        "student": {
          "student_id": "6650a1b2c3d4e5f6a7b8c9d0",
          "name": "Ada Johnson",
          "email": "ada.johnson@example.com"
        },
        "case_study": {
          "case_study_id": "6650c3d4e5f6a7b8c9d0e1f2",
          "title": "Diabetes Patient Assessment"
        },
        "rating": 5,
        "difficulty_level": 4,
        "clarity_level": 5,
        "overall_experience_rating": 5,
        "interface_rating": 4,
        "helpful_for_learning": "yes",
        "avatar_relatable": "maybe",
        "would_recommend": "yes",
        "most_valuable": "Being challenged to defend my reasoning.",
        "confusing_or_difficult": null,
        "improvements": "A short scenario summary on the case study card.",
        "avatar_feedback": "The voice felt natural.",
        "additional_info": null,
        "completed_at": "2026-04-30T10:32:00Z"
      }
    ],
    "pagination": {
      "total": 12,
      "page": 1,
      "page_size": 10,
      "total_pages": 2
    }
  },
  "message": "Student feedback retrieved successfully."
}

Empty-state response

When no feedback matches the active filters, the endpoint still returns 200 OK with zeroed analytics and an empty list:
{
  "success": true,
  "data": {
    "filters": { "case_study_id": "6650c3d4e5f6a7b8c9d0e1f2", "search": "unknown" },
    "analytics": {
      "average_session_rating": 0,
      "average_difficulty": 0,
      "average_clarity": 0,
      "average_overall_experience": 0,
      "average_interface": 0,
      "feedback_received": 0,
      "case_studies": 0
    },
    "feedback": [],
    "pagination": { "total": 0, "page": 1, "page_size": 10, "total_pages": 0 }
  },
  "message": "No feedback found."
}

Field reference

data.analytics

Aggregates over the filtered, unpaginated set. Each rating average is rounded to one decimal; 0 when no feedback matches.
FieldDescription
average_session_ratingMean of rating (session rating).
average_difficultyMean of difficulty_level.
average_clarityMean of clarity_level.
average_overall_experienceMean of overall_experience_rating.
average_interfaceMean of interface_rating.
feedback_receivedTotal feedback count after all filters (equal to data.pagination.total).
case_studiesDistinct case studies represented in the filtered set. Always 1 when case_study_id is supplied.

data.feedback[]

FieldDescription
feedback_idFeedback record id.
session_idUnderlying completed session id.
student.student_idUser id of the student who submitted.
student.nameDisplay name (first + middle + last, falling back to legacy name). May be null.
student.emailStudent email. May be null.
case_study.case_study_idCase study id.
case_study.titleCase study title. May be null if hard-deleted.
ratingSession rating, 1–5.
difficulty_levelDifficulty rating, 1–5.
clarity_levelAgent-clarity rating, 1–5.
overall_experience_ratingOverall MIND v2 experience, 1–5.
interface_ratingInterface design, 1–5.
helpful_for_learningyes / maybe / no.
avatar_relatableyes / maybe / no.
would_recommendyes / maybe / no.
most_valuableFree text, null if not provided.
confusing_or_difficultFree text, null if not provided.
improvementsFree text, null if not provided.
avatar_feedbackFree text, null if not provided.
additional_infoFree text, null if not provided.
completed_atWhen the student submitted (the feedback row’s created_at).
Legacy rows ingested before v2.2 don’t carry the new fields — those will be null on this endpoint. The five rating averages still compute over whichever rows have the corresponding fields; rows missing a rating are excluded from that average specifically.