Skip to the page

16 open-source AI apps calling Google's Custom Search, read at source

On November 10, 2026 we read 74 open-source projects at their source and checked 28 at their latest commit. 16 AI apps among them call Google's Custom Search JSON API, which Google discontinues on January 1, 2027.

5 of the 16 let a user change Google's address in a setting; 11 hold it in one line of code. Either way, https://api.specstream.ai/customsearch/v1 answers the same call in Google's JSON.

SpecStream costs $5 per 1,000 searches and scores 97.9 F-score on all 1,000 SimpleQA Verified questions. New accounts get $10 of credit, no card, which covers 2,000 searches.

New accounts get $10 of credit, no card. It covers 2,000 searches.

The 16 projects, by stars on November 10, 2026

What changes on SpecStreamStars on Nov 10, 2026The line that holds Google's addressSetting or code
Open WebUI (open-webui/open-webui)One line: google_pse.py, https://www.googleapis.com becomes https://api.specstream.ai. Open WebUI guide158,240backend/open_webui/retrieval/web/google_pse.py line 24One line in the code. No setting changes the address
OmniRoute (cheaper-inference/OmniRoute)One line: searchProviders.ts, https://www.googleapis.com becomes https://api.specstream.ai86,020src/lib/providers/validation/searchProviders.ts line 119, in the check that runs when a Google key is savedOne line in the code. No setting changes the address
LobeHub (lobehub/lobehub)One line: index.ts, https://www.googleapis.com becomes https://api.specstream.ai. LobeHub guide84,621apps/server/src/services/search/impls/google/index.ts line 37, the base that /customsearch/v1 is joined toOne line in the code. No setting changes the address
LiteLLM (BerriAI/litellm)Set env GOOGLE_PSE_API_BASE to https://api.specstream.ai/customsearch/v1 and put a SpecStream key where the Google key goes. LiteLLM guide62,998litellm/llms/google_pse/search/transformation.py line 64, the default of GOOGLE_PSE_API_BASEA setting: env GOOGLE_PSE_API_BASE
AutoGen (microsoft/autogen)One line: google_search.py, https://www.googleapis.com becomes https://api.specstream.ai61,765python/packages/autogen-studio/autogenstudio/gallery/tools/google_search.py line 103, the AutoGen Studio gallery toolOne line in the code. No setting changes the address
LlamaIndex (run-llama/llama_index)One line: base.py, https://www.googleapis.com becomes https://api.specstream.ai52,862llama-index-integrations/tools/llama-index-tools-google/llama_index/tools/google/search/base.py line 11, the GoogleSearchToolSpec URL templateOne line in the code. No setting changes the address
Discourse AI (discourse/discourse)One line: google.rb, https://www.googleapis.com becomes https://api.specstream.ai48,066plugins/discourse-ai/lib/agents/tools/google.rb line 47One line in the code. No setting changes the address
Khoj (khoj-ai/khoj)One line: online_search.py, https://www.googleapis.com becomes https://api.specstream.ai. Khoj guide38,093src/khoj/processor/tools/online_search.py line 362One line in the code. No setting changes the address
GPT Researcher (assafelovic/gpt-researcher)One line: google.py, https://www.googleapis.com becomes https://api.specstream.ai. GPT Researcher guide30,605gpt_researcher/retrievers/google/google.py line 79One line in the code. No setting changes the address
Marvin (PrefectHQ/marvin)One line: deepseek_chat.py, https://www.googleapis.com becomes https://api.specstream.ai6,204examples/deepseek_chat.py line 55, an example fileOne line in the code. No setting changes the address
ScriptCat (scriptscat/scriptcat)One line: web_search.ts, https://www.googleapis.com becomes https://api.specstream.ai5,824src/app/service/agent/core/tools/web_search.ts line 145, the agent's web search toolOne line in the code. No setting changes the address
OpenAgent (the-open-agent/openagent)Set config field ProviderUrl to https://api.specstream.ai/customsearch/v1 and put a SpecStream key where the Google key goes. OpenAgent guide5,741tool/web_search.go line 113, the default when ProviderUrl is emptyA setting: config field ProviderUrl
OpenManus-RL (OpenManus/OpenManus-RL)One line: tool.py, https://www.googleapis.com becomes https://api.specstream.ai4,176openmanus_rl/tools/google_search/tool.py line 54One line in the code. No setting changes the address
Swirl (swirlai/swirl-search)Set url in the SearchProvider JSON to https://api.specstream.ai/customsearch/v1 and put a SpecStream key where the Google key goes. Swirl guide3,049docs/SP-Guide.md line 228, the Google SearchProvider exampleA setting: url in the SearchProvider JSON
Mattermost Agents (mattermost/mattermost-plugin-agents)Set System Console field "API URL (optional)" to https://api.specstream.ai/customsearch/v1 and put a SpecStream key where the Google key goes. Mattermost Agents guide257websearch/google.go line 19, the default when the field is emptyA setting: System Console field "API URL (optional)"
aimux (arcships/aimux)Set provider setting baseUrl to https://api.specstream.ai/customsearch/v1 and put a SpecStream key where the Google key goes. aimux guide243aimux-providers/src/google_pse.rs line 60, the default baseUrlA setting: provider setting baseUrl

