{"message":"Welcome to mplanners API","version":"1.0.0","endpoints":{"health":"/health","api":"/api","auth":{"userSendOTP":"/auth/user/send-otp","userResendOTP":"/auth/user/resend-otp","userVerifyOTP":"/auth/user/verify-otp","adminLogin":"/auth/admin/login (returns token_id, tracks IP and login time)"},"users":{"updateProfile":"PUT /users/profile","getProfile":"GET /users/profile/:id"},"categories":{"getAll":"GET /categories","getById":"GET /categories/:id","create":"POST /categories","update":"PUT /categories/:id","delete":"DELETE /categories/:id"},"events":{"create":"POST /events","getAll":"GET /events","getById":"GET /events/:id","update":"PUT /events/:id","delete":"DELETE /events/:id"},"moi":{"add":"POST /moi","getAll":"GET /moi (supports ?event_id, ?user_id, ?mobile_number filters)","getById":"GET /moi/:id","getByUserId":"GET /moi/user/:user_id","getByMobile":"GET /moi/mobile/:mobile_number","getGiven":"GET /moi/given (moi given by authenticated user)","getReceived":"GET /moi/received (moi received by authenticated user)","getRelationship":"GET /moi/relationship/:mobile_number (financial relationship with specific person)","getAllRelationships":"GET /moi/relationships (all users with moi relationships)"},"selfTracking":{"add":"POST /self-tracking","getAll":"GET /self-tracking (list all entries for authenticated user)"},"budgetGroups":{"create":"POST /budget-groups (create event name like \"Marriage\")","getAll":"GET /budget-groups (list all budget groups with summary stats)","getById":"GET /budget-groups/:id (get single budget group with all budgets)","update":"PUT /budget-groups/:id","delete":"DELETE /budget-groups/:id","reset":"POST /budget-groups/:id/reset (reset all budgets for a specific group)"},"budgets":{"create":"POST /budgets (requires budget_group_id)","getAll":"GET /budgets (supports ?budget_group_id query parameter)","getById":"GET /budgets/:id (get single budget with all advances)","update":"PUT /budgets/:id","delete":"DELETE /budgets/:id","addAdvance":"POST /budgets/:id/advance (add advance payment)","updateAdvance":"PUT /budgets/:id/advance/:advance_id (update advance payment, body: { amount?, payment_name?, payment_date?, payment_mode?, payment_notes? })","deleteAdvance":"DELETE /budgets/:id/advance/:advance_id","reset":"POST /budgets/reset (reset all budgets and advances for user)"},"expenseCategories":{"list":"GET /expense-categories (list all expense categories - read-only for users)"},"contactUs":{"submit":"POST /contact-us (public - no authentication required, fields: name, mobile_number, subject, description)"},"public":{"terms":"GET /terms (public - no authentication required, returns published terms and conditions)","privacyPolicy":"GET /privacy-policy (public - no authentication required, returns published privacy policy)"},"mobile":{"login":"POST /mobile/login (send OTP via WhatsApp & SMS, body: { mobile_no, name? })","verify":"POST /mobile/verify (verify OTP and get token_id, body: { mobile_no, otp })","getUserInfo":"GET /mobile/user/info (requires token: Authorization: Bearer {token_id} or X-Auth-Token: {token_id})","updateUserInfo":"PUT /mobile/user/info (requires token, body: { name?, city?, gender? })","saveDetails":"POST /mobile/save-details (requires token, body: { husband_name_english?, husband_name_tamil?, wife_name_english?, wife_name_tamil?, city_english?, city_tamil?, mobile_number? })","getSaveDetails":"GET /mobile/save-details (requires token, returns saved MOI default details for QR code/prefill)","partnerStatus":"GET /mobile/partner/status (requires token, returns partner link status, pending requests)","partnerRequest":"POST /mobile/partner/request (requires token, body: { mobile_number })","partnerAccept":"POST /mobile/partner/accept (requires token, body: { request_id }, returns 6-digit code)","partnerDecline":"POST /mobile/partner/decline (requires token, body: { request_id })","partnerMerge":"POST /mobile/partner/merge (requires token, body: { code })","partnerUnlink":"DELETE /mobile/partner/unlink (requires token)","deleteUser":"DELETE /mobile/user (requires token, deletes user account and all related data)","createEvent":"POST /mobile/events (requires token, body: { category_name, event_name, date, time, ... })","updateEvent":"PUT /mobile/events/:eventId (requires token, body: { category_name?, event_name?, date?, time?, ... })","listEventCategories":"GET /mobile/event-categories (requires token, returns category list)","myEvents":"GET /mobile/events/my (requires token, returns totals + list)","eventDetails":"GET /mobile/events/:eventId (requires token, returns event + moi summary/list)","eventGeneratePDF":"GET /mobile/events/:eventId/generate-pdf (requires token, generates and downloads PDF booklet)","moiGiven":"GET /mobile/moi/given (requires token, returns contributions user gave)","moiReceived":"GET /mobile/moi/received (requires token, returns contributions user received)","moiTotals":"GET /mobile/moi/totals (requires token, returns all totals: given, received, and net amount)","moiRelationships":"GET /mobile/moi/relationships (requires token, returns financial relationships)","notificationsList":"GET /mobile/notifications (requires token, ?read=all|unread|read, returns by_date + total_unread)","notificationMarkRead":"PATCH /mobile/notifications/:id/read (requires token)","notificationsMarkAllRead":"PATCH or POST /mobile/notifications/read-all (requires token; returns updated_count, total_unread: 0)","selfTrackingAdd":"POST /mobile/self-tracking (requires token, body: { event_name, amount?, date?, organizer_mobile? })","selfTrackingList":"GET /mobile/self-tracking (requires token, returns user self tracking entries)","selfTrackingForOrganizer":"GET /mobile/self-tracking/for-organizer (requires token, ?date=YYYY-MM-DD, entries where you are organizer)","selfTrackingApprove":"POST /mobile/self-tracking/:id/approve (requires token, body: { event_id }, organizer only; moves to MOI received)","selfTrackingUpdate":"PUT /mobile/self-tracking/:id (requires token, body: { event_name?, amount?, date?, ... })","selfTrackingDelete":"DELETE /mobile/self-tracking/:id (requires token)","budgetGroupCreate":"POST /mobile/budget-groups (requires token, body: { event_name, event_name_tamil? })","budgetGroupList":"GET /mobile/budget-groups (requires token, returns list + totals)","budgetGroupUpdate":"PUT /mobile/budget-groups/:id (requires token, body: { event_name?, event_name_tamil? })","budgetGroupDelete":"DELETE /mobile/budget-groups/:id (requires token, cannot delete if has budgets/advances)","budgetCreate":"POST /mobile/budgets (requires token, body: { budget_group_id, name, category_name?, estimate_amount })","budgetList":"GET /mobile/budgets (requires token, supports ?budget_group_id)","budgetUpdate":"PUT /mobile/budgets/:id (requires token, body: { name?, category_name?, estimate_amount?, photo?, notes? })","budgetDelete":"DELETE /mobile/budgets/:id (requires token)","budgetAdvanceAdd":"POST /mobile/budgets/:budgetId/advances (requires token, body: { amount, payment_name?, payment_date?, payment_mode?, payment_notes? })","budgetAdvanceList":"GET /mobile/budgets/:budgetId/advances (requires token, returns all advances for a budget)","budgetAdvanceUpdate":"PUT /mobile/budgets/:budgetId/advances/:advanceId (requires token, body: { amount?, payment_name?, payment_date?, payment_mode?, payment_notes? })","budgetAdvanceDelete":"DELETE /mobile/budgets/:budgetId/advances/:advanceId (requires token)","budgetAdvancesList":"GET /mobile/budget-advances (requires token, supports ?budget_id query parameter)","getContactInfo":"GET /mobile/contact-info (requires token, returns contact information: email, phone_no_1, phone_no_2)"},"dashboard":{"getFull":"GET /dashboard","getStats":"GET /dashboard/stats"},"admin":{"getUserList":"GET /admin/users (with pagination, search, filters)","getUserStats":"GET /admin/users/stats (comprehensive statistics)","getUserDetails":"GET /admin/users/:id (individual user details)","getCategories":"GET /admin/categories (admin access to categories)","createCategory":"POST /admin/categories (create new category)","updateCategory":"PUT /admin/categories/:id (update category)","deleteCategory":"DELETE /admin/categories/:id (delete category)","getCategoryById":"GET /admin/categories/:id (admin category details)","getExpenseCategories":"GET /admin/expense-categories (list all expense categories)","createExpenseCategory":"POST /admin/expense-categories (create new expense category)","updateExpenseCategory":"PUT /admin/expense-categories/:id (update expense category)","deleteExpenseCategory":"DELETE /admin/expense-categories/:id (delete expense category)","getExpenseCategoryById":"GET /admin/expense-categories/:id (get expense category details)","getContactUsList":"GET /admin/contact-us (list all contact form submissions with pagination)","getContactUsById":"GET /admin/contact-us/:id (view single contact form submission)","getContactInfo":"GET /admin/contact-info (get contact information: email, phone_no_1, phone_no_2)","updateContactInfo":"PUT /admin/contact-info (update contact information: email, phone_no_1, phone_no_2)","getDashboard":"GET /admin/dashboard (comprehensive admin dashboard)","getDashboardStats":"GET /admin/dashboard/stats (quick statistics)"}}}