> SpecStream is the live web data engine for teams and agents. This is the Markdown copy of https://specstream.ai/blog/google-custom-search-api-ends-open-source-apps. Every page, with what SpecStream does and costs: https://specstream.ai/llms.txt

# Google&#x27;s Custom Search API ends January 1, 2027: 16 open-source AI apps still call it | SpecStream

![](https://specstream.ai/blog/covers/google-custom-search-api-ends-open-source-apps.jpg)

# Google's Custom Search API ends January 1, 2027: 16 open-source AI apps still call it

SpecStream

[Search API](https://specstream.ai/blog.md) · Nov 11, 2026 · 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](https://specstream.ai/google-custom-search-api-shutdown.md) 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](https://specstream.ai/google-custom-search-api-open-source-apps.md) 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](https://github.com/open-webui/open-webui) | 158,326 | `backend/open_webui/retrieval/web/google_pse.py` line 24 | A line of code ([guide](https://specstream.ai/google-pse/open-webui.md)) | [#20961](https://github.com/open-webui/open-webui/issues/20961), issue, closed, opened Jan 27, 2026; [#8124](https://github.com/open-webui/open-webui/issues/8124), issue, closed, opened Dec 27, 2024 |
| [OmniRoute](https://github.com/cheaper-inference/OmniRoute) | 86,301 | `src/lib/providers/validation/searchProviders.ts` line 119 | A line of code | [#1984](https://github.com/cheaper-inference/OmniRoute/issues/1984), issue, closed, opened May 5, 2026 |
| [LobeHub](https://github.com/lobehub/lobehub) | 84,873 | `apps/server/src/services/search/impls/google/index.ts` line 37 | A line of code ([guide](https://specstream.ai/web-search/lobehub.md)) | [#19801](https://github.com/lobehub/lobehub/pull/19801), pull request, open, opened Sep 21, 2026 |
| [LiteLLM](https://github.com/BerriAI/litellm) | 63,067 | `litellm/llms/google_pse/search/transformation.py` line 64 | A setting: `GOOGLE_PSE_API_BASE` ([guide](https://specstream.ai/google-pse/litellm.md)) | Nothing found |
| [AutoGen](https://github.com/microsoft/autogen) | 61,778 | `python/packages/autogen-studio/autogenstudio/gallery/tools/google_search.py` line 103 | A line of code | Nothing found |
| [LlamaIndex](https://github.com/run-llama/llama_index) | 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](https://github.com/discourse/discourse) | 48,074 | `plugins/discourse-ai/lib/agents/tools/google.rb` line 47 | A line of code | [#45934](https://github.com/discourse/discourse/pull/45934), our pull request, open, opened Nov 10, 2026 |
| [Khoj](https://github.com/khoj-ai/khoj) | 38,104 | `src/khoj/processor/tools/online_search.py` line 362 | A line of code ([guide](https://specstream.ai/web-search/khoj.md)) | Nothing found |
| [GPT Researcher](https://github.com/assafelovic/gpt-researcher) | 30,621 | `gpt_researcher/retrievers/google/google.py` line 79 | A line of code ([guide](https://specstream.ai/google-pse/gpt-researcher.md)) | Nothing found |
| [Marvin](https://github.com/PrefectHQ/marvin) | 6,204 | `examples/deepseek_chat.py` line 55 | A line of code | Nothing found |
| [ScriptCat](https://github.com/scriptscat/scriptcat) | 5,846 | `src/app/service/agent/core/tools/web_search.ts` line 145 | A line of code | Nothing found |
| [OpenAgent](https://github.com/the-open-agent/openagent) | 5,742 | `tool/web_search.go` line 113 | A setting: `ProviderUrl` ([guide](https://specstream.ai/google-pse/openagent.md)) | Nothing found |
| [OpenManus-RL](https://github.com/OpenManus/OpenManus-RL) | 4,176 | `openmanus_rl/tools/google_search/tool.py` line 54 | A line of code | Nothing found |
| [Swirl](https://github.com/swirlai/swirl-search) | 3,049 | `docs/SP-Guide.md` line 228 | A setting: `url` in the SearchProvider JSON ([guide](https://specstream.ai/google-pse/swirl.md)) | Nothing found |
| [Mattermost Agents](https://github.com/mattermost/mattermost-plugin-agents) | 257 | `websearch/google.go` line 19 | A setting: "API URL (optional)" ([guide](https://specstream.ai/google-pse/mattermost-agents.md)) | [#1058](https://github.com/mattermost/mattermost-plugin-agents/pull/1058), pull request, open, opened Sep 27, 2026 |
| [aimux](https://github.com/arcships/aimux) | 243 | `aimux-providers/src/google_pse.rs` line 60 | A setting: `baseUrl` ([guide](https://specstream.ai/google-pse/aimux.md)) | 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](https://specstream.ai/google-custom-search-api-403.md)) 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](https://specstream.ai/google-custom-search-site-restricted-api.md), 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](https://specstream.ai/google-custom-search-api-python.md) and [JavaScript](https://specstream.ai/google-custom-search-api-javascript.md) pages show the changed request, and [the migration guide](https://specstream.ai/migrate/google-custom-search.md) 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](https://specstream.ai/google-custom-search-api-pricing.md)). There is no limit per key and no daily limit ([Google's limits](https://specstream.ai/google-custom-search-api-limits.md)). 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](https://github.com/specstream/google-custom-search-api-shutdown), so anyone can run the check on a later day.

## Get a key

[Get an API key](https://specstream.ai/signup?src=blog-google-cse-apps&returnTo=%2Fworkspace%2Fsearch%3Froute%3Dgoogle). New accounts get $10 of credit, no card, which covers 2,000 searches.

## More from the blog

[Every post](https://specstream.ai/blog.md)

[![Alabama WARN notices 2026: 31 layoffs, 2,717 workers so far](https://specstream.ai/blog/covers/alabama-warn-layoff-notices-2026.jpg) ### 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](https://specstream.ai/blog/alabama-warn-layoff-notices-2026.md)[![Arizona WARN notices 2026: 50 layoffs, 4,930 workers so far](https://specstream.ai/blog/covers/arizona-warn-layoff-notices-2026.jpg) ### 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](https://specstream.ai/blog/arizona-warn-layoff-notices-2026.md)[![California WARN notices 2026: 1,241 layoffs, 68,459 workers](https://specstream.ai/blog/covers/california-warn-layoff-notices-2026.jpg) ### 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](https://specstream.ai/blog/california-warn-layoff-notices-2026.md)
