http://localhost:5000/api
All protected endpoints require a Bearer token in the Authorization header:
Authorization: Bearer {token}
POST /auth/register
Create a new user account.
Request Body:
{
"name": "John Doe",
"email": "john@example.com",
"password": "password123",
"role": "student"
}Response (201):
{
"success": true,
"message": "User registered successfully",
"token": "eyJhbGc...",
"user": {
"id": "user_id",
"name": "John Doe",
"email": "john@example.com",
"role": "student"
}
}POST /auth/login
Authenticate and get access token.
Request Body:
{
"email": "john@example.com",
"password": "password123"
}Response (200):
{
"success": true,
"message": "Login successful",
"token": "eyJhbGc...",
"user": {
"id": "user_id",
"name": "John Doe",
"email": "john@example.com",
"role": "student",
"points": 250,
"level": 3,
"badges": ["badge1", "badge2"]
}
}GET /users/profile
Headers: Authorization required
Response (200):
{
"success": true,
"user": {
"id": "user_id",
"name": "John Doe",
"email": "john@example.com",
"role": "student",
"points": 250,
"level": 3,
"badges": [
{
"id": "badge_id",
"name": "Quick Learner",
"description": "Complete 5 quizzes"
}
],
"enrolledCourses": ["course1", "course2"]
}
}PUT /users/profile
Headers: Authorization required
Request Body:
{
"name": "John Doe Updated",
"bio": "Learning enthusiast",
"profileImage": "https://example.com/image.jpg"
}Response (200):
{
"success": true,
"message": "Profile updated",
"user": { ... }
}POST /users/enroll
Headers: Authorization required
Request Body:
{
"courseId": "course_id"
}Response (200):
{
"success": true,
"message": "Enrolled successfully",
"course": { ... }
}GET /users/courses
Headers: Authorization required
Response (200):
{
"success": true,
"courses": [
{
"id": "course_id",
"title": "JavaScript Basics",
"description": "Learn JavaScript fundamentals",
"level": "beginner",
"lessons": 10,
"studentCount": 150
}
]
}GET /courses
Response (200):
{
"success": true,
"courses": [
{
"id": "course_id",
"title": "JavaScript Basics",
"description": "Learn JavaScript fundamentals",
"category": "Programming",
"level": "beginner",
"instructor": {
"name": "Jane Smith",
"email": "jane@example.com"
},
"lessons": 10,
"studentCount": 150,
"rating": 4.5
}
]
}GET /courses/{courseId}
Response (200):
{
"success": true,
"course": {
"id": "course_id",
"title": "JavaScript Basics",
"description": "Learn JavaScript fundamentals",
"lessons": [
{
"id": "lesson_id",
"title": "Introduction to JavaScript",
"description": "Get started with JS",
"contentType": "video",
"videoUrl": "https://example.com/video.mp4",
"duration": 30,
"quiz": {
"id": "quiz_id",
"title": "JS Basics Quiz",
"questions": 10
}
}
]
}
}GET /courses/{courseId}/progress
Headers: Authorization required
Response (200):
{
"success": true,
"progress": {
"id": "progress_id",
"completedLessons": ["lesson1", "lesson2"],
"completionPercentage": 40,
"enrolledAt": "2024-01-15T10:00:00Z",
"lastAccessedAt": "2024-01-17T14:30:00Z"
}
}POST /courses/mark-complete
Headers: Authorization required
Request Body:
{
"courseId": "course_id",
"lessonId": "lesson_id"
}Response (200):
{
"success": true,
"message": "Lesson marked complete",
"progress": { ... }
}POST /gamification/submit-quiz
Headers: Authorization required
Request Body:
{
"quizId": "quiz_id",
"lessonId": "lesson_id",
"courseId": "course_id",
"answers": [
{
"questionIndex": 0,
"selectedAnswer": "option_a"
},
{
"questionIndex": 1,
"selectedAnswer": "option_b"
}
]
}Response (200):
{
"success": true,
"message": "Quiz passed!",
"attempt": {
"id": "attempt_id",
"score": 8,
"percentage": 80,
"passed": true,
"pointsEarned": 80,
"completedAt": "2024-01-17T15:00:00Z"
},
"userPoints": 330
}GET /gamification/attempts/{quizId}
Headers: Authorization required
Response (200):
{
"success": true,
"attempts": [
{
"id": "attempt_id",
"score": 8,
"percentage": 80,
"passed": true,
"pointsEarned": 80,
"attemptNumber": 1,
"completedAt": "2024-01-17T15:00:00Z"
}
]
}GET /gamification/leaderboard
Response (200):
{
"success": true,
"leaderboard": [
{
"id": "user_id",
"name": "Alice Johnson",
"points": 1250,
"level": 13,
"badges": 5,
"profileImage": "https://example.com/alice.jpg"
},
{
"id": "user_id2",
"name": "Bob Smith",
"points": 1100,
"level": 12,
"badges": 4
}
]
}GET /gamification/rank
Headers: Authorization required
Response (200):
{
"success": true,
"rank": 42,
"totalStudents": 1500
}POST /admin/course
Headers: Authorization required (Admin only)
Request Body:
{
"title": "Advanced React",
"description": "Master React for production",
"category": "Web Development",
"level": "advanced"
}Response (201):
{
"success": true,
"message": "Course created",
"course": { ... }
}POST /admin/lesson
Headers: Authorization required (Admin only)
Request Body:
{
"courseId": "course_id",
"title": "Components and Props",
"description": "Learn about React components",
"content": "Lesson content here",
"contentType": "video",
"videoUrl": "https://example.com/video.mp4",
"duration": 45,
"order": 1
}Response (201):
{
"success": true,
"message": "Lesson created",
"lesson": { ... }
}POST /admin/quiz
Headers: Authorization required (Admin only)
Request Body:
{
"lessonId": "lesson_id",
"title": "Component Basics Quiz",
"description": "Test your understanding",
"questions": [
{
"question": "What is a React component?",
"type": "multiple_choice",
"options": ["Function", "Class", "Both", "Neither"],
"correctAnswer": "Both",
"explanation": "React components can be functions or classes",
"points": 10
}
],
"passingScore": 70,
"timeLimit": 30
}Response (201):
{
"success": true,
"message": "Quiz created",
"quiz": { ... }
}POST /admin/badge
Headers: Authorization required (Admin only)
Request Body:
{
"name": "Quiz Master",
"description": "Complete 50 quizzes",
"icon": "🏆",
"requirement": "quizzes",
"value": 50
}Response (201):
{
"success": true,
"message": "Badge created",
"badge": { ... }
}GET /admin/students
Headers: Authorization required (Admin only)
Response (200):
{
"success": true,
"students": [
{
"id": "student_id",
"name": "John Doe",
"email": "john@example.com",
"points": 250,
"level": 3,
"enrolledCourses": 5
}
]
}GET /admin/students/{studentId}/performance
Headers: Authorization required (Admin only)
Response (200):
{
"success": true,
"performance": {
"student": { ... },
"totalPoints": 250,
"currentLevel": 3,
"badges": 2,
"courses": 5
}
}GET /admin/dashboard/stats
Headers: Authorization required (Admin only)
Response (200):
{
"success": true,
"stats": {
"totalStudents": 1500,
"totalCourses": 45,
"totalLessons": 320,
"totalBadges": 25
}
}{
"success": false,
"message": "Invalid request data"
}{
"success": false,
"message": "No token provided" or "Invalid token"
}{
"success": false,
"message": "Admin access required"
}{
"success": false,
"message": "Resource not found"
}{
"success": false,
"message": "Server error"
}Currently, there is no rate limiting implemented. This can be added using express-rate-limit middleware for production environments.
For endpoints that return lists, implement pagination with query parameters:
page: Page number (default: 1)limit: Items per page (default: 10)
Example: GET /admin/students?page=2&limit=20
For list endpoints, support sorting with:
sortBy: Field to sort byorder: 'asc' or 'desc'
Example: GET /gamification/leaderboard?sortBy=points&order=desc
January 17, 2024