What happens to these calls, and the one change

What Google and others offer in its place

How SpecStream scores

The same numbers as the benchmarks page, from the official tasks and scorers.

How to move a project off Google's address

1. Create a key under Agents & API in the workspace. A new account gets $10 of credit, no card, which covers 2,000 searches.

2. If the project has a setting, set it to the address and give it the SpecStream key. For LiteLLM:

export GOOGLE_PSE_API_BASE=https://api.specstream.ai/customsearch/v1
export GOOGLE_PSE_API_KEY=$SPECSTREAM_KEY
# keep GOOGLE_PSE_ENGINE_ID as it is; cx is accepted and not used

3. If the address is in the code, change the line the table names. In Python:

import requests

URL = "https://api.specstream.ai/customsearch/v1"  # was https://www.googleapis.com/customsearch/v1

reply = requests.get(URL, params={"key": SPECSTREAM_KEY, "cx": CX, "q": query, "num": 10}, timeout=20).json()
for item in reply.get("items", []):
    print(item["title"], item["link"], item["snippet"])

In JavaScript:

const url = `https://api.specstream.ai/customsearch/v1?` + new URLSearchParams({ key: SPECSTREAM_KEY, cx, q: query, num: "10" });
const reply = await fetch(url).then((r) => r.json());
for (const item of reply.items ?? []) console.log(item.title, item.link, item.snippet);

4. Leave the parser. Each call is billed as one search on your key, and the key carries the spending limit you give it.

Frequently asked questions

Something we didn't answer? Talk to a human

Which open-source apps use the Google Custom Search API?
On November 10, 2026, 16 open-source AI apps held Google's Custom Search address at their latest commit, from Open WebUI (158,240 stars) to aimux (243). The table names each file and line.
Is Google Programmable Search (PSE) deprecated for self-hosted apps?
Yes. Google closed the Custom Search JSON API to new customers and discontinues it on January 1, 2027, so every self-hosted app that calls it loses its search that day. Pointing the app at https://api.specstream.ai/customsearch/v1 keeps the same call.
Does Open WebUI's Google PSE search stop working after the shutdown?
Yes, on January 1, 2027. Open WebUI holds Google's address on line 24 of google_pse.py, so no setting moves it. Its External web search setting takes https://api.specstream.ai/openwebui/search; the Open WebUI guide has the steps.
How many of these apps let me change the address without code?
5 of 16: LiteLLM, OpenAgent, Swirl, Mattermost Agents and aimux. The other 11 hold the address in one line of code.
What does the replacement cost?
$5 per 1,000 searches of up to 10 results on SpecStream, with no daily limit. A new account gets $10 of credit, no card, which covers 2,000 searches.
Which Custom Search parameters does SpecStream honour?
Nine: q, num, start, hq, exactTerms, orTerms, excludeTerms, siteSearch and siteSearchFilter. cx is accepted and not used.

Sources

