{"record":{"id":"c36b5bf3af6a85d8","repo":"Mintplex-Labs/anything-llm","slug":"res-status-res-statustext-params-json-c36b5b","errorCode":null,"errorMessage":"${res.status} - ${res.statusText}. params: ${JSON.stringify({ auth: this.middleTruncate(process.env.AGENT_SERPER_DEV_KEY, 5), q: query })}","messagePattern":"(.+?) - (.+?)\\. params: (.+?)\\)\\}","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"server/utils/agents/aibitat/plugins/web-browsing.js","lineNumber":527,"sourceCode":"              `${this.caller}: Using Serper.dev to search for \"${\n                query.length > 100 ? `${query.slice(0, 100)}...` : query\n              }\"`\n            );\n            const { response, error } = await fetch(\n              \"https://google.serper.dev/search\",\n              {\n                method: \"POST\",\n                headers: {\n                  \"X-API-KEY\": process.env.AGENT_SERPER_DEV_KEY,\n                  \"Content-Type\": \"application/json\",\n                },\n                body: JSON.stringify({ q: query }),\n                redirect: \"follow\",\n              }\n            )\n              .then((res) => {\n                if (res.ok) return res.json();\n                throw new Error(\n                  `${res.status} - ${res.statusText}. params: ${JSON.stringify({ auth: this.middleTruncate(process.env.AGENT_SERPER_DEV_KEY, 5), q: query })}`\n                );\n              })\n              .then((data) => {\n                return { response: data, error: null };\n              })\n              .catch((e) => {\n                this.super.handlerProps.log(`Serper.dev Error: ${e.message}`);\n                return { response: null, error: e.message };\n              });\n            if (error)\n              return `There was an error searching for content. ${error}`;\n\n            const data = [];\n            if (response.hasOwnProperty(\"knowledgeGraph\"))\n              data.push(response.knowledgeGraph);\n            response.organic?.forEach((searchResult) => {\n              const { title, link, snippet } = searchResult;","sourceCodeStart":509,"sourceCodeEnd":545,"githubUrl":"https://github.com/Mintplex-Labs/anything-llm/blob/526360e320da9d1b36074be5ed64fe76e5bbfbbd/server/utils/agents/aibitat/plugins/web-browsing.js#L509-L545","documentation":"Thrown by the Serper.dev provider when a POST to https://google.serper.dev/search returns a non-OK status. Authentication uses the AGENT_SERPER_DEV_KEY in the X-API-KEY header. The error message includes the status code, status text, a middle-truncated key, and the query. The .catch logs 'Serper.dev Error' and returns a failure string.","triggerScenarios":"Serper.dev returns 401 (invalid X-API-KEY), 402 (free credits exhausted — Serper uses a credit system), 429 (rate limit), 400 (malformed body), or 5xx. An unset AGENT_SERPER_DEV_KEY sends an empty X-API-KEY header, always triggering 401.","commonSituations":"Free tier (2,500 credits) exhausted; key never configured; key revoked; redirect chain broken (redirect: 'follow' fails); concurrent searches exceeding the per-second rate limit.","solutions":["Verify AGENT_SERPER_DEV_KEY is set in the environment and matches an active key from serper.dev.","A 402 specifically means credits are depleted — top up or switch plans on the Serper dashboard.","A 401 means the key is wrong or unset — check the truncated value in the error.","For 429, reduce the frequency of agent searches or implement backoff."],"exampleFix":"// before\nheaders: { \"X-API-KEY\": process.env.AGENT_SERPER_DEV_KEY, ... },\n\n// caller-side fix — validate before the request\nif (!process.env.AGENT_SERPER_DEV_KEY) {\n  return \"AGENT_SERPER_DEV_KEY is not configured.\";\n}","handlingStrategy":"validation","validationCode":"if (!process.env.AGENT_SERPER_DEV_KEY) {\n  throw new Error(\"AGENT_SERPER_DEV_KEY is not set. Configure it to use Serper.dev.\");\n}","typeGuard":null,"tryCatchPattern":"try {\n  const results = await serperSearch(query);\n  return results;\n} catch (e) {\n  if (e.message.includes(\"402\")) {\n    return \"Serper.dev credits exhausted. Top up at serper.dev.\";\n  }\n  if (e.message.startsWith(\"401\")) {\n    return \"Serper.dev API key invalid. Check AGENT_SERPER_DEV_KEY.\";\n  }\n  throw e;\n}","preventionTips":["Confirm AGENT_SERPER_DEV_KEY is set before enabling Serper.dev search.","Monitor credit balance (free tier is 2,500 searches).","Handle 402 as a billing/credits issue distinct from 401 auth failures.","Use the redirect: 'follow' option carefully — verify the final URL is the Serper endpoint."],"tags":["serper-dev","web-search","http","api-key","rate-limit","agent-tool"],"backgroundTag":null,"analyzedSha":"526360e320da9d1b36074be5ed64fe76e5bbfbbd","analyzedAt":"2026-08-13T01:45:47.170Z","schemaVersion":2},"datasetVersion":"2026-08-13T04:17:16.726Z"}