DEV Community

Tarek Etman for SpecStream

Posted on Originally published at specstream.ai

Google's Custom Search JSON API ends on January 1, 2027. 25,024 GitHub files still point at it.

If your code calls https://www.googleapis.com/customsearch/v1, it has until January 1, 2027. Google's Custom Search JSON API overview says the API is closed to new customers, and that existing customers have until that date to move to an alternative. Google announced it on its Programmable Search Engine blog on January 20, 2026.

We build SpecStream, and our API answers this call.

What Google changed

From the same overview page and the January 20 blog post:

  • New customers cannot get a key. The page says the API "is not available for new customers."
  • Existing customers keep paying $5 per 1,000 queries after 100 free a day, up to 10,000 queries a day, until the service is discontinued on January 1, 2027.
  • For full web search, the page asks you to contact Google to express interest. What stays is the Programmable Search Element, for search on your own websites, with at most 50 domains.

How much code still holds the address

On November 10, 2026 we ran GitHub code search for the two addresses the API answers on. You can run the same queries:

"googleapis.com/customsearch/v1"
"customsearch.googleapis.com"
Enter fullscreen mode Exit fullscreen mode

GitHub reported 25,024 files holding the first and 5,992 holding the second. Those are files that hold the address, not repositories, and not confirmed live calls: the results include generated client libraries, docs and tests. The first 1,000 results of each query came from 1,371 distinct public repositories. GitHub stops a query at 1,000 results, so the real number of repositories is higher.

Bing shows what happens to that code after the date. Microsoft retired the Bing Search APIs on August 11, 2025. Fifteen months later, the same search on November 10, 2026 still found 6,048 files holding Bing's address:

"api.bing.microsoft.com/v7.0/search"
Enter fullscreen mode Exit fullscreen mode

The replacement Microsoft named, Grounding with Bing Search, is a tool inside Azure AI Agents that returns a model's answer with citations, at $14 per 1,000 transactions. Microsoft's documentation says developers have no access to the raw results it returns, so code that parsed a result list has no list to read.

The one changed line

SpecStream answers GET /customsearch/v1 on Google's own path and replies in Google's JSON. Point the base address at https://api.specstream.ai, put a SpecStream key where the Google key was, and leave the rest. Your code can keep sending cx; it is accepted and not used.

Python, google-api-python-client

Before:

from googleapiclient.discovery import build

service = build("customsearch", "v1", developerKey=GOOGLE_API_KEY)
res = service.cse().list(q="open source vector databases", cx=CX).execute()
Enter fullscreen mode Exit fullscreen mode

After:

from googleapiclient.discovery import build

service = build("customsearch", "v1", developerKey=SPECSTREAM_API_KEY, client_options={"api_endpoint": "https://api.specstream.ai"})
res = service.cse().list(q="open source vector databases", cx=CX).execute()
Enter fullscreen mode Exit fullscreen mode

Node, googleapis

Before:

const { google } = require("googleapis");

const customsearch = google.customsearch({ version: "v1", auth: GOOGLE_API_KEY });
const res = await customsearch.cse.list({ q: "open source vector databases", cx: CX });
Enter fullscreen mode Exit fullscreen mode

After:

const { google } = require("googleapis");

const customsearch = google.customsearch({ version: "v1", auth: SPECSTREAM_API_KEY, rootUrl: "https://api.specstream.ai/" });
const res = await customsearch.cse.list({ q: "open source vector databases", cx: CX });
Enter fullscreen mode Exit fullscreen mode

Plain HTTP

Before:

curl "https://www.googleapis.com/customsearch/v1?key=$GOOGLE_KEY&cx=$CX&q=open+source+vector+databases"
Enter fullscreen mode Exit fullscreen mode

After:

curl "https://api.specstream.ai/customsearch/v1?key=$SPECSTREAM_KEY&cx=$CX&q=open+source+vector+databases"
Enter fullscreen mode Exit fullscreen mode

The reply has Google's fields where your parser looks for them: kind is customsearch#search, results are in items[] with title, link, snippet and displayLink, and searchInformation.totalResults and queries.nextPage are in place.

We ran Google's own client libraries against production on November 10, 2026, 111 calls in all: google-api-python-client 2.201.0 and googleapis 189.0.0 for Node. Both work with the one changed line and the key, and both cse.list and cse.siterestrict.list answer. Thirty calls in a row through the Python client, one a second, all returned 200, with a median of 0.48 s and a p90 of 0.77 s.

Parameters

q, num, start, siteSearch, exactTerms, orTerms and hq work as they do on Google. A call that pages with start and reads queries.nextPage runs as before.

Price

$5 per 1,000 searches, the rate Google charges its existing customers today. A call of up to 10 results costs $0.005. There is no cap of 10,000 a day, so search 10,001 is answered like the first. A new account gets $10 of credit with no card, which covers 2,000 searches.

It is the most accurate web search API in the world: 97.9 F-score on all 1,000 SimpleQA Verified questions, with the method on our benchmarks page at specstream.ai/benchmarks.

Before January 1

Search your own code for customsearch/v1 and customsearch.googleapis.com, then change the line shown above wherever they appear. The full migration guide covers the parameters, the reply fields and where the key can go.

Get a SpecStream key with $10 of credit and run your first call today.

Top comments (0)