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 SpecStream | Stars on Nov 10, 2026 | The line that holds Google's address | Setting or code | |
|---|---|---|---|---|
| Open WebUI (open-webui/open-webui) | One line: google_pse.py, https://www.googleapis.com becomes https://api.specstream.ai. Open WebUI guide | 158,240 | backend/open_webui/retrieval/web/google_pse.py line 24 | One 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.ai | 86,020 | src/lib/providers/validation/searchProviders.ts line 119, in the check that runs when a Google key is saved | One 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 guide | 84,621 | apps/server/src/services/search/impls/google/index.ts line 37, the base that /customsearch/v1 is joined to | One 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 guide | 62,998 | litellm/llms/google_pse/search/transformation.py line 64, the default of GOOGLE_PSE_API_BASE | A setting: env GOOGLE_PSE_API_BASE |
| AutoGen (microsoft/autogen) | One line: google_search.py, https://www.googleapis.com becomes https://api.specstream.ai | 61,765 | python/packages/autogen-studio/autogenstudio/gallery/tools/google_search.py line 103, the AutoGen Studio gallery tool | One 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.ai | 52,862 | llama-index-integrations/tools/llama-index-tools-google/llama_index/tools/google/search/base.py line 11, the GoogleSearchToolSpec URL template | One 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.ai | 48,066 | plugins/discourse-ai/lib/agents/tools/google.rb line 47 | One 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 guide | 38,093 | src/khoj/processor/tools/online_search.py line 362 | One 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 guide | 30,605 | gpt_researcher/retrievers/google/google.py line 79 | One 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.ai | 6,204 | examples/deepseek_chat.py line 55, an example file | One 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.ai | 5,824 | src/app/service/agent/core/tools/web_search.ts line 145, the agent's web search tool | One 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 guide | 5,741 | tool/web_search.go line 113, the default when ProviderUrl is empty | A setting: config field ProviderUrl |
| OpenManus-RL (OpenManus/OpenManus-RL) | One line: tool.py, https://www.googleapis.com becomes https://api.specstream.ai | 4,176 | openmanus_rl/tools/google_search/tool.py line 54 | One 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 guide | 3,049 | docs/SP-Guide.md line 228, the Google SearchProvider example | A 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 guide | 257 | websearch/google.go line 19, the default when the field is empty | A 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 guide | 243 | aimux-providers/src/google_pse.rs line 60, the default baseUrl | A setting: provider setting baseUrl |
What happens to these calls, and the one change
5 settings and 11 lines of code
5 projects read Google's address from a setting: LiteLLM (GOOGLE_PSE_API_BASE), OpenAgent (ProviderUrl), Swirl (url in the SearchProvider JSON), Mattermost Agents ("API URL (optional)") and aimux (baseUrl). A self-hoster sets it to https://api.specstream.ai/customsearch/v1 and puts a SpecStream key where the Google key goes.
The other 11 hold https://www.googleapis.com in the line the table names. A maintainer changes that line, or reads the address from a setting, and every user of the project moves with the next release.
What happens on January 1, 2027
Google's overview page says the Custom Search JSON API is closed to new customers and that "Existing Custom Search JSON API customers have until January 1, 2027 to transition to an alternative solution." Its pricing applies "until the service discontinuation on January 1, 2027." From that day each line in the table calls an API that Google has ended. A new user of any of these projects cannot get a Google key today.
The same call, answered in Google's JSON
Change the host and the key. The path, the parameters and the parser stay.
# Before
curl "https://www.googleapis.com/customsearch/v1?key=$GOOGLE_KEY&cx=$CX&q=open+source+vector+databases"
# After
curl "https://api.specstream.ai/customsearch/v1?key=$SPECSTREAM_KEY&cx=$CX&q=open+source+vector+databases"The reply has kind customsearch#search, items[] with title, link, snippet and displayLink, searchInformation.totalResults and queries.nextPage. The route honours nine parameters: q, num, start, hq, exactTerms, orTerms, excludeTerms, siteSearch and siteSearchFilter. cx is accepted and not used, and the key goes in key=, in X-Goog-Api-Key or as a Bearer token.
$5 per 1,000 searches, with no daily cap
A search of up to 10 results costs $0.005, the rate Google charges existing customers, and there is no limit per key and no daily limit. A busy call answers 429 with Retry-After and is not charged. Credit you buy never expires, and a new account gets $10 of credit, no card.
The most accurate web search API in the world
The SpecStream Search API scores 97.9 F-score on all 1,000 official SimpleQA Verified questions, 978 of them correct, and 64.0 item F1 and 43.4 row F1 on all 200 official WideSearch tasks. The scores and the method are on the benchmarks page.
About one second a search
The Custom Search route runs on the fast search. On November 9, 2026 production answered 718 of 720 searches at 1 to 20 a second, with a median of 0.82 s at 1 a second and 1.07 s at 20 a second.
Search, pages and rows on one key
The same key reads pages with the Extract API at $0.80 per 1,000 pages, and a page with no text is not charged. Deep Search takes a request in plain words and returns every match on the live web as rows at 5¢, 15¢ or $1 a row. A key made with zero_retention keeps no request text and no answer after the reply.
How the list was made
On November 10, 2026 GitHub code search found 25,024 public files that contain googleapis.com/customsearch/v1. We read the 74 projects with the most stars among them and opened 28 at their latest commit. Stars are GitHub's count that day; for Mattermost Agents and aimux they are the count from the code search scan.
The table keeps the 16 AI apps whose latest commit holds Google's address in a line we fetched and quoted. It leaves out projects that reach Google only through a library (langchain-google-community, google-api-python-client), a documentation search widget, tools that are not AI apps, and the 46 projects not opened at a commit. It does not cover private code or forks. The full call and reply are on the migration guide, and Google's dates on the shutdown page.
What Google and others offer in its place
Vertex AI Search (Agent Search)
Google's named alternative, for up to 50 domains, at $1.50 per 1,000 queries on Standard and $4.00 on Enterprise, plus data storage. It answers a different endpoint in a Google Cloud project. SpecStream searches the whole live web on the path these apps already call.
Grounding with Google Search
A Gemini API tool at $14 per 1,000 search requests on Gemini 3 and newer models. It returns the model's grounded answer, while these apps parse a list of results. SpecStream returns the list, at $5 per 1,000, for any model.
Brave Search API
A search API on Brave's own index at $5 per 1,000 requests, with $5 in free credits every month. Brave's own guide says the move means swapping the endpoint and updating how you read the response. On SpecStream the reply is Google's JSON, so each app's parser stays.
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 used3. 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?
Is Google Programmable Search (PSE) deprecated for self-hosted apps?
https://api.specstream.ai/customsearch/v1 keeps the same call.Does Open WebUI's Google PSE search stop working after the shutdown?
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?
What does the replacement cost?
Which Custom Search parameters does SpecStream honour?
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.
- Google Custom Search JSON API overviewdevelopers.google.com/custom-search/v1/overview, read Nov 10, 2026
- Google Programmable Search Engine blog, January 20, 2026programmablesearchengine.googleblog.com/2026/01/updates-to-our-web-search-products.html, read Nov 10, 2026
- Agent Search (Vertex AI Search) pricingcloud.google.com/generative-ai-app-builder/pricing, read Nov 10, 2026
- Gemini API pricingai.google.dev/gemini-api/docs/pricing, read Nov 10, 2026
- Brave Search APIbrave.com/search/api/, read Nov 10, 2026
- Brave, Google API shutdown guidebrave.com/learn/google-api-shutdown/, read Nov 10, 2026
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- Marvin, examples/deepseek_chat.py line 55github.com/PrefectHQ/marvin/blob/be92af1/examples/deepseek_chat.py#L55, read Nov 10, 2026
- 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
- OpenAgent, tool/web_search.go line 113github.com/the-open-agent/openagent/blob/f233832/tool/web_search.go#L113, read Nov 10, 2026
- 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
- Swirl, docs/SP-Guide.md line 228github.com/swirlai/swirl-search/blob/0506aa5/docs/SP-Guide.md#L228, read Nov 10, 2026
- Mattermost Agents, websearch/google.go line 19github.com/mattermost/mattermost-plugin-agents/blob/17fcaa9d/websearch/google.go#L19, read Nov 10, 2026
- 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




