{"record":{"id":"094d264adc752bfc","repo":"Mintplex-Labs/anything-llm","slug":"failed-to-create-api-key","errorCode":null,"errorMessage":"Failed to create API key","messagePattern":"Failed to create API key","errorType":"http","errorClass":null,"httpStatus":500,"severity":"error","filePath":"server/endpoints/browserExtension.js","lineNumber":190,"sourceCode":"    }\n  );\n\n  app.post(\n    \"/browser-extension/api-keys/new\",\n    [validatedRequest, flexUserRoleValid([ROLES.admin, ROLES.manager])],\n    async (request, response) => {\n      try {\n        const user = await userFromSession(request, response);\n        const { apiKey, error } = await BrowserExtensionApiKey.create(\n          user?.id || null\n        );\n        if (error) throw new Error(error);\n        response.status(200).json({\n          apiKey: apiKey.key,\n        });\n      } catch (error) {\n        console.error(error);\n        response.status(500).json({ error: \"Failed to create API key\" });\n      }\n    }\n  );\n\n  app.delete(\n    \"/browser-extension/api-keys/:id\",\n    [validatedRequest, flexUserRoleValid([ROLES.admin, ROLES.manager])],\n    async (request, response) => {\n      try {\n        const { id } = request.params;\n        const user = await userFromSession(request, response);\n\n        if (multiUserMode(response) && user.role !== ROLES.admin) {\n          const apiKey = await BrowserExtensionApiKey.get({\n            id: parseInt(id),\n            user_id: user?.id,\n          });\n          if (!apiKey) {","sourceCodeStart":172,"sourceCodeEnd":208,"githubUrl":"https://github.com/Mintplex-Labs/anything-llm/blob/3aec848f2885144aa8f1e53b9731a04310d5d558/server/endpoints/browserExtension.js#L172-L208","documentation":"500 from POST /browser-extension/api-keys/new. BrowserExtensionApiKey.create either throws or returns {error}, which the handler re-throws; key generation (uuid/crypto) almost never fails, so this is an INSERT failure into browser_extension_api_keys - locked DB (SQLITE_BUSY from a concurrent write), missing table after partial migration, or a full/read-only disk.","triggerScenarios":"Two admins creating/deleting keys at the same instant so one INSERT hits SQLITE_BUSY; table missing after a failed upgrade; container disk exhausted or volume mounted read-only.","commonSituations":"Multi-tab admin UIs racing writes; low-disk containers; backups locking the SQLite file at the wrong moment.","solutions":["Read server logs - the re-thrown Error carries the create() error string (e.g. 'database is locked').","Retry the create after a few seconds; SQLITE_BUSY is transient.","Free disk space / fix volume permissions if the error is IO-related.","If the table is missing, restart so migrations re-run."],"exampleFix":null,"handlingStrategy":"retry","validationCode":"if (!await isAdminSession()) throw new Error('Only admin/manager sessions can create keys');","typeGuard":null,"tryCatchPattern":"for (let attempt = 1; attempt <= 3; attempt++) {\n  try { return await createExtensionApiKey(); }\n  catch (e) {\n    if (e.status !== 500) throw e;\n    await sleep(400 * attempt); // SQLITE_BUSY on INSERT is transient\n  }\n}\nthrow new Error('Key creation failed after retries - check server logs');","preventionTips":["Serialize admin key-management actions instead of racing multiple tabs.","Keep container disk space and volume write permissions healthy."],"tags":["api-keys","browser-extension","http-500","sqlite","insert"],"backgroundTag":"database-insert-failed","analyzedSha":"3aec848f2885144aa8f1e53b9731a04310d5d558","analyzedAt":"2026-08-18T10:02:21.017Z","schemaVersion":2},"datasetVersion":"2026-08-21T18:17:14.833Z"}