Authentication
Signup
POST /api/auth/signup
Creates a user and returns a JWT.
Body (choose one flow)
Email + password
{
"email": "user@example.com",
"password": "secret",
"fullName": "Jane Doe",
"role": "LEARNER",
"regionsOfOrigin": ["<region_uuid>"]
}
Phone (OTP handled by Firebase)
{
"phoneNumber": "+2376...",
"fullName": "Jane Doe",
"role": "LEARNER",
"regionsOfOrigin": ["<region_uuid>"]
}
Response
{
"success": true,
"data": {
"user": {},
"token": "<jwt>"
}
}
Login
POST /api/auth/login
Body (choose one flow)
Email + password
{
"email": "user@example.com",
"password": "secret"
}
Phone + OTP
{
"phoneNumber": "+2376...",
"otpCode": "123456"
}
Response
{
"success": true,
"data": {
"token": "<jwt>",
"firebase": {}
}
}
Google auth
POST /api/auth/google
Body
{
"idToken": "<google_id_token>",
"role": "LEARNER",
"regionsOfOrigin": ["<region_uuid>"],
"fullName": "Jane Doe",
"profilePhotoUrl": "https://...",
"bio": "Optional bio",
"deviceToken": "optional-device-token"
}
Response
{
"success": true,
"data": {
"user": {},
"token": "<jwt>",
"isNew": true
}
}
Get current user
GET /api/auth/me
Requires:
Authorization: Bearer <jwt>
Response
{
"success": true,
"data": {
"user": {}
}
}
Logout
POST /api/auth/logout
Response
{
"success": true,
"data": {
"message": "Logged out successfully."
}
}