Skip to main content

Authentication

All auth endpoints live under /api/auth/* and return JSON.

Signup

POST /api/auth/signup

Creates a user and returns a JWT.

Body (choose one flow)

Email + password (required fields: fullName, role, email, password)

{
"fullName": "Jane Doe",
"role": "LEARNER",
"email": "user@example.com",
"password": "secret",
"phoneNumber": "+2376...",
"profilePhotoUrl": "https://...",
"bio": "Optional bio",
"deviceToken": "optional-device-token"
}

Phone + OTP (Firebase ID token) (required fields: fullName, role, phoneNumber, otpCode)

{
"fullName": "Jane Doe",
"role": "LEARNER",
"phoneNumber": "+2376...",
"otpCode": "FIREBASE_ID_TOKEN",
"email": "user@example.com",
"profilePhotoUrl": "https://...",
"bio": "Optional bio",
"deviceToken": "optional-device-token"
}

Response (201)

{
"success": true,
"data": {
"user": {},
"token": "<jwt>",
"isNew": true
}
}

Status codes

  • 201 Created
  • 400 Validation error
  • 409 User already exists

Login

POST /api/auth/login

Body (choose one flow)

Email + password

{
"email": "user@example.com",
"password": "secret"
}

Phone + OTP (Firebase ID token)

{
"phoneNumber": "+2376...",
"otpCode": "FIREBASE_ID_TOKEN"
}

Response (200)

{
"success": true,
"data": {
"user": {},
"token": "<jwt>",
"isNew": false
}
}

Status codes

  • 200 OK
  • 401 Invalid credentials

Google auth

POST /api/auth/google

Body (required field: idToken)

{
"idToken": "<google_id_token>",
"role": "LEARNER",
"fullName": "Jane Doe",
"profilePhotoUrl": "https://...",
"bio": "Optional bio",
"deviceToken": "optional-device-token"
}

Response (200)

{
"success": true,
"data": {
"user": {},
"token": "<jwt>",
"isNew": true
}
}

Status codes

  • 200 OK
  • 401 Invalid Google token

Get current user

GET /api/auth/me

Requires:

Authorization: Bearer <jwt>

Response (200)

{
"success": true,
"data": {
"user": {}
}
}

Status codes

  • 200 OK
  • 401 Unauthorized

Logout

POST /api/auth/logout

Response (200)

{
"success": true,
"data": {
"message": "Logged out successfully."
}
}