Skip to main content

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."
}
}