Expo API Documentation

Auth/request-otp

POST /api/auth/request-otp
Mock Responses: Add ?mock=success for success response or ?mock=error for error response

Headers:

  • Content-Type: application/json

Parameters:

  • email: string (required)

Success Response:

{
    "success": true,
    "message": "OTP sent successfully",
    "data": {
        "request_id": "req_abc123xyz",
        "otp_sent": true,
        "expires_in": 300
    }
}

Error Response:

{
    "success": false,
    "message": "Validation failed",
    "errors": {
        "email": [
            "The email field is required."
        ]
    }
}

Auth/verify-otp

POST /api/auth/verify-otp
Mock Responses: Add ?mock=success for success response or ?mock=error for error response

Headers:

  • Content-Type: application/json

Parameters:

  • email: string (required)
  • otp: string (required)
  • request_id: string (required)

Success Response:

{
    "success": true,
    "message": "Login successful",
    "data": {
        "token": "eyJ0eXAiOiJKV1QiLCJhbGc...",
        "user": {
            "id": 1,
            "email": "user@example.com",
            "name": null
        },
        "is_profile_completed": false,
        "is_approved": false,
        "next_step": "profile_setup"
    }
}

Error Response:

{
    "success": false,
    "message": "Invalid OTP",
    "errors": {
        "otp": [
            "The OTP is invalid or expired."
        ]
    }
}

Profile/upload-photo

POST /api/profile/upload-photo
Mock Responses: Add ?mock=success for success response or ?mock=error for error response

Headers:

  • Authorization: Bearer <token>
  • Content-Type: multipart/form-data

Parameters:

  • photo: file (required, max: 5MB, types: jpg,png,jpeg)

Success Response:

{
    "success": true,
    "message": "Photo uploaded successfully",
    "data": {
        "photo_url": "https:\/\/example.com\/storage\/profiles\/user123.jpg"
    }
}

Error Response:

{
    "success": false,
    "message": "Unauthorized",
    "errors": {
        "auth": [
            "Token is invalid or expired."
        ]
    }
}

Profile

PUT /api/profile
Mock Responses: Add ?mock=success for success response or ?mock=error for error response

Headers:

  • Authorization: Bearer <token>
  • Content-Type: application/json

Parameters:

  • full_name: string (required)
  • phone_number: string (required)
  • date_of_birth: string ISO8601 (required)
  • location: string (required)
  • gender: string enum: female|male|nonbinary (required)
  • about_me: string (optional)
  • photo_url: string (optional)

Success Response:

{
    "success": true,
    "message": "Profile saved successfully",
    "data": {
        "profile": {
            "id": 1,
            "full_name": "John Doe",
            "phone_number": "+1234567890",
            "date_of_birth": "1990-01-01",
            "location": "New York, USA",
            "gender": "male",
            "about_me": "Tech enthusiast",
            "photo_url": "https:\/\/example.com\/storage\/profiles\/user123.jpg"
        },
        "is_profile_completed": true
    }
}

Error Response:

{
    "success": false,
    "message": "Validation failed",
    "errors": {
        "full_name": [
            "The full name field is required."
        ],
        "phone_number": [
            "The phone number field is required."
        ]
    }
}

Interests

GET /api/interests
Mock Responses: Add ?mock=success for success response or ?mock=error for error response

Headers:

  • Authorization: Bearer <token>

Success Response:

{
    "success": true,
    "message": "Interests retrieved successfully",
    "data": {
        "interests": [
            {
                "id": 1,
                "name": "Technology"
            },
            {
                "id": 2,
                "name": "Sports"
            },
            {
                "id": 3,
                "name": "Music"
            },
            {
                "id": 4,
                "name": "Travel"
            },
            {
                "id": 5,
                "name": "Food"
            }
        ]
    }
}

Error Response:

{
    "success": false,
    "message": "Unauthorized",
    "errors": {
        "auth": [
            "Token is invalid or expired."
        ]
    }
}

Profile/interests

POST /api/profile/interests
Mock Responses: Add ?mock=success for success response or ?mock=error for error response

Headers:

  • Authorization: Bearer <token>
  • Content-Type: application/json

Parameters:

  • interest_ids: array<int> (required)

Success Response:

{
    "success": true,
    "message": "Interests saved successfully",
    "data": {
        "saved_count": 3,
        "selected_interests": [
            {
                "id": 1,
                "name": "Technology"
            },
            {
                "id": 2,
                "name": "Sports"
            },
            {
                "id": 3,
                "name": "Music"
            }
        ],
        "next_step": "approval_pending"
    }
}

Error Response:

{
    "success": false,
    "message": "Validation failed",
    "errors": {
        "interest_ids": [
            "The interest ids field is required."
        ]
    }
}

Profile/approval-status

GET /api/profile/approval-status
Mock Responses: Add ?mock=success for success response or ?mock=error for error response

Headers:

  • Authorization: Bearer <token>

Success Response:

{
    "success": true,
    "message": "Approval status retrieved",
    "data": {
        "status": "pending",
        "is_approved": false,
        "message": "Your profile is under review. We will notify you once approved."
    }
}

Error Response:

{
    "success": false,
    "message": "Unauthorized",
    "errors": {
        "auth": [
            "Token is invalid or expired."
        ]
    }
}