{"openapi":"3.0.0","paths":{"/health":{"get":{"operationId":"HealthController_getHealth","parameters":[],"responses":{"200":{"description":"Current health and monitoring snapshot.","content":{"application/json":{"schema":{"example":{"status":"ok","database":"up","browser":"running","login":"authenticated","observer":"observing","selectorConfidence":0.98,"visibleChats":149,"extractionRuns":42,"lastExtractionDurationMs":320,"lastObservedAt":"2026-07-04T10:00:00.000Z","mutationsProcessed":12,"extractionErrors":0,"timestamp":"2026-07-04T10:00:00.000Z"}}}}}},"summary":"Return backend, database, browser, and observer health status","tags":["status"]}},"/browser-view":{"get":{"operationId":"BrowserViewController_getBrowserView","parameters":[{"name":"poll","required":false,"in":"query","description":"Set to 0 to disable screenshot polling","schema":{"type":"string"}}],"responses":{"200":{"description":"HTML browser mirror page."}},"summary":"Render the backend-served WhatsApp browser mirror page","tags":["browser-view"]}},"/browser-view/console":{"get":{"operationId":"BrowserViewController_getConsole","parameters":[],"responses":{"200":{"description":"Browser console entries."}},"summary":"Return captured browser console entries","tags":["browser-view"]}},"/browser-view/console/clear":{"post":{"operationId":"BrowserViewController_clearConsole","parameters":[],"responses":{"204":{"description":""}},"summary":"Clear captured browser console entries","tags":["browser-view"]}},"/browser-view/click":{"post":{"operationId":"BrowserViewController_clickSafeControl","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"example":{"x":420,"y":280}}}}},"responses":{"200":{"description":"Click result."}},"summary":"Click a coordinate in the mirrored browser","tags":["browser-view"]}},"/browser-view/wheel":{"post":{"operationId":"BrowserViewController_scrollBrowser","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"example":{"deltaX":0,"deltaY":360}}}}},"responses":{"200":{"description":"Scroll result."}},"summary":"Scroll the mirrored browser","tags":["browser-view"]}},"/browser-view/key":{"post":{"operationId":"BrowserViewController_pressBrowserKey","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"example":{"key":"Enter"}}}}},"responses":{"200":{"description":"Keyboard input result."}},"summary":"Send keyboard input to the mirrored browser","tags":["browser-view"]}},"/browser-view/reload":{"post":{"operationId":"BrowserViewController_reloadWhatsApp","parameters":[],"responses":{"200":{"description":"Reload result and login state."}},"summary":"Reload the WhatsApp Web page","tags":["browser-view"]}},"/browser-view/chat":{"post":{"operationId":"BrowserViewController_readChat","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"example":{"chatName":"Gujarat Taxi Group"}}}}},"responses":{"200":{"description":"Read chat result."}},"summary":"Open a chat by name and read visible messages","tags":["browser-view"]}},"/browser-view/session/reset":{"post":{"operationId":"BrowserViewController_resetSession","parameters":[],"responses":{"200":{"description":"Session reset result."}},"summary":"Reset the browser session and return the login state","tags":["browser-view"]}},"/chats":{"get":{"operationId":"ChatController_getChats","parameters":[{"name":"cursor","required":false,"in":"query","schema":{"type":"string"}},{"name":"limit","required":false,"in":"query","schema":{"type":"number"}}],"responses":{"200":{"description":"Paginated chat records."}},"summary":"List stored WhatsApp chats","tags":["chats"]}},"/chats/recent":{"get":{"operationId":"ChatController_getRecent","parameters":[{"name":"limit","required":false,"in":"query","schema":{"type":"number"}}],"responses":{"200":{"description":"Recent chat records."}},"summary":"List recently observed WhatsApp chats","tags":["chats"]}},"/chats/unread":{"get":{"operationId":"ChatController_getUnread","parameters":[{"name":"cursor","required":false,"in":"query","schema":{"type":"string"}},{"name":"limit","required":false,"in":"query","schema":{"type":"number"}}],"responses":{"200":{"description":"Unread chat records."}},"summary":"List chats with unread indicators","tags":["chats"]}},"/chats/{id}/messages":{"get":{"operationId":"ChatController_getMessages","parameters":[{"name":"id","required":true,"in":"path","description":"Stored chat id","schema":{"type":"string"}},{"name":"limit","required":false,"in":"query","schema":{"type":"number"}}],"responses":{"200":{"description":"Stored chat messages."}},"summary":"List stored messages for one chat","tags":["chats"]}},"/links":{"get":{"operationId":"ChatController_getLinks","parameters":[{"name":"limit","required":false,"in":"query","schema":{"example":200,"type":"number"}}],"responses":{"200":{"description":"Extracted link rows."}},"summary":"List WhatsApp and chat links found in stored messages","tags":["chats"]}},"/events":{"get":{"operationId":"ChatController_getEvents","parameters":[{"name":"limit","required":false,"in":"query","schema":{"type":"number"}}],"responses":{"200":{"description":"Stored monitor events."}},"summary":"List stored monitor events","tags":["chats"]}},"/stats":{"get":{"operationId":"ChatController_getStats","parameters":[],"responses":{"200":{"description":"Aggregate database statistics."}},"summary":"Return chat and message storage statistics","tags":["chats"]}},"/bookings/forwarding":{"get":{"operationId":"ChatController_getBookingForwardingStatus","parameters":[],"responses":{"200":{"description":"Booking forwarding status."}},"summary":"Return booking forwarding worker status","tags":["chats"]}},"/bookings/messages":{"get":{"operationId":"ChatController_getBookingMessages","parameters":[{"name":"limit","required":false,"in":"query","schema":{"example":500,"type":"number"}}],"responses":{"200":{"description":"Booking message rows."}},"summary":"List locally classified booking-like messages","tags":["chats"]}},"/bookings/forwarding/start":{"post":{"operationId":"ChatController_startBookingForwarding","parameters":[],"responses":{"200":{"description":"Updated forwarding status."}},"summary":"Start forwarding booking messages to the configured booking API","tags":["chats"]}},"/bookings/forwarding/stop":{"post":{"operationId":"ChatController_stopBookingForwarding","parameters":[],"responses":{"200":{"description":"Updated forwarding status."}},"summary":"Stop booking message forwarding","tags":["chats"]}},"/ai-bookings/status":{"get":{"operationId":"AiBookingController_status","parameters":[],"responses":{"200":{"description":"AI booking status, queue, cooldown, and counters."}},"summary":"Return AI booking automation status","tags":["ai-bookings"]}},"/ai-bookings/detections":{"get":{"operationId":"AiBookingController_detections","parameters":[{"name":"limit","required":false,"in":"query","schema":{"example":100,"type":"number"}},{"name":"bookingsOnly","required":false,"in":"query","schema":{"type":"boolean"}},{"name":"intent","required":false,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"AI detection rows."}},"summary":"List AI booking detections","tags":["ai-bookings"]}},"/ai-bookings/bookings":{"get":{"operationId":"AiBookingController_bookings","parameters":[{"name":"limit","required":false,"in":"query","schema":{"example":500,"type":"number"}}],"responses":{"200":{"description":"AI booking rows."}},"summary":"List AI detections classified as bookings","tags":["ai-bookings"]}},"/ai-bookings/analyze":{"post":{"operationId":"AiBookingController_analyze","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"example":{"chatId":"120363...","chatName":"Gujarat Taxi Group","messageId":"msg-1","text":"Rajkot to Ahmedabad sedan required tomorrow morning"}}}}},"responses":{"200":{"description":"AI classification result."}},"summary":"Analyze one message with the AI booking classifier","tags":["ai-bookings"]}},"/ai-bookings/feedback":{"post":{"operationId":"AiBookingController_feedback","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"example":{"detectionId":"det_123","expectedIntent":"booking","note":"Confirmed booking requirement"}}}}},"responses":{"200":{"description":"Stored feedback result."}},"summary":"Submit feedback for an AI booking detection","tags":["ai-bookings"]}},"/gujarat/sync":{"post":{"operationId":"GujaratBookingController_sync","parameters":[{"name":"limit","required":false,"in":"query","schema":{"example":2000,"type":"number"}}],"responses":{"200":{"description":"Sync counters for stored bookings and candidates."}},"summary":"Sync Gujarat booking candidates from stored chat data","tags":["gujarat"]}},"/gujarat/bookings":{"get":{"operationId":"GujaratBookingController_bookings","parameters":[{"name":"limit","required":false,"in":"query","schema":{"example":500,"type":"number"}}],"responses":{"200":{"description":"Stored Gujarat booking rows."}},"summary":"List Gujarat booking records","tags":["gujarat"]}},"/gujarat/summary":{"get":{"operationId":"GujaratBookingController_summary","parameters":[],"responses":{"200":{"description":"Gujarat summary metrics."}},"summary":"Return Gujarat workspace and booking summary metrics","tags":["gujarat"]}},"/scraping/status":{"get":{"operationId":"ScrapingController_getStatus","parameters":[],"responses":{"200":{"description":"Observer status and counters."}},"summary":"Return WhatsApp sidebar observer status","tags":["scraping"]}},"/scraping/start":{"post":{"operationId":"ScrapingController_start","parameters":[],"responses":{"200":{"description":"Updated observer status."}},"summary":"Start sidebar scraping","tags":["scraping"]}},"/scraping/stop":{"post":{"operationId":"ScrapingController_stop","parameters":[],"responses":{"200":{"description":"Updated observer status."}},"summary":"Stop sidebar scraping","tags":["scraping"]}},"/scraping/sweep":{"post":{"operationId":"ScrapingController_sweep","parameters":[],"responses":{"200":{"description":"Sweep result and observer status."}},"summary":"Run one explicit sidebar sweep","tags":["scraping"]}},"/scraping/messages/status":{"get":{"operationId":"ScrapingController_getMessageScrapeStatus","parameters":[],"responses":{"200":{"description":"Bulk message scraping status."}},"summary":"Return bulk message scrape status","tags":["scraping"]}},"/scraping/messages/start":{"post":{"operationId":"ScrapingController_startMessageScrape","parameters":[{"name":"limit","required":false,"in":"query","schema":{"type":"number"}},{"name":"messageLimit","required":false,"in":"query","schema":{"type":"number"}},{"name":"historyScrollSteps","required":false,"in":"query","schema":{"type":"number"}}],"responses":{"200":{"description":"Updated bulk message scrape status."}},"summary":"Start bulk message scraping","tags":["scraping"]}},"/scraping/messages/stop":{"post":{"operationId":"ScrapingController_stopMessageScrape","parameters":[],"responses":{"200":{"description":"Updated bulk message scrape status."}},"summary":"Stop bulk message scraping","tags":["scraping"]}}},"info":{"title":"WhatsApp Monitor API","description":"Read-only WhatsApp Web sidebar monitoring backend with chat, booking, scraping, browser-view, and realtime status endpoints.","version":"1.0.0","contact":{}},"tags":[{"name":"status","description":"Health checks and service landing page"},{"name":"chats","description":"Stored chats, messages, links, stats, and booking forwarding"},{"name":"ai-bookings","description":"AI-assisted booking detection and feedback"},{"name":"gujarat","description":"Gujarat taxi booking sync and summary data"},{"name":"scraping","description":"WhatsApp sidebar and message scraping controls"},{"name":"browser-view","description":"Backend-served WhatsApp Web browser mirror controls"}],"servers":[],"components":{"schemas":{}}}