{"message":"Zaplon API is running! 🚀","version":"1.0.0","endpoints":{"auth":{"sendOTP":"POST /api/auth/send-otp","verifyOTP":"POST /api/auth/verify-otp","profile":"GET /api/auth/profile (protected)","updateProfile":"PUT /api/auth/profile (protected)"},"salons":{"list":"GET /api/salons?lat=&lng=&sort=distance|rating|recent&max_distance_km=","detail":"GET /api/salons/:id","slots":"GET /api/salons/:salonId/slots?date=&serviceId="},"users":{"updateLocation":"PATCH /api/users/me/location (protected)","updateTravelMode":"PATCH /api/users/me/travel-mode (protected)","updatePushToken":"PATCH /api/users/me/push-token (protected)"},"bookings":{"create":"POST /api/bookings (protected)","confirm":"POST /api/bookings/:id/confirm (protected) — two-sided confirmation, customer side"},"reviews":{"create":"POST /api/reviews (protected)","listForSalon":"GET /api/salons/:salonId/reviews?page=&limit=&sort=recent|highest|lowest"},"notifications":{"my":"GET /api/notifications/my?unread_only=&page=&limit= (protected)","markRead":"PATCH /api/notifications/:id/read (protected)","markAllRead":"PATCH /api/notifications/read-all (protected)"},"wallet":{"me":"GET /api/wallet/me (protected) — balance + referral code","transactions":"GET /api/wallet/transactions?page=&limit= (protected)","referredSalons":"GET /api/wallet/referred-salons (protected)","salonLookup":"GET /api/wallet/salon-lookup?code= (protected) — 6-digit salon code → name/address","redeem":"POST /api/wallet/redeem (protected) — { salon_code, amount }"},"feedback":{"create":"POST /api/feedback (protected)","my":"GET /api/feedback/my?status=new|in_progress|resolved|all&page=&limit= (protected)","detail":"GET /api/feedback/:id (protected)"},"ownerAuth":{"sendOTP":"POST /api/owner/auth/send-otp","verifyOTP":"POST /api/owner/auth/verify-otp"},"ownerSalons":{"mine":"GET /api/owner/salons/mine (protected, owner)","create":"POST /api/owner/salons (protected, owner)","update":"PATCH /api/owner/salons/mine (protected, owner)","photoUploadUrl":"POST /api/owner/salons/mine/photo-upload-url (protected, owner)","updatePhotos":"PATCH /api/owner/salons/mine/photos (protected, owner)","createService":"POST /api/owner/salons/mine/services (protected, owner)","updateService":"PATCH /api/owner/services/:serviceId (protected, owner)","deleteService":"DELETE /api/owner/services/:serviceId (protected, owner)","createStaff":"POST /api/owner/salons/mine/staff (protected, owner)","updateStaff":"PATCH /api/owner/staff/:staffId (protected, owner)","deleteStaff":"DELETE /api/owner/staff/:staffId (protected, owner)","emergencyClose":"POST /api/owner/emergency-close (protected, owner)"},"ownerBookings":{"today":"GET /api/owner/bookings/today?date= (protected, owner)","createManual":"POST /api/owner/bookings/manual (protected, owner)","checkin":"PATCH /api/owner/bookings/:id/checkin (protected, owner)","complete":"PATCH /api/owner/bookings/:id/complete (protected, owner) — delegates to two-sided confirmation, owner side","noShow":"PATCH /api/owner/bookings/:id/no-show (protected, owner) — delegates to two-sided confirmation, owner side","confirm":"POST /api/owner/bookings/:id/confirm (protected, owner) — two-sided confirmation, owner side"},"ownerEarnings":{"summary":"GET /api/owner/earnings/summary?range=today|week|month|all (protected, owner)","bookings":"GET /api/owner/earnings/bookings?range=&page=&limit= (protected, owner)","chart":"GET /api/owner/earnings/chart?range=week|month (protected, owner)"},"ownerWalkins":{"list":"GET /api/owner/walkins?status=waiting|in_service|all (protected, owner)","create":"POST /api/owner/walkins (protected, owner)","call":"PATCH /api/owner/walkins/:id/call (protected, owner)","complete":"PATCH /api/owner/walkins/:id/complete (protected, owner)","left":"PATCH /api/owner/walkins/:id/left (protected, owner)"},"adminAuth":{"login":"POST /api/admin/auth/login","me":"GET /api/admin/auth/me (protected, admin)"},"adminSalons":{"list":"GET /api/admin/salons?status=pending|approved|rejected|all&search=&page=&limit= (protected, admin)","detail":"GET /api/admin/salons/:id (protected, admin)","approve":"PATCH /api/admin/salons/:id/approve (protected, admin)","reject":"PATCH /api/admin/salons/:id/reject (protected, admin)","fraudFlag":"POST /api/admin/salons/:id/fraud-flag (protected, admin)","fraudFlagClear":"POST /api/admin/salons/:id/fraud-flag/clear (protected, admin)"},"adminDisputes":{"list":"GET /api/admin/disputes?status=open|resolved (protected, admin)","resolve":"POST /api/admin/disputes/:booking_id/resolve (protected, admin)"},"adminCommission":{"summary":"GET /api/admin/commission/summary?range=today|week|month|all (protected, admin)","bySalon":"GET /api/admin/commission/salons (protected, admin)","salonDetail":"GET /api/admin/commission/salons/:id/detail (protected, admin)"},"adminRedemptions":{"list":"GET /api/admin/redemptions?status=completed|reversed|all&search=&page=&limit= (protected, admin)","reverse":"POST /api/admin/redemptions/:id/reverse (protected, admin) — { reason }"},"adminUsers":{"list":"GET /api/admin/users?role=customer|owner|admin|all&search=&page=&limit= (protected, admin)","detail":"GET /api/admin/users/:id (protected, admin)"},"adminStats":{"overview":"GET /api/admin/stats?period=today|week|month|all (protected, admin)"},"adminFeedback":{"list":"GET /api/admin/feedback?status=new|in_progress|resolved|all&category=&role=&search=&page=&limit= (protected, admin)","detail":"GET /api/admin/feedback/:id (protected, admin)","respond":"PATCH /api/admin/feedback/:id/respond (protected, admin)","updateStatus":"PATCH /api/admin/feedback/:id/status (protected, admin)"},"blog":{"list":"GET /api/blog/posts?page=&limit=&category=&tag=","detail":"GET /api/blog/posts/:slug","categories":"GET /api/blog/categories"},"adminBlog":{"list":"GET /api/admin/blog/posts?page=&limit=&status=draft|published|archived|all (protected, admin)","detail":"GET /api/admin/blog/posts/:id (protected, admin)","create":"POST /api/admin/blog/posts (protected, admin)","update":"PATCH /api/admin/blog/posts/:id (protected, admin)","remove":"DELETE /api/admin/blog/posts/:id (protected, admin)","uploadUrl":"POST /api/admin/blog/upload-url (protected, admin)"},"blogWebhook":{"publish":"POST /api/webhooks/blog/publish (X-API-Key)"},"smsGateway":{"register":"POST /api/sms-gateway/register (X-API-Key) — Android gateway device","next":"GET /api/sms-gateway/next?device_id=&wait=25 (X-API-Key) — long-poll for queued SMS","ack":"POST /api/sms-gateway/:id/ack (X-API-Key)","status":"POST /api/sms-gateway/:id/status (X-API-Key) — { status: sent|delivered|failed }","testSend":"POST /api/sms-gateway/test-send (X-API-Key) — { to, content }, never OTP priority","stats":"GET /api/sms-gateway/stats (X-API-Key) — queue depth"}}}