Mintplex-Labs/anything-llm · error
Failed to disconnect and revoke API key
Error message
Failed to disconnect and revoke API key
What it means
HTTP 500 from DELETE /api/browser-extension/disconnect, which revokes the browser extension's API key via BrowserExtensionApiKey.delete(apiKeyId). The handler throws (and converts to this message) when delete reports {success:false, error}, or when the DB delete itself throws - e.g. the key row was already removed, the database is unavailable, or response.locals.apiKey was not populated. The original error is only in the server console.
Source
Thrown at server/endpoints/browserExtension.js:57
.json({ connected: false, error: "Failed to fetch workspaces" });
}
}
);
app.delete(
"/browser-extension/disconnect",
[validBrowserExtensionApiKey],
async (_request, response) => {
try {
const apiKeyId = response.locals.apiKey.id;
const { success, error } =
await BrowserExtensionApiKey.delete(apiKeyId);
if (!success) throw new Error(error);
response.status(200).json({ success: true });
} catch (error) {
console.error(error);
response
.status(500)
.json({ error: "Failed to disconnect and revoke API key" });
}
}
);
app.get(
"/browser-extension/workspaces",
[validBrowserExtensionApiKey],
async (request, response) => {
try {
const user = await userFromSession(request, response);
const workspaces = multiUserMode(response)
? await Workspace.whereWithUser(user)
: await Workspace.where();
response.status(200).json({ workspaces });
} catch (error) {
console.error(error);View on GitHub (pinned to 3aec848f28)
Solutions
- Check server logs for the console.error output naming the real cause
- Retry disconnect once after refreshing the extension - an already-revoked key usually resolves itself
- If it persists, verify DB health (volume, disk, locks)
- Re-connect the extension to mint a new key, which replaces dangling state
Example fix
// before await disconnect(); // fire-and-forget, throws on 500 // after const res = await disconnect(); if (!res.ok && res.status !== 500) await reconnect(); // 500 with revoked/missing key is effectively disconnected - drop local key either way clearStoredKey();
Defensive patterns
Strategy: fallback
Type guard
function isDisconnectFailure(d) { return typeof d?.error === 'string' && /disconnect/i.test(d.error); } Try / catch
try { await disconnect(); }
catch (e) {
clearLocalApiKey(); // 500 here often means the key is already gone - clearing local state is the safe end state
if (persistsOnNextConnect()) await reconnect();
} Prevention
- Make disconnect idempotent in the extension client - clearing local state on any outcome
- Debounce the disconnect button to avoid racing duplicate calls
- If 500 persists, re-connect to mint a fresh key and retry disconnect
- Check server logs for the underlying BrowserExtensionApiKey.delete error
When it happens
Trigger: Disconnect clicked twice (second call may already lack a valid key row); database down or locked when deleting the key; middleware and handler disagreeing on the current key after rotation.
Common situations: Retry storms from the extension UI racing multiple disconnects; server storage issues; a key revoked out-of-band (expired/cleanup job) before the user pressed disconnect.
Related errors
- Failed to fetch workspaces
- Community Hub connection key not found
- No Groq API key was set.
- No Minimax API key was set.
- No Mistral API key was set.
AI-assisted analysis of Mintplex-Labs/anything-llm@3aec848f28 (2026-08-18).
Data as JSON: /api/errors/84aa97c23c106708.
Report an issue: GitHub.