
Google's Custom Search API ends January 1, 2027: 16 open-source AI apps still call it
SpecStream
Search API · · 6 min read
On November 11, 2026, 51 days before Google discontinues the Custom Search JSON API, we read the 16 open-source AI apps that call it at their default branch, and all 16 still hold Google's address in the code. None has merged a change that removes or re-points the call, and only 4 have an issue or pull request about the ending opened by anyone outside SpecStream.
Together the 16 have 649,530 GitHub stars. They include Open WebUI, LobeHub, LiteLLM, AutoGen, LlamaIndex, and Discourse.
Google's overview page says the 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." A self-hoster who installs one of these apps today cannot turn on its Google search: the same page says "This API is not available for new customers." An install that works now, on a key made before the API closed, calls an API that Google has ended from January 1. The shutdown page has the dates and Google's wording.
The 16 apps, by stars on November 11, 2026
Stars are GitHub's count on November 11, 2026. The file and line are on each project's default branch that day. The full table quotes every line of code.
| Project | Stars on Nov 11, 2026 | Where Google's address sits | Setting or code | In public about the ending |
|---|---|---|---|---|
| Open WebUI | 158,326 | backend/open_webui/retrieval/web/google_pse.py line 24 |
A line of code (guide) | #20961, issue, closed, opened Jan 27, 2026; #8124, issue, closed, opened Dec 27, 2024 |
| OmniRoute | 86,301 | src/lib/providers/validation/searchProviders.ts line 119 |
A line of code | #1984, issue, closed, opened May 5, 2026 |
| LobeHub | 84,873 | apps/server/src/services/search/impls/google/index.ts line 37 |
A line of code (guide) | #19801, pull request, open, opened Sep 21, 2026 |
| LiteLLM | 63,067 | litellm/llms/google_pse/search/transformation.py line 64 |
A setting: GOOGLE_PSE_API_BASE (guide) |
Nothing found |
| AutoGen | 61,778 | python/packages/autogen-studio/autogenstudio/gallery/tools/google_search.py line 103 |
A line of code | Nothing found |
| LlamaIndex | 52,869 | llama-index-integrations/tools/llama-index-tools-google/llama_index/tools/google/search/base.py line 11 |
A line of code | Nothing found |
| Discourse AI | 48,074 | plugins/discourse-ai/lib/agents/tools/google.rb line 47 |
A line of code | #45934, our pull request, open, opened Nov 10, 2026 |
| Khoj | 38,104 | src/khoj/processor/tools/online_search.py line 362 |
A line of code (guide) | Nothing found |
| GPT Researcher | 30,621 | gpt_researcher/retrievers/google/google.py line 79 |
A line of code (guide) | Nothing found |
| Marvin | 6,204 | examples/deepseek_chat.py line 55 |
A line of code | Nothing found |
| ScriptCat | 5,846 | src/app/service/agent/core/tools/web_search.ts line 145 |
A line of code | Nothing found |
| OpenAgent | 5,742 | tool/web_search.go line 113 |
A setting: ProviderUrl (guide) |
Nothing found |
| OpenManus-RL | 4,176 | openmanus_rl/tools/google_search/tool.py line 54 |
A line of code | Nothing found |
| Swirl | 3,049 | docs/SP-Guide.md line 228 |
A setting: url in the SearchProvider JSON (guide) |
Nothing found |
| Mattermost Agents | 257 | websearch/google.go line 19 |
A setting: "API URL (optional)" (guide) | #1058, pull request, open, opened Sep 27, 2026 |
| aimux | 243 | aimux-providers/src/google_pse.rs line 60 |
A setting: baseUrl (guide) |
Nothing found |
The lines do different jobs. In Open WebUI, Khoj, and GPT Researcher the line is the web search call itself. In OmniRoute it is the check that runs when a user saves a Google key, in AutoGen it is the tool in the AutoGen Studio gallery, and in Marvin it is an example file. In the five apps with a setting, the line is the default the app uses when the setting is empty.
What the projects have in public
Three issues asked what replaces the API, and all three are closed. In Open WebUI, #8124 reported the API's move to Vertex Search in December 2024, and #20961 quoted Google's note that the API is closed to new customers in January 2026. In OmniRoute, #1984 reported a 403 PERMISSION_DENIED for new Google projects in May 2026 (what that 403 means) and asked for documentation or another provider.
Two open pull requests, LobeHub #19801 and Mattermost Agents #1058, add another paid search provider beside Google. Both keep the Google provider, and neither changes where the Google call goes.
We opened discourse/discourse#45934 on November 10, 2026. It makes the address of the Discourse AI Google tool a site setting, so an admin can point the tool at another service that serves the same API.
For the other 11 projects, the search found nothing about the ending.
The change in each app
Five of the 16 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). Set it to https://api.specstream.ai/customsearch/v1 and put a SpecStream key where the Google key went.
The other 11 hold https://www.googleapis.com in the line the table names, and that one line becomes https://api.specstream.ai. A maintainer who changes it, or reads the address from a setting, moves every user of the project with the next release.
The call is the same call with a new host and key:
# 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 path, the parameters, and the parser stay. The reply has kind customsearch#search, items[] with title, link, snippet, and displayLink, searchInformation.totalResults, and queries.nextPage. The route honors nine parameters: q, num, start, hq, exactTerms, orTerms, excludeTerms, siteSearch, and siteSearchFilter. siteSearch keeps a search to one site, and the route also answers the call of Google's Site Restricted JSON API, which stopped on January 8, 2025. cx is accepted and not used, and the key goes in key=, in X-Goog-Api-Key, or as a Bearer token.
For code that builds the call itself, the Python and JavaScript pages show the changed request, and the migration guide covers the move step by step.
A search of up to 10 results costs $0.005, which is $5 per 1,000 searches, the rate Google charges existing customers (Google's pricing). There is no limit per key and no daily limit (Google's limits). The SpecStream Search API is the most accurate web search API in the world: it scores 97.9 F-score on all 1,000 official SimpleQA Verified questions.
How we read the code
On November 10, 2026 we read 74 open-source projects at their source, checked 28 at their latest commit, and kept the 16 AI apps that call the API. On November 11 we read each of the 16 at its default branch and searched its GitHub issues and pull requests for six phrases about the ending; discussions were not searched. The 16 rows and a script that reads each file again are on GitHub, so anyone can run the check on a later day.
Get a key
Get an API key. New accounts get $10 of credit, no card, which covers 2,000 searches.
More from the blog
Every post
Alabama WARN notices 2026: 31 layoffs, 2,717 workers so far
Alabama has 31 WARN notices for 2,717 workers in 2026, the latest filed November 2
Nov 10, 2026 · SpecStream · 3 min read

Arizona WARN notices 2026: 50 layoffs, 4,930 workers so far
Arizona has 50 WARN notices for 4,930 workers in 2026, the latest filed October 29
Nov 10, 2026 · SpecStream · 3 min read

California WARN notices 2026: 1,241 layoffs, 68,459 workers
California logged 1,241 WARN notices for 68,459 workers through November 4, 2026
Nov 10, 2026 · SpecStream · 3 min read