<!-- twin of https://specstream.ai/google-custom-search-api-open-source-apps -->
# 16 open-source AI apps calling Google's Custom Search, read at source

Read on Nov 10, 2026. The page: https://specstream.ai/google-custom-search-api-open-source-apps

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.

[Get an API key](https://specstream.ai/signup?src=alternatives-google-custom-search-api-open-source-apps&utm_source=alternatives-md&utm_campaign=google-custom-search-api-open-source-apps&returnTo=%2Fworkspace%2Fsearch%3Froute%3Dgoogle) 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](https://specstream.ai/google-pse/open-webui?utm_source=alternatives&utm_campaign=google-custom-search-api-open-source-apps) | 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](https://specstream.ai/web-search/lobehub?utm_source=alternatives&utm_campaign=google-custom-search-api-open-source-apps) | 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](https://specstream.ai/google-pse/litellm?utm_source=alternatives&utm_campaign=google-custom-search-api-open-source-apps) | 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](https://specstream.ai/web-search/khoj?utm_source=alternatives&utm_campaign=google-custom-search-api-open-source-apps) | 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](https://specstream.ai/google-pse/gpt-researcher?utm_source=alternatives&utm_campaign=google-custom-search-api-open-source-apps) | 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](https://specstream.ai/google-pse/openagent?utm_source=alternatives&utm_campaign=google-custom-search-api-open-source-apps) | 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](https://specstream.ai/google-pse/swirl?utm_source=alternatives&utm_campaign=google-custom-search-api-open-source-apps) | 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](https://specstream.ai/google-pse/mattermost-agents?utm_source=alternatives&utm_campaign=google-custom-search-api-open-source-apps) | 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](https://specstream.ai/google-pse/aimux?utm_source=alternatives&utm_campaign=google-custom-search-api-open-source-apps) | 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](https://specstream.ai/benchmarks?utm_source=alternatives&utm_campaign=google-custom-search-api-open-source-apps) 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](https://specstream.ai/extract-api?utm_source=alternatives&utm_campaign=google-custom-search-api-open-source-apps) at $0.80 per 1,000 pages, and a page with no text is not charged. [Deep Search](https://specstream.ai/deep-search?utm_source=alternatives&utm_campaign=google-custom-search-api-open-source-apps) 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](https://specstream.ai/migrate/google-custom-search?utm_source=alternatives&utm_campaign=google-custom-search-api-open-source-apps), and Google's dates on [the shutdown page](https://specstream.ai/google-custom-search-api-shutdown?utm_source=alternatives&utm_campaign=google-custom-search-api-open-source-apps).

## 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 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

### 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](https://specstream.ai/google-pse/open-webui?utm_source=alternatives&utm_campaign=google-custom-search-api-open-source-apps) 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.

- [Google Custom Search JSON API overview](https://developers.google.com/custom-search/v1/overview), read Nov 10, 2026
- [Google Programmable Search Engine blog, January 20, 2026](https://programmablesearchengine.googleblog.com/2026/01/updates-to-our-web-search-products.html), read Nov 10, 2026
- [Agent Search (Vertex AI Search) pricing](https://cloud.google.com/generative-ai-app-builder/pricing), read Nov 10, 2026
- [Gemini API pricing](https://ai.google.dev/gemini-api/docs/pricing), read Nov 10, 2026
- [Brave Search API](https://brave.com/search/api/), read Nov 10, 2026
- [Brave, Google API shutdown guide](https://brave.com/learn/google-api-shutdown/), read Nov 10, 2026
- [Open WebUI, backend/open_webui/retrieval/web/google_pse.py line 24](https://github.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 119](https://github.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 37](https://github.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 64](https://github.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 103](https://github.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 11](https://github.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 47](https://github.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 362](https://github.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 79](https://github.com/assafelovic/gpt-researcher/blob/ddd4db3/gpt_researcher/retrievers/google/google.py#L79), read Nov 10, 2026
- [Marvin, examples/deepseek_chat.py line 55](https://github.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 145](https://github.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 113](https://github.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 54](https://github.com/OpenManus/OpenManus-RL/blob/c66d493/openmanus_rl/tools/google_search/tool.py#L54), read Nov 10, 2026
- [Swirl, docs/SP-Guide.md line 228](https://github.com/swirlai/swirl-search/blob/0506aa5/docs/SP-Guide.md#L228), read Nov 10, 2026
- [Mattermost Agents, websearch/google.go line 19](https://github.com/mattermost/mattermost-plugin-agents/blob/17fcaa9d/websearch/google.go#L19), read Nov 10, 2026
- [aimux, aimux-providers/src/google_pse.rs line 60](https://github.com/arcships/aimux/blob/c5a40837/aimux-providers/src/google_pse.rs#L60), read Nov 10, 2026
