# Google Custom Search API Alternatives: What to Use Before the January 2027 Shutdown

Google's Custom Search JSON API, the official way to get Google results as JSON, is closed to new customers, and existing customers "have until January 1, 2027 to transition to an alternative solution" ([Google for Developers](https://developers.google.com/custom-search/v1/overview)). Google points site-search users to Vertex AI Search, which covers "up to 50 domains," and asks anyone who needs full-web results to contact it. Microsoft retired the Bing Search APIs on August 11, 2025. So in late 2026, a team that needs web search results in code has four realistic options: Vertex AI Search for site search, a SERP API that returns the live Google results page, an independent-index search API built for AI, or a model's built-in search grounding. This guide compares each Google Custom Search API alternative, maps Custom Search parameters to Massive's Search endpoint, and lists what to test before you switch.

> **Key Takeaways**
>
> - The Custom Search JSON API is **closed to new sign-ups** and stops serving on **January 1, 2027**. Existing "Search the entire web" engines keep working until that date ([Programmable Search Help](https://support.google.com/programmable-search/answer/12397162)).
> - Google's suggested replacement, **Vertex AI Search**, is "a favorable alternative for searching up to 50 domains." It isn't a full-web search API.
> - The **Bing Search APIs** were retired on August 11, 2025. Microsoft points users to Grounding with Bing Search inside Azure AI Agents ([Microsoft Learn](https://learn.microsoft.com/en-us/lifecycle/announcements/bing-search-api-retirement)).
> - A **SERP API** returns the actual Google results page. Massive's Search endpoint does this from a chosen country, region, or city, up to 10 pages per call, and can wait for the AI Overview to load. It returns rendered HTML, so you parse it yourself.
> - Custom Search capped you at 10 results per call and 100 per query, and `gl` only "boosts" a country's results. Check how your code depends on those limits before you migrate.

## Is the Google Custom Search JSON API being discontinued?

Yes. Google's developer overview now opens with this notice: "The Custom Search JSON API is closed to new customers." It goes on: "Existing Custom Search JSON API customers have until January 1, 2027 to transition to an alternative solution." Pricing applies "until the service discontinuation on January 1, 2027" ([Google for Developers](https://developers.google.com/custom-search/v1/overview)).

The change started earlier for whole-web search. Google's Programmable Search help page says that "as of January 20, 2026, Programmable Search Engine is transitioning to more focused solutions," and that an engine already set to "Search the entire web" "will remain unaffected and can continue to use this option until January 1, 2027" ([Programmable Search Help](https://support.google.com/programmable-search/answer/12397162)). A separate, smaller product, the Site Restricted JSON API, already stopped serving on January 8, 2025 ([Google for Developers](https://developers.google.com/custom-search/v1/site_restricted_api)).

Until the shutdown, the old terms still apply: 100 free queries a day, then $5 per 1,000 queries, up to 10,000 a day ([Google for Developers](https://developers.google.com/custom-search/v1/overview)).

![Timeline of official search API shutdowns. January 8, 2025: Google Site Restricted JSON API stops serving. August 11, 2025: Bing Search APIs retired. January 20, 2026: whole-web search limited to existing Programmable Search engines. January 1, 2027: Custom Search JSON API discontinued for everyone.](assets/search-api-timeline.png "Official web search APIs, ended or ending.")

## What does Google recommend instead?

Google names two paths on the same page. "Vertex AI Search is a favorable alternative for searching up to 50 domains. Alternatively, if your use case necessitates full web search, contact us to express your interest in and get more information about our full web search solution" ([Google for Developers](https://developers.google.com/custom-search/v1/overview)). It also publishes a [migration guide from Custom Search to Vertex AI Search](https://cloud.google.com/generative-ai-app-builder/docs/migrate-from-cse).

That works well if you used Custom Search as a search box for your own sites. It doesn't cover the other common use: getting Google's results for any query across the whole web, for rank tracking, research, monitoring, or an AI agent's search step.

## What are the alternatives to the Google Custom Search API?

| Option | What you get | Best for | Watch for |
|---|---|---|---|
| **Vertex AI Search** (Google Cloud) | Search over your own sites and data, up to 50 domains | Site search and enterprise search | Not a whole-web search API |
| **Google full-web search** (by request) | Google's whole-web solution, terms on request | Teams that need an official Google contract | Availability and pricing aren't published |
| **SERP APIs**, including Massive's Search endpoint | The live Google results page for a query, from a chosen location | Rank tracking, SEO, AI Overview monitoring, localized results | You parse the page; results vary by location, by design |
| **Independent-index search APIs** (Brave Search API, Seltz, Exa) | Results from the provider's own web index, as JSON | AI agents and retrieval-augmented generation (RAG) that need fast, citable web knowledge | Not Google's ranking |
| **Model grounding** (Gemini's Grounding with Google Search, Grounding with Bing Search) | A model answer with citations, searched for you | Chat features where you want the answer, not the result list | You don't get a raw result list to store or rank |

Which one fits depends on what your code did with Custom Search results. If it displayed links to people, any row can work. If it measured Google, such as ranking, SERP features, or how results differ by country, only a SERP API returns the thing you are measuring. If an agent read the results to answer a question, an independent index or model grounding is often faster; our guide to [giving AI agents live web access](https://www.joinmassive.com/blog/how-to-give-ai-agents-live-web-access) covers that design. Our [Seltz spotlight](https://www.joinmassive.com/blog/seltz-web-search-api-for-llm) and [comparison of web search APIs for AI agents](https://www.joinmassive.com/blog/web-search-apis-for-ai-agents-compared-seltz-exa-brave-and-render-apis) cover that side.

## Getting Google search results with Massive's Search endpoint

Massive's Search endpoint "delivers all organic and paid result types from popular search engines" and accepts `GET` requests to `/search` on the Web Render host, with a Bearer token ([Massive Docs](https://docs.joinmassive.com/web-render/search)). Google is the default engine. A localized request looks like this:

<div data-block="html"><div style="background:#011627;border:1px solid rgba(250,244,236,0.08);border-radius:10px;margin:1.5rem 0;"><div style="padding:10px 18px 0;font-family:'JetBrains Mono',monospace;font-size:11px;letter-spacing:0.08em;color:rgba(214,222,235,0.6);">BASH</div><pre style="margin:0;padding:10px 18px 16px;background:transparent;color:#d6deeb;font-family:'JetBrains Mono',monospace;font-size:13px;line-height:1.65;white-space:pre-wrap;overflow-wrap:anywhere;overflow-x:visible;"><code>curl -H "Authorization: Bearer $MASSIVE_TOKEN" \
  'https://render.joinmassive.com/search'\
'?terms=residential+proxy'\
'&amp;country=US&amp;city=Chicago'\
'&amp;size=20&amp;awaiting=ai'</code></pre></div></div>

That asks for 20 results for "residential proxy" as a searcher in Chicago would see them, waiting up to one minute for an AI Overview to render. Live searches "take an average of a few seconds," with up to 3 minutes allowed per call for retries ([Massive Docs](https://docs.joinmassive.com/web-render/search)). Search requests start at 1 base credit each; see [Massive pricing](https://docs.joinmassive.com/web-render/pricing) for current rates.

The [Web Search](https://www.joinmassive.com/web-search) product page has an overview. The main difference from Custom Search is the response. Custom Search returned JSON items. Massive returns the results page as rendered HTML, and when you ask for several pages, "the HTML of each page will be separated from the next by an empty line." You get the full page, including ads, the AI Overview, and "People also ask" when you request them. In exchange, you need a parser. Here is a starting point that pulls titles and links from organic results:

<div data-block="html"><div style="background:#011627;border:1px solid rgba(250,244,236,0.08);border-radius:10px;margin:1.5rem 0;"><div style="padding:10px 18px 0;font-family:'JetBrains Mono',monospace;font-size:11px;letter-spacing:0.08em;color:rgba(214,222,235,0.6);">PYTHON</div><pre style="margin:0;padding:10px 18px 16px;background:transparent;color:#d6deeb;font-family:'JetBrains Mono',monospace;font-size:13px;line-height:1.65;white-space:pre-wrap;overflow-wrap:anywhere;overflow-x:visible;"><code>from bs4 import BeautifulSoup
def organic_results(html):
    soup = BeautifulSoup(html, "html.parser")
    out, seen = [], set()
    for h3 in soup.find_all("h3"):
        a = h3.find_parent("a")
        href = a.get("href", "") if a else ""
        if href.startswith("http") and href not in seen:
            seen.add(href)
            out.append({"title": h3.get_text(" ", strip=True), "url": href})
    return out</code></pre></div></div>

We tested it against a fixture with nested headings, a duplicate link, an internal link, and a heading with no link; all cases passed. Google changes its markup from time to time, so save a few real responses as test fixtures and run them in CI. If you need the AI Overview or "People also ask" text, our guide to [getting Google AI Overviews into your search results](https://www.joinmassive.com/blog/search-ai-overviews-paa) covers the `awaiting` options.

## Custom Search parameters mapped to Massive's Search endpoint

| Custom Search JSON API | Massive Search | Note |
|---|---|---|
| `q` | `terms` | Up to 255 characters, URL-encoded |
| `cx` (engine ID) | none | Searches the whole web; no engine to configure |
| `siteSearch` | `site:` inside `terms` | Same operator a person would type |
| `num` (1 to 10) | `size` (0 to 100) | Results per page, up to 100 per the docs |
| `start` (`start + num` max 100) | `offset` (0 to 100), `serps` (1 to 10 pages) | Up to 10 results pages per call |
| `gl` (boosts a country's results) | `country`, plus `subdivision` and `city` | Searches from a device in that location |
| `hl` / `lr` | `display` / `language` | Interface and search language |
| `dateRestrict` | none | Use Google's own date operators in `terms`, or filter downstream |
| JSON `items` | Rendered HTML | Parse the page; see the parser above |

Sources: [Custom Search reference](https://developers.google.com/custom-search/v1/reference/rest/v1/cse/list), [Massive Search reference](https://docs.joinmassive.com/web-render/reference/search).

Two rows change what your data means, not just how you ask for it. Custom Search's `gl` "boosts" results from a country, while `country` in Massive sends the search from a device in that country, so the page reflects what local searchers see. And Custom Search never returned more than 100 results for a query, while Massive's docs allow up to 10 results pages per call. Google itself controls how many results a page holds, so check real responses for your queries. If a dashboard was built around a 100-result ceiling, expect it to look different.

## What we saw when we tested the endpoints without a key

On October 19, 2026, we sent unauthenticated requests to each endpoint and to Google directly, to see what a migration script will hit first.

| Request | Response |
|---|---|
| Custom Search JSON API, no key | `403 PERMISSION_DENIED`: "Method doesn't allow unregistered callers" |
| Custom Search JSON API, invalid key | `400 INVALID_ARGUMENT`: "API key not valid. Please pass a valid API key." |
| Massive Search, no token | `401 Unauthorized`: "Authorization header must be provided" |
| Plain HTTP request (browser user agent, no JavaScript) to a Google results page | `200`, but a JavaScript-required page with no result headings |

The last row shows one reason SERP APIs exist. A simple HTTP fetch of a Google results URL returned a page that needs JavaScript to run, with zero `<h3>` result titles in it. Getting the real page takes a browser that renders it from a location, which is the work a SERP API does for you.

## How do you migrate off the Custom Search API?

1. **List what your code uses.** Find every call, and note which fields you read (`items[].link`, `title`, `snippet`, `searchInformation`).
2. **Decide what you actually need.** Site search, Google's live ranking, or general web knowledge for an agent. That decides the row in the alternatives table.
3. **Map parameters.** Use the table above. Pay special attention to `gl` versus a real location, and to the 10 and 100 result limits.
4. **Replace JSON with a parser** if you move to a SERP API. Keep saved responses as fixtures so a markup change fails a test, not a dashboard.
5. **Run both side by side** for a week on your real queries, and compare counts, top results, and latency.
6. **Switch before January 1, 2027.** After that date, Custom Search calls stop working.

## Frequently Asked Questions

### Is the Google Custom Search API being shut down?

Yes. Google closed the Custom Search JSON API to new customers, and existing customers must move to another solution by January 1, 2027, when the service is discontinued.

### Is there a free Google search API?

Not for whole-web result lists. Custom Search's 100 free daily queries are closed to new customers. Gemini's [Grounding with Google Search](https://ai.google.dev/gemini-api/docs/google-search) has a free tier, but it returns a model answer with citations, not a list of results. Vertex AI Search is billed through Google Cloud.

### What is the best alternative to the Google Custom Search JSON API?

It depends on the job. For searching your own sites, Google recommends Vertex AI Search. For live Google results from specific locations, use a SERP API such as Massive's Search endpoint. For AI agents that need fast web knowledge, an independent-index API like Seltz or Brave can fit better.

### Does Google have a search API?

Google's Custom Search JSON API is still running for existing customers until January 1, 2027, and Google says it offers a full-web search solution on request. For site search, it offers Vertex AI Search. There is no new self-serve API for whole-web Google results.

### Can I get Google results as JSON with Massive?

Massive's Search endpoint returns the Google results page as rendered HTML, not JSON. Parse it with a library such as BeautifulSoup to extract titles, links, and other result types.

## The bottom line

- Custom Search stops working on January 1, 2027, and it already refuses new sign-ups. If your product depends on it, schedule the migration now.
- Pick the replacement by job: Vertex AI Search for your own sites, a SERP API for Google's live results by location, an independent index or grounding for agent knowledge.
- Moving to a SERP API means parsing HTML and getting real location targeting. Test with saved fixtures and run both systems side by side first.

## Sources

- Google for Developers, ["Custom Search JSON API: Overview"](https://developers.google.com/custom-search/v1/overview)
- Google for Developers, ["Method: cse.list"](https://developers.google.com/custom-search/v1/reference/rest/v1/cse/list)
- Programmable Search Engine Help, ["Search the entire web and transition options"](https://support.google.com/programmable-search/answer/12397162)
- Google Cloud, ["Migrate from Custom Search to Vertex AI Search"](https://cloud.google.com/generative-ai-app-builder/docs/migrate-from-cse)
- Microsoft Learn, ["Bing Search APIs Retiring on August 11, 2025"](https://learn.microsoft.com/en-us/lifecycle/announcements/bing-search-api-retirement)
- Google AI for Developers, ["Grounding with Google Search"](https://ai.google.dev/gemini-api/docs/google-search)
- Massive Docs, ["Search"](https://docs.joinmassive.com/web-render/search), ["Search API reference"](https://docs.joinmassive.com/web-render/reference/search), and ["Pricing"](https://docs.joinmassive.com/web-render/pricing)
- Massive, unauthenticated request test of Custom Search, Massive Search, and google.com, October 19, 2026 (first-party test)
