GET
/me
Get the current user

Returns the authenticated user's local record, profiles (if any), and simple dashboard counts. 404 if no local user exists yet for this Auth account.

Response

{
  "user": {
    "id": 1,
    "userType": "student",
    "email": "sam@example.com",
    "displayName": "Sam Student",
    "status": "active"
  },
  "studentProfile": null,
  "mentorProfile": null,
  "counts": {
    "pendingRequests": 0,
    "activeConnections": 0,
    "unreadMessages": 0
  }
}
POST
/me
Create the current user

Creates the local mentoring user linked to the JWT sub. Auth accounts are created by the Auth service, not here - this only creates the local profile row. 409 if one already exists.

Request fields

FieldNotes
userTypeRequired. One of student, mentor, admin.
emailRequired.
displayNameRequired.
mobileNumberOptional. Doubles as the WhatsApp contact number once a connection is accepted.
profileImageCodeOptional. Code returned by Imaginary after uploading the photo.
PATCH
/me
Update the current user

Updates basic account fields. Every field is optional; only supplied fields change. Audited to audit_log.

Request fields

FieldNotes
emailOptional.
mobileNumberOptional.
displayNameOptional.
profileImageCodeOptional.
GET
/student-profile
Get the current student profile

404 if the current user has not created one yet.

POST
/student-profile
Create or update the current student profile

Creates the student profile if missing. If one already exists, the supplied fields are applied as an update and profileStatus is recomputed.

Request fields

FieldNotes
fieldOfStudyRequired for the profile to become complete.
careerInterestsRequired for the profile to become complete.
discussionTopicsRequired for the profile to become complete.
locationArea, currentStudies, qualification, shortIntroduction, cvFileCodeOptional.
tagsOptional array of matching keywords, e.g. ["Accounting", "Audit"]. See GET /tags.

Why profileStatus matters

Only a complete student profile is eligible for GET /mentor-suggestions. profileStatus is computed by the server - it is never accepted from the client.

PATCH
/student-profile
Update the current student profile

Partial update; only supplied fields change. Recomputes profileStatus after the update. 404 if no profile exists yet.

GET
/mentor-profile
Get the current mentor profile

Includes counts.activeMentees and counts.remainingCapacity alongside the profile. 404 if not created yet.

POST
/mentor-profile
Create the current mentor profile

A user has at most one mentor profile. 409 if one already exists.

Request fields

FieldNotes
occupation, industry, discussionTopicsRequired for the profile to become complete.
locationArea, educationBackground, professionalExperience, interests, shortProfileSummary, cvFileCodeOptional.
maxActiveMenteesOptional, defaults to 1. Maximum active mentees at one time.
isAvailableOptional, defaults to true.
profileVisibilityOptional, defaults to anonymous. One of anonymous, semi_anonymous, visible_after_acceptance - controls what students see before accepting, see the Discovery docs.
tagsOptional array of matching keywords.
PATCH
/mentor-profile
Update the current mentor profile

Partial update, including changing profileVisibility or maxActiveMentees at any time. 404 if no profile exists yet.

POST
/mentor-profile/availability
Update mentor availability

A lighter-weight endpoint for the common case of toggling availability or adjusting the mentee limit without resending the whole profile. Reducing the limit does not end existing connections.

Request fields

FieldNotes
isAvailableRequired.
maxActiveMenteesOptional.
GET
/tags
List matching tags

Returns the active tag keywords used for student/mentor matching, e.g. Accounting, Audit, Software Development.

Response

{
  "tags": [
    "Accounting",
    "Audit",
    "Auditing",
    "Auditor",
    "Software Development",
    "Career Advice"
  ]
}
GET
/tag-suggestions
Suggest tags from free text

Looks up known keywords and simple synonyms for text the user typed, so they can confirm tags rather than free-typing them onto their profile.

Query

FieldNotes
textRequired. Example: ?text=Audit.

Response

{
  "tags": [
    "Audit",
    "Auditor",
    "Auditing",
    "Accounting"
  ]
}