One compound response: profile, suggested mentors (empty until the profile is complete), dashboard counts, recent requests, and active connections.
Response
{
"user": {
"id": 1,
"userType": "student"
},
"studentProfile": null,
"suggestedMentors": [],
"counts": {
"pendingRequests": 0,
"activeConnections": 0,
"unreadMessages": 0
},
"recentRequests": [],
"activeConnections": []
}
One compound response: profile, pending/active/capacity/unread counts, recent requests, and active connections.
Response
{
"user": {
"id": 2,
"userType": "mentor"
},
"mentorProfile": null,
"counts": {
"pendingRequests": 0,
"activeMentees": 0,
"remainingCapacity": 1,
"unreadMessages": 0
},
"recentRequests": [],
"activeConnections": []
}
Every endpoint below requires the current user's userType to be admin (403 otherwise), and every state change is recorded to audit_log.
Search and filter users, with enough context to review them (profiles, active connections, reports received) without exposing message contents.
Query
| Field | Notes |
|---|---|
userType, status, search, page, pageSize | All optional. |
Response
{
"items": [
{
"user": {
"id": 2,
"userType": "mentor",
"status": "active"
},
"counts": {
"activeConnections": 1,
"reportsReceived": 0
}
}
],
"page": 1,
"pageSize": 20,
"totalItems": 1
}
Sets the user to active, disabled, or blocked. Disabled/blocked users are excluded from matching and cannot send messages.
Request fields
| Field | Notes |
|---|---|
status | Required. One of active, disabled, blocked. |
reason | Optional, stored in the audit entry. |
Open and historical reports, filterable by status or type.
Query
| Field | Notes |
|---|---|
status, reportType, page, pageSize | All optional. |
Marks a report reviewed/resolved and stores admin notes.
Request fields
| Field | Notes |
|---|---|
status | Required. One of open, under_review, resolved, dismissed. |
adminNotes | Optional. |