http://localhost:8000
- Authentication
- User Management
- Session Management
- Question Management
- Export Management
- Queue Status
- Analytics
- Notifications
- Bulk Operations
POST /api/v1/user/register
Body (JSON):
{
"fullname": "John Doe",
"email": "[email protected]",
"password": "password123"
}Response:
{
"success": true,
"message": "User registered successfully"
}POST /api/v1/user/login
Body (JSON):
{
"email": "[email protected]",
"password": "password123"
}Response:
{
"success": true,
"message": "Welcome back, John Doe",
"data": {
"user": {
"_id": "65f1234567890abcdef12345",
"fullname": "John Doe",
"email": "[email protected]",
"createdAt": "2024-03-15T10:30:00.000Z",
"updatedAt": "2024-03-15T10:30:00.000Z"
}
}
}Note: Cookie token is set automatically
POST /api/v1/user/logout
Headers:
Cookie: token=<your_jwt_token>
Response:
{
"success": true,
"message": "Logged out successfully"
}GET /api/v1/user/profile
Headers:
Cookie: token=<your_jwt_token>
Response:
{
"success": true,
"message": "User retrieved successfully",
"data": {
"user": {
"_id": "65f1234567890abcdef12345",
"fullname": "John Doe",
"email": "[email protected]",
"createdAt": "2024-03-15T10:30:00.000Z",
"updatedAt": "2024-03-15T10:30:00.000Z"
}
}
}PUT /api/v1/user/profile
Headers:
Cookie: token=<your_jwt_token>
Body (JSON):
{
"fullname": "John Updated Doe"
}Response:
{
"success": true,
"message": "Profile updated successfully",
"data": {
"user": {
"_id": "65f1234567890abcdef12345",
"fullname": "John Updated Doe",
"email": "[email protected]"
}
}
}POST /api/v1/session/create
Headers:
Cookie: token=<your_jwt_token>
Body (JSON):
{
"role": "Backend Developer",
"experience": "mid-level",
"topicsToFocus": ["Node.js", "MongoDB", "REST APIs", "Docker"]
}Valid Roles:
Backend DeveloperFrontend DeveloperFull Stack DeveloperDevOps EngineerData Scientistinterviewerintervieweemock-interviewpractice
Valid Experience Levels:
entry-leveljuniormid-levelseniorleadexpert
Response:
{
"success": true,
"message": "Session created successfully",
"data": {
"session": {
"_id": "65f9876543210fedcba98765",
"user": "65f1234567890abcdef12345",
"role": "Backend Developer",
"experience": "mid-level",
"topicsToFocus": ["Node.js", "MongoDB", "REST APIs", "Docker"],
"questions": [],
"status": "pending",
"duration": 60,
"createdAt": "2024-03-15T11:00:00.000Z",
"updatedAt": "2024-03-15T11:00:00.000Z"
}
}
}GET /api/v1/session
Headers:
Cookie: token=<your_jwt_token>
Response:
{
"success": true,
"message": "Sessions retrieved successfully",
"count": 2,
"data": {
"sessions": [
{
"_id": "65f9876543210fedcba98765",
"role": "Backend Developer",
"experience": "mid-level",
"topicsToFocus": ["Node.js", "MongoDB"],
"status": "completed",
"questions": [...],
"createdAt": "2024-03-15T11:00:00.000Z"
}
]
}
}GET /api/v1/session/:id
Headers:
Cookie: token=<your_jwt_token>
Example: /api/v1/session/65f9876543210fedcba98765
Response:
{
"success": true,
"message": "Session retrieved successfully",
"data": {
"session": {
"_id": "65f9876543210fedcba98765",
"user": "65f1234567890abcdef12345",
"role": "Backend Developer",
"experience": "mid-level",
"topicsToFocus": ["Node.js", "MongoDB", "REST APIs"],
"questions": [...],
"status": "in-progress",
"duration": 60
}
}
}PUT /api/v1/session/:id
Headers:
Cookie: token=<your_jwt_token>
Body (JSON):
{
"status": "completed",
"duration": 90
}Valid Status Values:
pendingin-progresscompletedcancelled
Response:
{
"success": true,
"message": "Session updated successfully",
"data": {
"session": {...}
}
}DELETE /api/v1/session/:id
Headers:
Cookie: token=<your_jwt_token>
Response:
{
"success": true,
"message": "Session deleted successfully"
}POST /api/v1/question/generate
Headers:
Cookie: token=<your_jwt_token>
Body (JSON):
{
"role": "Backend Developer",
"experience": "mid-level",
"topicsToFocus": ["Node.js", "Express.js", "MongoDB"],
"sessionId": "65f9876543210fedcba98765"
}Response:
{
"success": true,
"message": "Question generation queued. Check status using job ID",
"jobId": "12345",
"checkStatusUrl": "/api/v1/queue/question/12345",
"estimatedTime": "30-60 seconds"
}GET /api/v1/queue/question/:jobId
Headers:
Cookie: token=<your_jwt_token>
Example: /api/v1/queue/question/12345
Response (In Progress):
{
"success": true,
"status": "active",
"progress": 60,
"message": "Job is active"
}Response (Completed):
{
"success": true,
"status": "completed",
"message": "Questions generated successfully",
"data": {
"success": true,
"count": 5,
"questions": [...]
}
}GET /api/v1/question/session/:sessionId
Headers:
Cookie: token=<your_jwt_token>
Response:
{
"success": true,
"message": "Questions retrieved successfully",
"count": 5,
"data": {
"questions": [
{
"_id": "65fa111222333444555666",
"session": "65f9876543210fedcba98765",
"question": "What is Node.js and why is it used?",
"answer": "Node.js is a JavaScript runtime...",
"isPinned": false,
"difficulty": "medium",
"category": "",
"createdAt": "2024-03-15T11:30:00.000Z"
}
]
}
}GET /api/v1/question/:id
Headers:
Cookie: token=<your_jwt_token>
Response:
{
"success": true,
"message": "Question retrieved successfully",
"data": {
"question": {
"_id": "65fa111222333444555666",
"question": "What is Node.js?",
"answer": "Node.js is...",
"isPinned": false,
"difficulty": "medium"
}
}
}GET /api/v1/question/search?q=node&limit=20
Headers:
Cookie: token=<your_jwt_token>
Query Parameters:
q(required): Search termlimit(optional): Max results (default: 20, max: 100)
Response:
{
"success": true,
"message": "Search completed successfully",
"count": 3,
"data": {
"questions": [...],
"searchQuery": "node"
}
}GET /api/v1/question/session/:sessionId/pinned
Headers:
Cookie: token=<your_jwt_token>
Response:
{
"success": true,
"message": "Pinned questions retrieved successfully",
"count": 2,
"data": {
"questions": [...]
}
}GET /api/v1/question/session/:sessionId/stats
Headers:
Cookie: token=<your_jwt_token>
Response:
{
"success": true,
"message": "Statistics retrieved successfully",
"data": {
"stats": {
"total": 10,
"pinned": 3,
"unpinned": 7
},
"session": {
"role": "Backend Developer",
"experience": "mid-level",
"topics": ["Node.js", "MongoDB"]
}
}
}POST /api/v1/question/custom
Headers:
Cookie: token=<your_jwt_token>
Body (JSON):
{
"sessionId": "65f9876543210fedcba98765",
"question": "What is the difference between SQL and NoSQL?",
"answer": "SQL databases are relational..."
}Response:
{
"success": true,
"message": "Custom question added successfully",
"data": {
"question": {...}
}
}PUT /api/v1/question/:id
Headers:
Cookie: token=<your_jwt_token>
Body (JSON):
{
"question": "Updated question text",
"answer": "Updated answer text"
}Response:
{
"success": true,
"message": "Question updated successfully",
"data": {
"question": {...}
}
}PATCH /api/v1/question/:id/toggle-pin
Headers:
Cookie: token=<your_jwt_token>
Response:
{
"success": true,
"message": "Question pinned successfully",
"data": {
"isPinned": true,
"question": {...}
}
}POST /api/v1/question/:id/regenerate
Headers:
Cookie: token=<your_jwt_token>
Response:
{
"success": true,
"message": "Question regenerated successfully",
"data": {
"question": {...}
}
}DELETE /api/v1/question/:id
Headers:
Cookie: token=<your_jwt_token>
Response:
{
"success": true,
"message": "Question deleted successfully",
"data": {
"deletedId": "65fa111222333444555666"
}
}POST /api/v1/export/export/:sessionId?format=pdf
Headers:
Cookie: token=<your_jwt_token>
Query Parameters:
format(required):pdf,csv, ordocx
Example: /api/v1/export/export/65f9876543210fedcba98765?format=pdf
Response:
{
"success": true,
"message": "Export queued successfully",
"jobId": "67890",
"checkStatusUrl": "/api/v1/export/status/67890"
}GET /api/v1/export/status/:jobId
Headers:
Cookie: token=<your_jwt_token>
Response (Completed):
{
"success": true,
"status": "completed",
"downloadUrl": "/api/v1/export/download/questions_65f9876543210fedcba98765_1710504000000.pdf"
}GET /api/v1/export/download/:filename
Headers:
Cookie: token=<your_jwt_token>
Response: File download
GET /api/v1/analytics/user
Headers:
Cookie: token=<your_jwt_token>
Response:
{
"success": true,
"message": "User analytics retrieved successfully",
"data": {
"totalSessions": 15,
"totalQuestions": 75,
"pinnedQuestions": 12,
"averageQuestionsPerSession": 5,
"recentSessions": [...]
}
}GET /api/v1/analytics/session/:sessionId
Headers:
Cookie: token=<your_jwt_token>
Response:
{
"success": true,
"message": "Session analytics retrieved successfully",
"data": {
"sessionId": "65f9876543210fedcba98765",
"totalQuestions": 10,
"pinnedQuestions": 3,
"difficultyBreakdown": {
"easy": 2,
"medium": 6,
"hard": 2
},
"avgAnswerLength": 450,
"topics": ["Node.js", "MongoDB"],
"role": "Backend Developer",
"experience": "mid-level"
}
}GET /api/v1/analytics/trending?limit=10
Query Parameters:
limit(optional): Number of topics (default: 10)
Response:
{
"success": true,
"message": "Trending topics retrieved successfully",
"count": 10,
"data": {
"topics": [
{ "topic": "node.js", "count": 45 },
{ "topic": "react", "count": 38 },
{ "topic": "mongodb", "count": 32 }
]
}
}GET /api/v1/notifications?limit=20
Headers:
Cookie: token=<your_jwt_token>
Response:
{
"success": true,
"message": "Notifications retrieved successfully",
"count": 5,
"data": {
"notifications": [
{
"id": "notif_1710504000000_abc123",
"type": "job_complete",
"jobType": "question-generation",
"jobId": "12345",
"message": "Your question-generation job has completed successfully",
"timestamp": 1710504000000
}
]
}
}POST /api/v1/notifications/read
Headers:
Cookie: token=<your_jwt_token>
Body (JSON):
{
"notificationIds": ["notif_1710504000000_abc123", "notif_1710504100000_def456"]
}Response:
{
"success": true,
"message": "Notifications marked as read"
}DELETE /api/v1/notifications/clear
Headers:
Cookie: token=<your_jwt_token>
Response:
{
"success": true,
"message": "All notifications cleared"
}POST /api/v1/bulk/delete
Headers:
Cookie: token=<your_jwt_token>
Body (JSON):
{
"questionIds": [
"65fa111222333444555666",
"65fa111222333444555667",
"65fa111222333444555668"
]
}Response:
{
"success": true,
"message": "Successfully deleted 3 questions",
"deletedCount": 3
}POST /api/v1/bulk/difficulty
Headers:
Cookie: token=<your_jwt_token>
Body (JSON):
{
"questionIds": [
"65fa111222333444555666",
"65fa111222333444555667"
],
"difficulty": "hard"
}Valid Difficulty Values:
easymediumhard
Response:
{
"success": true,
"message": "Successfully updated 2 questions",
"modifiedCount": 2
}POST /api/v1/bulk/toggle-pin
Headers:
Cookie: token=<your_jwt_token>
Body (JSON):
{
"questionIds": [
"65fa111222333444555666",
"65fa111222333444555667"
],
"isPinned": true
}Response:
{
"success": true,
"message": "Successfully pinned 2 questions",
"modifiedCount": 2
}GET /health
Response:
{
"success": true,
"status": "OK",
"uptime": 3600,
"timestamp": "2024-03-15T12:00:00.000Z",
"environment": "production",
"database": {
"status": "connected",
"connected": true
}
}- Authentication: Most endpoints require authentication via JWT token in cookies
- Rate Limiting:
- General API: 100 requests per 15 minutes
- AI Generation: 20 requests per hour
- Auth endpoints: 10 requests per 15 minutes
- Async Operations: Question generation and exports are async - use job IDs to check status
- Caching: AI-generated questions are cached for 1 hour based on role, experience, and topics
- File Cleanup: Export files are automatically deleted after download
Make sure your .env file is configured:
PORT=8000
NODE_ENV=production
MONGO_URI=mongodb://admin:password@mongodb:27017/intervai_db?authSource=admin
JWT_SECRET=your-secret-key
GROQ_API_KEY=your-groq-api-key
REDIS_HOST=redis
REDIS_PORT=6379
REDIS_PASSWORD=redis123
CLIENT_URL=http://localhost:3000# Start all services
docker-compose up -d
# View logs
docker-compose logs -f
# Stop all services
docker-compose down
# Rebuild and start
docker-compose up -d --build- API Documentation:
http://localhost:8000/ - Health Check:
http://localhost:8000/health - MongoDB:
mongodb://localhost:27017 - Redis:
localhost:6379