diff --git a/mautrix_facebook/web/public.py b/mautrix_facebook/web/public.py
index e9481ffe312f515cd75ca9b59d940382238903d0..470d98ab89b2b6f57cc695222f5d454939229059 100644
--- a/mautrix_facebook/web/public.py
+++ b/mautrix_facebook/web/public.py
@@ -46,6 +46,9 @@ class PublicBridgeWebsite:
         self.app.router.add_options("/api/login", self.login_options)
         self.app.router.add_post("/api/login", self.login)
         self.app.router.add_post("/api/logout", self.logout)
+        self.app.router.add_post("/api/disconnect", self.disconnect)
+        self.app.router.add_post("/api/reconnect", self.reconnect)
+        self.app.router.add_post("/api/refresh", self.refresh)
         self.app.router.add_static("/", pkg_resources.resource_filename("mautrix_facebook",
                                                                         "web/static/"))
 
@@ -106,9 +109,11 @@ class PublicBridgeWebsite:
             "facebook": None,
         }
         if await user.is_logged_in():
-            info = cast(fbchat.UserData, await user.client.fetch_thread_info([user.fbid]).__anext__())
+            info = cast(fbchat.UserData,
+                        await user.client.fetch_thread_info([user.fbid]).__anext__())
             data["facebook"] = attr.asdict(info)
             del data["facebook"]["session"]
+            data["facebook"]["connected"] = user.is_connected
         return web.json_response(data, headers=self._acao_headers)
 
     async def login(self, request: web.Request) -> web.Response:
@@ -149,3 +154,25 @@ class PublicBridgeWebsite:
         if puppet.is_real_user:
             await puppet.switch_mxid(None, None)
         return web.json_response({}, headers=self._acao_headers)
+
+    async def disconnect(self, request: web.Request) -> web.Response:
+        user = self.check_token(request)
+        if not user.is_connected:
+            raise web.HTTPBadRequest(body='{"error": "User is not connected"}',
+                                     headers=self._headers)
+        user.listener.disconnect()
+        await user.listen_task
+        return web.json_response({}, headers=self._acao_headers)
+
+    async def reconnect(self, request: web.Request) -> web.Response:
+        user = self.check_token(request)
+        if user.is_connected:
+            raise web.HTTPConflict(body='{"error": "User is already connected"}',
+                                   headers=self._headers)
+        user.start_listen()
+        return web.json_response({}, headers=self._acao_headers)
+
+    async def refresh(self, request: web.Request) -> web.Response:
+        user = self.check_token(request)
+        await user.try_refresh()
+        return web.json_response({}, headers=self._acao_headers)