{"openapi":"3.0.0","info":{"title":"Unnati Backend API","version":"1.0.0","description":"API Documentation for Unnati Backend","contact":{"name":"Unnati Team","email":"support@unnati.com"}},"servers":[{"url":"https://dev-backend.unnatilife.com","description":"API server"},{"url":"http://0.0.0.0:8083","description":"Local (0.0.0.0)"},{"url":"http://localhost:8083","description":"Local (localhost)"}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT"},"apiKeyAuth":{"type":"apiKey","in":"header","name":"x-api-key"}},"schemas":{"Education":{"type":"object","properties":{"id":{"type":"number","description":"Education ID"},"name":{"type":"string","description":"Education name/degree"},"category":{"type":"string","nullable":true,"description":"Optional category string provided by web admin"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}},"FCMToken":{"type":"object","properties":{"id":{"type":"number","description":"FCM token ID"},"token":{"type":"string","description":"Firebase Cloud Messaging token"},"mobileUserId":{"type":"number","description":"Mobile user ID"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}},"CreateFCMTokenRequest":{"type":"object","required":["token"],"properties":{"token":{"type":"string","description":"Firebase Cloud Messaging token","example":"eB4VbkbPYEByha32DcEUmr:APA91bHz0rs7NzjQw0RGTTnb6Is64CY2zHgVhze8d_kpnPqJZt1CHq4iEA4sq6oxhxRye3j08Emqy6pmfzvGlCjTzA7ycxVbBu_pdp6x75qFujb4_A_jRDA"}}},"Institution":{"type":"object","properties":{"id":{"type":"number","description":"Institution ID"},"name":{"type":"string","description":"Institution name"},"city":{"type":"string","nullable":true,"description":"Optional city name"},"state":{"type":"string","nullable":true,"description":"Optional state name"},"country":{"type":"string","nullable":true,"description":"Optional country name"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}},"Job":{"type":"object","properties":{"id":{"type":"number","description":"Job ID"},"title":{"type":"string","description":"Job title"},"description":{"type":"string","description":"Job description"},"location":{"type":"string","description":"Job location"},"salary":{"type":"number","description":"Job salary"},"company":{"type":"object","properties":{"id":{"type":"number"},"name":{"type":"string"}}},"department":{"type":"object","properties":{"id":{"type":"number"},"name":{"type":"string"}}},"ageLimit":{"type":"number","description":"Maximum age limit for applicants"},"posterImageUrl":{"type":"string","description":"URL of the job poster image"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}},"JobApplication":{"type":"object","properties":{"id":{"type":"number","description":"Application ID"},"job":{"$ref":"#/components/schemas/Job"},"status":{"type":"string","enum":["PENDING","REVIEWED","ACCEPTED","REJECTED"]},"appliedAt":{"type":"string","format":"date-time"},"chatConversationId":{"type":"string","description":"Chat conversation ID for communication"},"mobileUser":{"$ref":"#/components/schemas/MobileUser"}}},"ApplyForJobRequest":{"type":"object","required":["jobId"],"properties":{"jobId":{"type":"number","description":"ID of the job to apply for","example":1},"coverLetter":{"type":"string","description":"Cover letter for the job application","example":"I am very interested in this position..."}}},"JobApplicationActivity":{"type":"object","properties":{"id":{"type":"number"},"jobApplication":{"$ref":"#/components/schemas/JobApplication"},"status":{"type":"string","enum":["PENDING","REVIEWED","ACCEPTED","REJECTED"]},"message":{"type":"string"},"createdAt":{"type":"string","format":"date-time"}}},"UpdateChatConversationRequest":{"type":"object","required":["jobApplicationId","chatConversationId"],"properties":{"jobApplicationId":{"type":"number","description":"ID of the job application","example":1},"chatConversationId":{"type":"string","description":"Chat conversation ID","example":"chat_123456789"}}},"MobileUser":{"type":"object","properties":{"id":{"type":"number","description":"User ID"},"firebaseId":{"type":"string","description":"Firebase user ID"},"personalInfo":{"type":"object","properties":{"firstName":{"type":"string"},"lastName":{"type":"string"},"email":{"type":"string"},"phone":{"type":"string"},"dateOfBirth":{"type":"string","format":"date"},"gender":{"type":"string","enum":["MALE","FEMALE","OTHER"]}}},"address":{"type":"object","properties":{"line1":{"type":"string"},"city":{"type":"string"},"state":{"type":"string"},"pincode":{"type":"string"}}},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}},"CreateMobileUserRequest":{"type":"object","required":["personalInfo"],"properties":{"aadharFrontImageKey":{"type":"string","nullable":true,"example":"mobile-users/aadhar/1711111111-uuid-front.png"},"aadharBackImageKey":{"type":"string","nullable":true,"example":"mobile-users/aadhar/1711111111-uuid-back.png"},"cvPdfKey":{"type":"string","nullable":true,"example":"mobile-users/cv/1711111111-uuid-cv.pdf"},"personalInfo":{"type":"object","required":["firstName","lastName","email","dateOfBirth","gender"],"properties":{"firstName":{"type":"string","example":"John"},"lastName":{"type":"string","example":"Doe"},"email":{"type":"string","example":"john.doe@example.com"},"phone":{"type":"string","example":"+919876543210"},"dateOfBirth":{"type":"string","format":"date","example":"1990-01-01"},"gender":{"type":"string","enum":["MALE","FEMALE","OTHER"],"example":"MALE"},"profileImageKey":{"type":"string","nullable":true,"example":"mobile-users/profile/1711111111-uuid-profile.jpg"},"aadharNumber":{"type":"string","example":"123456789012"}}},"address":{"type":"object","properties":{"line1":{"type":"string","example":"123 Main Street"},"line2":{"type":"string","example":"Apt 4B"},"city":{"type":"string","example":"Mumbai"},"district":{"type":"string","example":"Mumbai"},"state":{"type":"string","example":"Maharashtra"},"country":{"type":"string","example":"India"},"pincode":{"type":"string","example":"400001"},"fullAddress":{"type":"string","example":"123 Main Street, Apt 4B, Mumbai, Maharashtra, India - 400001"}}}}},"UpdateMobileUserRequest":{"type":"object","properties":{"personalInfo":{"type":"object","properties":{"firstName":{"type":"string"},"lastName":{"type":"string"},"email":{"type":"string"},"phone":{"type":"string"},"dateOfBirth":{"type":"string","format":"date"},"gender":{"type":"string","enum":["MALE","FEMALE","OTHER"]},"profileImageKey":{"type":"string"},"aadharNumber":{"type":"string"}}},"address":{"type":"object","properties":{"line1":{"type":"string"},"line2":{"type":"string"},"city":{"type":"string"},"district":{"type":"string"},"state":{"type":"string"},"country":{"type":"string"},"pincode":{"type":"string"},"fullAddress":{"type":"string"}}}}},"ApiResponse":{"type":"object","properties":{"success":{"type":"boolean"},"message":{"type":"string"},"data":{"type":"object"},"timestamp":{"type":"string","format":"date-time"}}},"UserExistenceResponse":{"type":"object","properties":{"existsInFirebase":{"type":"boolean"},"existsInDatabase":{"type":"boolean"},"isNewUser":{"type":"boolean"},"message":{"type":"string"},"guidanceMessage":{"type":"string","description":"Clear guidance on what the user should do next"}}},"Notification":{"type":"object","properties":{"id":{"type":"number","description":"Notification ID"},"title":{"type":"string","description":"Notification title"},"message":{"type":"string","description":"Notification message"},"type":{"type":"string","enum":["JOB_APPLICATION","JOB_STATUS_UPDATE","GENERAL"],"description":"Notification type"},"isRead":{"type":"boolean","description":"Whether notification is read"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}},"NotificationCount":{"type":"object","properties":{"count":{"type":"number","description":"Number of unread notifications"}}},"CreateNotificationRequest":{"type":"object","required":["title","message","type","platform"],"properties":{"title":{"type":"string","example":"Job Application Update"},"message":{"type":"string","example":"Your job application has been reviewed"},"type":{"type":"string","enum":["JOB_APPLICATION","JOB_STATUS_UPDATE","GENERAL"],"example":"JOB_STATUS_UPDATE"},"platform":{"type":"string","enum":["MOBILE","WEB","BOTH"],"example":"MOBILE"},"userId":{"type":"number","example":1}}},"UpdateNotificationStatusRequest":{"type":"object","required":["status"],"properties":{"status":{"type":"string","enum":["READ","UNREAD"],"example":"READ"}}},"TwilioMessage":{"type":"object","required":["phone","body"],"properties":{"phone":{"type":"string","description":"Phone number in E.164 format","example":"+919876543210"},"body":{"type":"string","description":"Message content","example":"Hello! This is a test message."},"image":{"type":"string","description":"Optional image URL","example":"https://example.com/image.jpg"}}},"TwilioMessageBatchRequest":{"type":"object","required":["messages"],"properties":{"messages":{"type":"array","items":{"$ref":"#/components/schemas/TwilioMessage"},"minItems":1,"description":"Array of messages to send"}}},"TwilioMessageResult":{"type":"object","properties":{"phone":{"type":"string"},"status":{"type":"string","enum":["sent","failed"]},"messageId":{"type":"string"},"error":{"type":"string"}}},"TwilioBatchResponse":{"type":"object","properties":{"success":{"type":"boolean"},"totalMessages":{"type":"number"},"sentMessages":{"type":"number"},"failedMessages":{"type":"number"},"results":{"type":"array","items":{"$ref":"#/components/schemas/TwilioMessageResult"}}}},"CreateJobRequest":{"type":"object","required":["title","description","location","salary","departmentId","subCompanyId"],"properties":{"title":{"type":"string","example":"Software Engineer"},"description":{"type":"string","example":"We are looking for a skilled software engineer..."},"location":{"type":"string","example":"Mumbai, Maharashtra"},"salary":{"type":"number","example":500000},"departmentId":{"type":"number","example":1},"subCompanyId":{"type":"number","example":1},"month":{"type":"number","example":12},"ageLimit":{"type":"number","example":35,"description":"Maximum age limit for applicants"},"posterImageUrl":{"type":"string","example":"https://example.com/poster.jpg","description":"URL of the job poster image"}}},"UpdateJobRequest":{"type":"object","properties":{"title":{"type":"string"},"description":{"type":"string"},"location":{"type":"string"},"salary":{"type":"number"},"departmentId":{"type":"number"},"subCompanyId":{"type":"number"},"month":{"type":"number"},"ageLimit":{"type":"number","description":"Maximum age limit for applicants"},"posterImageUrl":{"type":"string","description":"URL of the job poster image"}}},"UpdateJobApplicationStatusRequest":{"type":"object","required":["status"],"properties":{"status":{"type":"string","enum":["PENDING","REVIEWED","ACCEPTED","REJECTED"],"example":"REVIEWED"},"message":{"type":"string","example":"Application is under review"}}},"WebUser":{"type":"object","properties":{"id":{"type":"number","description":"Web user ID"},"firebaseId":{"type":"string","description":"Firebase user ID"},"email":{"type":"string","format":"email","description":"User email address"},"firstName":{"type":"string","description":"User first name"},"lastName":{"type":"string","description":"User last name"},"phone":{"type":"string","description":"User phone number"},"userType":{"type":"string","enum":["ADMIN","HR","MANAGER"],"description":"User role type"},"businessUnitId":{"type":"number","description":"Associated business unit ID"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}},"CreateWebUserRequest":{"type":"object","required":["email","firstName","lastName","phone","userType"],"properties":{"email":{"type":"string","format":"email","example":"admin@company.com"},"firstName":{"type":"string","example":"John"},"lastName":{"type":"string","example":"Doe"},"phone":{"type":"string","example":"+919876543210"},"userType":{"type":"string","enum":["ADMIN","HR","MANAGER"],"example":"ADMIN"},"businessUnitId":{"type":"number","example":1}}},"UpdateWebUserRequest":{"type":"object","properties":{"email":{"type":"string","format":"email"},"firstName":{"type":"string"},"lastName":{"type":"string"},"phone":{"type":"string"},"userType":{"type":"string","enum":["ADMIN","HR","MANAGER"]},"businessUnitId":{"type":"number"}}},"CheckUserExistsRequest":{"type":"object","required":["email"],"properties":{"email":{"type":"string","format":"email","example":"user@example.com"}}},"UserExistsResponse":{"type":"object","properties":{"userExists":{"type":"boolean","description":"Whether the user exists in the system"}}}}},"security":[{"bearerAuth":[]},{"apiKeyAuth":[]}],"paths":{"/api/v1/educations":{"get":{"summary":"Get all education types","description":"Retrieve all available education types/degrees","tags":["Education"],"responses":{"200":{"description":"Education types retrieved successfully","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/ApiResponse"},{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Education"}}}}]}}}},"500":{"description":"Internal server error"}}},"post":{"summary":"Create a new education type","description":"Create a new education type/degree","tags":["Education"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["name"],"properties":{"name":{"type":"string","description":"Education name/degree","example":"Bachelor's Degree"},"category":{"type":"string","description":"Optional category string"}}}}}},"responses":{"201":{"description":"Education created successfully","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/ApiResponse"},{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Education"}}}]}}}},"400":{"description":"Bad request"},"500":{"description":"Internal server error"}}}},"/api/v1/educations/{id}":{"put":{"summary":"Update an education type","description":"Update an existing education type/degree","tags":["Education"],"parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"number"},"description":"Education ID"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","description":"Education name/degree","example":"Master's Degree"},"category":{"type":"string","description":"Optional category string"}}}}}},"responses":{"200":{"description":"Education updated successfully","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/ApiResponse"},{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Education"}}}]}}}},"400":{"description":"Bad request"},"404":{"description":"Education not found"},"500":{"description":"Internal server error"}}},"delete":{"summary":"Delete an education type","description":"Soft delete an education type/degree","tags":["Education"],"parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"number"},"description":"Education ID"}],"responses":{"200":{"description":"Education deleted successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"404":{"description":"Education not found"},"500":{"description":"Internal server error"}}}},"/api/v1/fcm":{"post":{"summary":"Create FCM token","description":"Register a new Firebase Cloud Messaging token for push notifications","tags":["FCM Tokens"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateFCMTokenRequest"},"example":{"token":"eB4VbkbPYEByha32DcEUmr:APA91bHz0rs7NzjQw0RGTTnb6Is64CY2zHgVhze8d_kpnPqJZt1CHq4iEA4sq6oxhxRye3j08Emqy6pmfzvGlCjTzA7ycxVbBu_pdp6x75qFujb4_A_jRDA"}}}},"responses":{"201":{"description":"FCM token created successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Bad request - Invalid or missing token"},"401":{"description":"Unauthorized - Invalid or missing authentication"},"500":{"description":"Internal server error"}}},"delete":{"summary":"Delete FCM token","description":"Delete the Firebase Cloud Messaging token for the authenticated user","tags":["FCM Tokens"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"FCM token deleted successfully"},"401":{"description":"Unauthorized - Invalid or missing authentication"},"500":{"description":"Internal server error"}}}},"/api/v1/fcm/web":{"post":{"summary":"Create FCM token (Web)","description":"Register FCM token for web push notifications. Use WebUser auth.","tags":["FCM Tokens"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateFCMTokenRequest"},"example":{"token":"eB4VbkbPYEByha32DcEUmr:APA91bHz0rs7NzjQw0RGTTnb6Is64CY2zHgVhze8d_kpnPqJZt1CHq4iEA4sq6oxhxRye3j08Emqy6pmfzvGlCjTzA7ycxVbBu_pdp6x75qFujb4_A_jRDA"}}}},"responses":{"201":{"description":"FCM token created successfully"},"400":{"description":"Bad request - Invalid or missing token"},"401":{"description":"Unauthorized - Invalid or missing authentication"},"500":{"description":"Internal server error"}}}},"/api/v1/institutions":{"get":{"summary":"Get all institutions","description":"Retrieve all available institutions","tags":["Institution"],"responses":{"200":{"description":"Institutions retrieved successfully","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/ApiResponse"},{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Institution"}}}}]}}}},"500":{"description":"Internal server error"}}},"post":{"summary":"Create a new institution","description":"Create a new institution","tags":["Institution"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["name"],"properties":{"name":{"type":"string","description":"Institution name","example":"Delhi University"},"city":{"type":"string","nullable":true,"description":"Optional city name"},"state":{"type":"string","nullable":true,"description":"Optional state name"},"country":{"type":"string","nullable":true,"description":"Optional country name"}}}}}},"responses":{"201":{"description":"Institution created successfully","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/ApiResponse"},{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Institution"}}}]}}}},"400":{"description":"Bad request"},"500":{"description":"Internal server error"}}}},"/api/v1/institutions/{id}":{"put":{"summary":"Update an institution","description":"Update an existing institution","tags":["Institution"],"parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"number"},"description":"Institution ID"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","description":"Institution name","example":"Delhi University"},"city":{"type":"string","nullable":true,"description":"Optional city name"},"state":{"type":"string","nullable":true,"description":"Optional state name"},"country":{"type":"string","nullable":true,"description":"Optional country name"}}}}}},"responses":{"200":{"description":"Institution updated successfully","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/ApiResponse"},{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Institution"}}}]}}}},"400":{"description":"Bad request"},"404":{"description":"Institution not found"},"500":{"description":"Internal server error"}}},"delete":{"summary":"Delete an institution","description":"Soft delete an institution","tags":["Institution"],"parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"number"},"description":"Institution ID"}],"responses":{"200":{"description":"Institution deleted successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"404":{"description":"Institution not found"},"500":{"description":"Internal server error"}}}},"/api/v1/mobile/jobs":{"get":{"summary":"Get available jobs with search and filters","description":"Retrieves available jobs for the authenticated mobile user with optional search and filter parameters","tags":["Jobs"],"security":[{"bearerAuth":[]}],"parameters":[{"in":"query","name":"search","schema":{"type":"string"},"description":"Search term to filter jobs by title, description, responsibilities, skills, company name"},{"in":"query","name":"experienceLevels","schema":{"type":"string"},"description":"Filter by experience levels (comma-separated: fresher,1-2,3-5,5+)"},{"in":"query","name":"locationIds","schema":{"type":"string"},"description":"Filter by location IDs (comma-separated integers)"},{"in":"query","name":"departmentIds","schema":{"type":"string"},"description":"Filter by department IDs (comma-separated integers)"},{"in":"query","name":"jobStatuses","schema":{"type":"string"},"description":"Filter by job statuses (comma-separated: true,false)"},{"in":"query","name":"deadlineStatuses","schema":{"type":"string"},"description":"Filter by deadline statuses (comma-separated: upcoming,expired)"},{"in":"query","name":"canApplyFilter","schema":{"type":"string","enum":["can_apply","all","cannot_apply"]},"description":"Filter by eligibility - can_apply (user education matches job), all (no filter), cannot_apply (user education does not match)"}],"responses":{"200":{"description":"Jobs retrieved successfully","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/ApiResponse"},{"type":"object","properties":{"data":{"type":"array","items":{"allOf":[{"$ref":"#/components/schemas/Job"},{"type":"object","properties":{"can_apply":{"type":"boolean","description":"Whether user's education matches job's required education"},"posterImageUrl":{"type":"string","description":"Resolved URL for job poster image"}}}]}}}}]}}}},"401":{"description":"Unauthorized - Invalid or missing authentication"},"500":{"description":"Internal server error"}}}},"/api/v1/mobile/jobs/apply":{"post":{"summary":"Apply for a job","description":"Allows the authenticated mobile user to apply for a specific job","tags":["Jobs"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApplyForJobRequest"}}}},"responses":{"201":{"description":"Job application submitted successfully","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/ApiResponse"},{"type":"object","properties":{"data":{"$ref":"#/components/schemas/JobApplication"}}}]}}}},"400":{"description":"Bad request - Invalid input data"},"401":{"description":"Unauthorized - Invalid or missing authentication"},"500":{"description":"Internal server error"}}}},"/api/v1/mobile/jobs/my-applications":{"get":{"summary":"Get my job applications","description":"Retrieve all job applications submitted by the authenticated mobile user","tags":["Jobs"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Job applications retrieved successfully","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/ApiResponse"},{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/JobApplication"}}}}]}}}},"401":{"description":"Unauthorized - Invalid or missing authentication"},"500":{"description":"Internal server error"}}}},"/api/v1/mobile/jobs/chat-conversation-id":{"put":{"summary":"Update chat conversation ID","description":"Update the chat conversation ID for a job application","tags":["Jobs"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateChatConversationRequest"}}}},"responses":{"200":{"description":"Chat conversation ID updated successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Bad request - Invalid input data"},"401":{"description":"Unauthorized - Invalid or missing authentication"},"500":{"description":"Internal server error"}}}},"/api/v1/mobile/jobs/activities":{"get":{"summary":"Get job application activities","description":"Retrieve activities for a specific job application","tags":["Jobs"],"security":[{"bearerAuth":[]}],"parameters":[{"in":"query","name":"jobId","required":true,"schema":{"type":"integer"},"description":"Job ID to get activities for","example":1}],"responses":{"200":{"description":"Job application activities retrieved successfully","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/ApiResponse"},{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/JobApplicationActivity"}}}}]}}}},"400":{"description":"Bad request - Missing jobId parameter"},"401":{"description":"Unauthorized - Invalid or missing authentication"},"500":{"description":"Internal server error"}}}},"/api/v1/mobile/jobs/applications/{id}/withdraw":{"post":{"summary":"Withdraw a job application","description":"Allows the authenticated mobile user to withdraw their job application","tags":["Jobs"],"security":[{"bearerAuth":[]}],"parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"integer"},"description":"Job application ID","example":1}],"responses":{"200":{"description":"Job application withdrawn successfully","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/ApiResponse"},{"type":"object","properties":{"data":{"$ref":"#/components/schemas/JobApplication"}}}]}}}},"400":{"description":"Bad request - Cannot withdraw application in current status"},"401":{"description":"Unauthorized - Invalid or missing authentication"},"404":{"description":"Job application not found or no permission"},"500":{"description":"Internal server error"}}}},"/api/v1/mobile/jobs/applications/{id}/meeting-response":{"post":{"summary":"Respond to meeting request (accept or decline)","description":"Seeker accepts or declines a meeting request. Updates JobApplication status and creates activity.","tags":["Jobs"],"security":[{"bearerAuth":[]}],"parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"integer"},"description":"Job application ID"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["accept"],"properties":{"accept":{"type":"boolean","description":"true to accept, false to decline"}}}}}},"responses":{"200":{"description":"Meeting response recorded successfully"},"400":{"description":"Bad request - Invalid application or status"},"401":{"description":"Unauthorized"},"500":{"description":"Internal server error"}}}},"/api/v1/mobile/jobs/applications/{id}/offer-response":{"post":{"summary":"Respond to offer request (accept or reject)","description":"Seeker accepts or rejects an offer. Updates JobApplication status and creates activity.","tags":["Jobs"],"security":[{"bearerAuth":[]}],"parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"integer"},"description":"Job application ID"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["accept"],"properties":{"accept":{"type":"boolean","description":"true to accept, false to reject"}}}}}},"responses":{"200":{"description":"Offer response recorded successfully"},"400":{"description":"Bad request - Invalid application or status"},"401":{"description":"Unauthorized"},"500":{"description":"Internal server error"}}}},"/api/v1/mobile/users":{"post":{"summary":"Create a new mobile user","description":"Creates a new mobile user with personal information and address","tags":["Mobile Users"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateMobileUserRequest"}}}},"responses":{"200":{"description":"User created successfully","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/ApiResponse"},{"type":"object","properties":{"data":{"$ref":"#/components/schemas/MobileUser"}}}]}}}},"400":{"description":"Bad request - Invalid input data"},"401":{"description":"Unauthorized - Invalid or missing authentication"},"500":{"description":"Internal server error"}}},"put":{"summary":"Update mobile user profile","description":"Updates the current mobile user's profile information","tags":["Mobile Users"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateMobileUserRequest"}}}},"responses":{"200":{"description":"User updated successfully","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/ApiResponse"},{"type":"object","properties":{"data":{"$ref":"#/components/schemas/MobileUser"}}}]}}}},"400":{"description":"Bad request - Invalid input data"},"401":{"description":"Unauthorized - Invalid or missing authentication"},"500":{"description":"Internal server error"}}},"delete":{"summary":"Delete mobile user account","description":"Delete the authenticated mobile user's account and all associated data","tags":["Mobile Users"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"User account deleted successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Unauthorized - Invalid or missing authentication"},"500":{"description":"Internal server error"}}}},"/api/v1/mobile/users/check-email":{"get":{"summary":"Check if user exists","description":"Checks if a user exists in the system by email","tags":["Mobile Users"],"parameters":[{"in":"query","name":"email","schema":{"type":"string","format":"email"},"description":"User email address","example":"john.doe@example.com"}],"responses":{"200":{"description":"User existence check completed","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/ApiResponse"},{"type":"object","properties":{"data":{"$ref":"#/components/schemas/UserExistenceResponse"}}}]}}}},"400":{"description":"Bad request - Missing required parameters"},"500":{"description":"Internal server error"}}}},"/api/v1/mobile/users/validate-aadhar":{"post":{"summary":"Validate Aadhar card number","description":"Check if Aadhar card number is available for registration","tags":["Mobile Users"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["email","password","aadharNumber"],"properties":{"email":{"type":"string","format":"email","example":"new.user@example.com"},"password":{"type":"string","format":"password","example":"StrongPassword123"},"aadharNumber":{"type":"number","description":"Aadhar card number to validate","example":123456789012}}}}}},"responses":{"200":{"description":"Validation result","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"data":{"type":"object","properties":{"isValid":{"type":"boolean"},"message":{"type":"string"},"existingEmail":{"type":"string"},"maskedEmail":{"type":"string"},"firebaseUid":{"type":"string"},"isUserCreatedInDb":{"type":"boolean"}}},"message":{"type":"string"}}}}}},"400":{"description":"Bad request - Invalid input"},"500":{"description":"Internal server error"}}}},"/api/v1/mobile/users/sign-in":{"post":{"summary":"Sign in and get ID token","description":"Exchange email and password for a Firebase ID token. Use the returned idToken in Authorization Bearer header to call other protected APIs. Useful for testing.","tags":["Mobile Users"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["email","password"],"properties":{"email":{"type":"string","format":"email","example":"user@example.com"},"password":{"type":"string","format":"password","example":"YourPassword123"}}}}}},"responses":{"200":{"description":"Sign-in successful","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"data":{"type":"object","properties":{"idToken":{"type":"string","description":"Use in Authorization Bearer header for protected APIs"},"refreshToken":{"type":"string"},"expiresIn":{"type":"string"},"localId":{"type":"string","description":"Firebase UID"},"email":{"type":"string"}}},"message":{"type":"string"}}}}}},"400":{"description":"Invalid email or password"},"500":{"description":"Internal server error"}}}},"/api/v1/mobile/notifications":{"get":{"summary":"Get user notifications","description":"Retrieve paginated notifications for the authenticated mobile user","tags":["Mobile Notifications"],"security":[{"bearerAuth":[]}],"parameters":[{"in":"query","name":"page","schema":{"type":"integer","minimum":0,"default":0},"description":"Page number for pagination","example":0},{"in":"query","name":"limit","schema":{"type":"integer","minimum":1,"maximum":100,"default":10},"description":"Number of notifications per page","example":10}],"responses":{"200":{"description":"Notifications retrieved successfully","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/ApiResponse"},{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Notification"}}}}]}}}},"401":{"description":"Unauthorized - Invalid or missing authentication"},"500":{"description":"Internal server error"}}}},"/api/v1/mobile/notifications/unread-count":{"get":{"summary":"Get unread notifications count","description":"Get the count of unread notifications for the authenticated mobile user","tags":["Mobile Notifications"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Unread notifications count retrieved successfully","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/ApiResponse"},{"type":"object","properties":{"data":{"$ref":"#/components/schemas/NotificationCount"}}}]}}}},"401":{"description":"Unauthorized - Invalid or missing authentication"},"500":{"description":"Internal server error"}}}},"/api/v1/notifications":{"post":{"summary":"Create notification","description":"Create a new notification for users","tags":["Notifications"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateNotificationRequest"}}}},"responses":{"201":{"description":"Notification created successfully","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/ApiResponse"},{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Notification"}}}]}}}},"400":{"description":"Bad request - Invalid input data"},"401":{"description":"Unauthorized - Invalid or missing authentication"},"500":{"description":"Internal server error"}}}},"/api/v1/twilio/whatsapp/batch":{"post":{"summary":"Send batch WhatsApp messages","description":"Send multiple WhatsApp messages via Twilio with rate limiting and error handling","tags":["Twilio Messaging"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TwilioMessageBatchRequest"}}}},"responses":{"200":{"description":"Messages processed successfully","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/ApiResponse"},{"type":"object","properties":{"data":{"$ref":"#/components/schemas/TwilioBatchResponse"}}}]}}}},"400":{"description":"Bad request - Invalid message format or phone numbers"},"401":{"description":"Unauthorized - Invalid or missing authentication"},"500":{"description":"Internal server error"}}}},"/api/v1/twilio/sms/batch":{"post":{"summary":"Send batch SMS messages","description":"Send multiple SMS messages via Twilio with rate limiting and error handling","tags":["Twilio Messaging"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TwilioMessageBatchRequest"}}}},"responses":{"200":{"description":"Messages processed successfully","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/ApiResponse"},{"type":"object","properties":{"data":{"$ref":"#/components/schemas/TwilioBatchResponse"}}}]}}}},"400":{"description":"Bad request - Invalid message format or phone numbers"},"401":{"description":"Unauthorized - Invalid or missing authentication"},"500":{"description":"Internal server error"}}}},"/api/v1/mobile/uploads/presign":{"post":{"summary":"Generate presigned upload URL (mobile)","description":"Returns a presigned S3 upload URL and storage key for direct client upload.","tags":["Uploads"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["folder","fileName","contentType"],"properties":{"folder":{"type":"string","enum":["mobile-users/aadhar","mobile-users/cv","mobile-users/profile","jobs/posters","web-users/avatars"]},"fileName":{"type":"string","example":"aadhar-front.png"},"contentType":{"type":"string","example":"image/png"}}}}}},"responses":{"200":{"description":"Upload URL generated"},"400":{"description":"Invalid input"}}}},"/api/v1/web/uploads/presign":{"post":{"summary":"Generate presigned upload URL (web)","description":"Returns a presigned S3 upload URL and storage key for direct client upload.","tags":["Uploads"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["folder","fileName","contentType"],"properties":{"folder":{"type":"string","enum":["mobile-users/aadhar","mobile-users/cv","mobile-users/profile","jobs/posters","web-users/avatars"]},"fileName":{"type":"string","example":"poster.webp"},"contentType":{"type":"string","example":"image/webp"}}}}}},"responses":{"200":{"description":"Upload URL generated"},"400":{"description":"Invalid input"}}}},"/api/v1/web/chat/create-conversation":{"post":{"summary":"Create a chat conversation for a job application","description":"Create a new chat conversation between provider and seeker for a specific job application","tags":["Chat"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["jobApplicationId"],"properties":{"jobApplicationId":{"type":"integer","description":"ID of the job application","example":1}}}}}},"responses":{"200":{"description":"Conversation created successfully","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/ApiResponse"},{"type":"object","properties":{"data":{"type":"object","properties":{"conversationId":{"type":"string","description":"Firebase conversation ID"},"jobApplicationId":{"type":"integer","description":"Job application ID"}}}}}]}}}},"400":{"description":"Bad request - Invalid input data"},"401":{"description":"Unauthorized - Invalid or missing authentication"},"404":{"description":"Job application not found"},"500":{"description":"Internal server error"}}}},"/api/v1/web/chat/conversations":{"get":{"summary":"Get all conversations for the current provider","description":"Retrieve all chat conversations for the authenticated provider","tags":["Chat"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Conversations retrieved successfully","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/ApiResponse"},{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"integer","description":"Job application ID"},"conversationId":{"type":"string","description":"Firebase conversation ID"},"seeker":{"type":"object","properties":{"id":{"type":"integer"},"personalInfo":{"type":"object","properties":{"firstName":{"type":"string"},"lastName":{"type":"string"},"profileImageUrl":{"type":"string"}}}}},"job":{"type":"object","properties":{"id":{"type":"integer"},"title":{"type":"string"}}}}}}}}]}}}},"500":{"description":"Internal server error"}}}},"/api/v1/web/jobs/{id}":{"get":{"summary":"Get job by ID","description":"Retrieve a specific job by its ID","tags":["Web Jobs"],"security":[{"bearerAuth":[]}],"parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"integer"},"description":"Job ID","example":1}],"responses":{"200":{"description":"Job retrieved successfully","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/ApiResponse"},{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Job"}}}]}}}},"400":{"description":"Bad request - Invalid job ID"},"401":{"description":"Unauthorized - Invalid or missing authentication"},"404":{"description":"Job not found"},"500":{"description":"Internal server error"}}},"put":{"summary":"Update job","description":"Update an existing job posting","tags":["Web Jobs"],"security":[{"bearerAuth":[]}],"parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"integer"},"description":"Job ID","example":1}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateJobRequest"}}}},"responses":{"200":{"description":"Job updated successfully","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/ApiResponse"},{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Job"}}}]}}}},"400":{"description":"Bad request - Invalid input data"},"401":{"description":"Unauthorized - Invalid or missing authentication"},"404":{"description":"Job not found"},"500":{"description":"Internal server error"}}},"delete":{"summary":"Delete job","description":"Delete an existing job posting","tags":["Web Jobs"],"security":[{"bearerAuth":[]}],"parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"integer"},"description":"Job ID","example":1}],"responses":{"200":{"description":"Job deleted successfully","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/ApiResponse"},{"type":"object","properties":{"data":{"type":"object","properties":{"message":{"type":"string","example":"Job deleted successfully"}}}}}]}}}},"400":{"description":"Bad request - Invalid job ID"},"401":{"description":"Unauthorized - Invalid or missing authentication"},"404":{"description":"Job not found"},"500":{"description":"Internal server error"}}}},"/api/v1/web/jobs":{"get":{"summary":"Get all jobs","description":"Retrieve all jobs accessible to the authenticated web user","tags":["Web Jobs"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Jobs retrieved successfully","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/ApiResponse"},{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Job"}}}}]}}}},"401":{"description":"Unauthorized - Invalid or missing authentication"},"500":{"description":"Internal server error"}}},"post":{"summary":"Create a new job","description":"Create a new job posting","tags":["Web Jobs"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateJobRequest"}}}},"responses":{"201":{"description":"Job created successfully","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/ApiResponse"},{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Job"}}}]}}}},"400":{"description":"Bad request - Invalid input data"},"401":{"description":"Unauthorized - Invalid or missing authentication"},"500":{"description":"Internal server error"}}}},"/api/v1/web/job-applications/{id}":{"get":{"summary":"Get job application by ID","description":"Retrieve a specific job application by its ID with full details","tags":["Web Job Applications"],"security":[{"bearerAuth":[]}],"parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"integer"},"description":"Job Application ID","example":1}],"responses":{"200":{"description":"Job application retrieved successfully","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/ApiResponse"},{"type":"object","properties":{"data":{"$ref":"#/components/schemas/JobApplication"}}}]}}}},"400":{"description":"Bad request - Invalid application ID"},"401":{"description":"Unauthorized - Invalid or missing authentication"},"404":{"description":"Job application not found"},"500":{"description":"Internal server error"}}}},"/api/v1/public/jobs":{"get":{"summary":"Get public jobs (no authentication required)","description":"Get a limited list of active jobs for public viewing (landing page)","tags":["Public Jobs"],"parameters":[{"in":"query","name":"limit","schema":{"type":"integer","default":10},"description":"Maximum number of jobs to return"}],"responses":{"200":{"description":"Jobs fetched successfully","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"message":{"type":"string"},"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"integer"},"title":{"type":"string"},"company":{"type":"string"},"location":{"type":"string"},"salary":{"type":"string"},"experience":{"type":"string"},"type":{"type":"string"},"postedDate":{"type":"string"},"skills":{"type":"array","items":{"type":"string"}},"description":{"type":"string"}}}}}}}}},"500":{"description":"Internal server error"}}}},"/api/v1/web/users":{"post":{"summary":"Create a new web user","description":"Creates a new web user with the provided information","tags":["Web Users"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateWebUserRequest"}}}},"responses":{"201":{"description":"Web user created successfully","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/ApiResponse"},{"type":"object","properties":{"data":{"$ref":"#/components/schemas/WebUser"}}}]}}}},"400":{"description":"Bad request - Invalid input data"},"401":{"description":"Unauthorized - Invalid or missing authentication"},"500":{"description":"Internal server error"}}},"get":{"summary":"Get all web users","description":"Retrieve all web users accessible to the current user based on their permissions","tags":["Web Users"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Web users retrieved successfully","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/ApiResponse"},{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/WebUser"}}}}]}}}},"401":{"description":"Unauthorized - Invalid or missing authentication"},"500":{"description":"Internal server error"}}}},"/api/v1/web/users/me":{"get":{"summary":"Get current web user profile","description":"Retrieve the profile information of the currently authenticated web user","tags":["Web Users"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Current user profile retrieved successfully","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/ApiResponse"},{"type":"object","properties":{"data":{"$ref":"#/components/schemas/WebUser"}}}]}}}},"401":{"description":"Unauthorized - Invalid or missing authentication"},"500":{"description":"Internal server error"}}}},"/api/v1/web/users/{id}":{"put":{"summary":"Update web user by ID","description":"Update a specific web user by their ID","tags":["Web Users"],"security":[{"bearerAuth":[]}],"parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"integer"},"description":"User ID to update","example":1}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateWebUserRequest"}}}},"responses":{"200":{"description":"User updated successfully","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/ApiResponse"},{"type":"object","properties":{"data":{"$ref":"#/components/schemas/WebUser"}}}]}}}},"400":{"description":"Bad request - Invalid input data"},"401":{"description":"Unauthorized - Invalid or missing authentication"},"404":{"description":"User not found"},"500":{"description":"Internal server error"}}},"delete":{"summary":"Delete web user by ID","description":"Delete a specific web user by their ID","tags":["Web Users"],"security":[{"bearerAuth":[]}],"parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"integer"},"description":"User ID to delete","example":1}],"responses":{"200":{"description":"User deleted successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Unauthorized - Invalid or missing authentication"},"404":{"description":"User not found"},"500":{"description":"Internal server error"}}}}},"tags":[]}