SpecStream wrote this page. Each project's line was fetched from GitHub at the commit named in its link, and Google's dates come from Google's own pages.

  1. Google Custom Search JSON API overviewdevelopers.google.com/custom-search/v1/overview, read Nov 10, 2026
  2. Google Programmable Search Engine blog, January 20, 2026programmablesearchengine.googleblog.com/2026/01/updates-to-our-web-search-products.html, read Nov 10, 2026
  3. Agent Search (Vertex AI Search) pricingcloud.google.com/generative-ai-app-builder/pricing, read Nov 10, 2026
  4. Gemini API pricingai.google.dev/gemini-api/docs/pricing, read Nov 10, 2026
  5. Brave Search APIbrave.com/search/api/, read Nov 10, 2026
  6. Brave, Google API shutdown guidebrave.com/learn/google-api-shutdown/, read Nov 10, 2026
  7. Open WebUI, backend/open_webui/retrieval/web/google_pse.py line 24github.com/open-webui/open-webui/blob/b0e6098/backend/open_webui/retrieval/web/google_pse.py#L24, read Nov 10, 2026
  8. OmniRoute, src/lib/providers/validation/searchProviders.ts line 119github.com/cheaper-inference/OmniRoute/blob/1b2b799/src/lib/providers/validation/searchProviders.ts#L119, read Nov 10, 2026
  9. LobeHub, apps/server/src/services/search/impls/google/index.ts line 37github.com/lobehub/lobehub/blob/1f277ab/apps/server/src/services/search/impls/google/index.ts#L37, read Nov 10, 2026
  10. LiteLLM, litellm/llms/google_pse/search/transformation.py line 64github.com/BerriAI/litellm/blob/523b3ef/litellm/llms/google_pse/search/transformation.py#L64, read Nov 10, 2026
  11. AutoGen, python/packages/autogen-studio/autogenstudio/gallery/tools/google_search.py line 103github.com/microsoft/autogen/blob/d07c667/python/packages/autogen-studio/autogenstudio/gallery/tools/google_search.py#L103, read Nov 10, 2026
  12. LlamaIndex, llama-index-integrations/tools/llama-index-tools-google/llama_index/tools/google/search/base.py line 11github.com/run-llama/llama_index/blob/fe107aa/llama-index-integrations/tools/llama-index-tools-google/llama_index/tools/google/search/base.py#L11, read Nov 10, 2026
  13. Discourse AI, plugins/discourse-ai/lib/agents/tools/google.rb line 47github.com/discourse/discourse/blob/9557819/plugins/discourse-ai/lib/agents/tools/google.rb#L47, read Nov 10, 2026
  14. Khoj, src/khoj/processor/tools/online_search.py line 362github.com/khoj-ai/khoj/blob/ae229ca/src/khoj/processor/tools/online_search.py#L362, read Nov 10, 2026
  15. GPT Researcher, gpt_researcher/retrievers/google/google.py line 79github.com/assafelovic/gpt-researcher/blob/ddd4db3/gpt_researcher/retrievers/google/google.py#L79, read Nov 10, 2026
  16. Marvin, examples/deepseek_chat.py line 55github.com/PrefectHQ/marvin/blob/be92af1/examples/deepseek_chat.py#L55, read Nov 10, 2026
  17. ScriptCat, src/app/service/agent/core/tools/web_search.ts line 145github.com/scriptscat/scriptcat/blob/598cab8/src/app/service/agent/core/tools/web_search.ts#L145, read Nov 10, 2026
  18. OpenAgent, tool/web_search.go line 113github.com/the-open-agent/openagent/blob/f233832/tool/web_search.go#L113, read Nov 10, 2026
  19. OpenManus-RL, openmanus_rl/tools/google_search/tool.py line 54github.com/OpenManus/OpenManus-RL/blob/c66d493/openmanus_rl/tools/google_search/tool.py#L54, read Nov 10, 2026
  20. Swirl, docs/SP-Guide.md line 228github.com/swirlai/swirl-search/blob/0506aa5/docs/SP-Guide.md#L228, read Nov 10, 2026
  21. Mattermost Agents, websearch/google.go line 19github.com/mattermost/mattermost-plugin-agents/blob/17fcaa9d/websearch/google.go#L19, read Nov 10, 2026
  22. aimux, aimux-providers/src/google_pse.rs line 60github.com/arcships/aimux/blob/c5a40837/aimux-providers/src/google_pse.rs#L60, read Nov 10, 2026