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 Created400 Validation error409 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 OK401 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 OK401 Invalid Google token
Get current user
GET /api/auth/me
Requires:
Authorization: Bearer <jwt>
Response (200)
{
"success": true,
"data": {
"user": {}
}
}
Status codes
200 OK401 Unauthorized
Logout
POST /api/auth/logout
Response (200)
{
"success": true,
"data": {
"message": "Logged out successfully."
}
}