Custom Search JSON API

Google Custom Search JSON API alternative: migrate before January 1, 2027

Google has closed the Custom Search JSON API to new customers and is shutting it down for everyone on January 1, 2027. Semscraper collects the real Google results page, rendered in a browser, up to 10 pages per keyword, about 100 results depending on the query, pay as you go with prepaid credits and no subscription.

  • The real Google SERP, not a reduced index
  • Up to 10 pages per keyword
  • 1,000 one-page searches for €0.30
  • 1,000 free SERPs
  • No credit card

What Google announced, and when

According to Google's documentation (developers.google.com/custom-search/v1/overview and the Programmable Search Engine help center), read on October 10, 2026.

Since January 20, 2026

New Programmable Search Engines are limited to 50 chosen domains: the "Search the entire web" option is no longer offered. Existing engines that use it keep it until January 1, 2027.

Closed to new customers

A new project can no longer enable the Custom Search JSON API. For searching up to 50 domains, Google points to Vertex AI Search; full web search has to be requested from Google.

January 1, 2027

End of the Custom Search JSON API for existing customers. Any application still calling it must have migrated.

Where Semscraper is a good fit

Semscraper is not a drop-in clone of Custom Search: it is an API that collects the Google page as a searcher sees it. It replaces some uses well, not all of them.

Yes: tracking Google

Rank tracking, competitive monitoring, SERP research, AI Overviews: you get the real results of google.com, google.fr or any other country, city and device included.

Yes: feeding tools and agents

Datasets, enrichment, agents and RAG pipelines that need what Google actually shows. Processing is asynchronous: expect about twenty seconds of collection per search, not an instant answer.

No: your own site search

A search box that must answer in a fraction of a second over your own pages calls for a site search engine, or for Vertex AI Search, which Google offers for up to 50 domains.

Custom Search JSON API vs Semscraper: the differences

TopicCustom Search JSON APISemscraper
Where results come fromYour Programmable Search Engine. Even set to the entire web, Google states it only covers part of its index and emphasizes your own sites.The real Google results page, rendered in a real browser.
ContentA list of web results, without Google Search features (Oneboxes, universal search).Every block on the page: organic results, ads, local pack, People Also Ask, AI Overviews with their sources, and more.
Number of results10 per request, 100 at most when paginating (start + num cannot exceed 100).Up to 10 Google pages in a single call, about 100 results depending on the query.
Country, language, city, devicegl boosts results from a country, hl sets the interface language, lr and cr filter documents.Google version (country and language), city or GPS coordinates, desktop or mobile.
How it worksSynchronous: the answer comes back in the call.Asynchronous: you create searches (up to 1,000 per call), then fetch results by ID or receive them on a callback URL. About twenty seconds of collection in median for one page, about fifty for 10, plus the wait in your account's queue (measured on 12 million SERPs, 5.3 million one-page and 260,000 ten-page, September 12 to October 10, 2026).
Price100 free queries per day, then $5 per 1,000, up to 10,000 per day.€0.30 per 1,000 one-page searches, €2.10 per 1,000 ten-page searches. No subscription, no daily cap, and your balance never expires.
Searching specific domainsYes, it is now the only mode for new engines (50 domains).No saved list of domains: the site: operator in the keyword restricts a search to one domain.
Image searchYes (searchType=image).No. Only the Images block, when Google shows it on the results page, is returned.

Adapting the parameters

The parameters are not interchangeable: here is how to adapt your calls. Google operators go through unchanged in the keyword.

Custom SearchSemscraper
qkeyword
gllocation, the Google version, which is not a country code: gl=us becomes location=en (google.com), gl=fr becomes location=fr (google.fr)
hllanguage, which forms a valid pair with location: en/en, fr/fr, de/de...
num, startdepth, from 1 to 10 Google pages, all returned by the same call
siteSearchsite:example.com in the keyword
exactTermsQuotes in the keyword
excludeTerms-word in the keyword
fileTypefiletype:pdf in the keyword
lr, crNo direct equivalent: choose the Google version and language
searchType=imageNo equivalent
key, cxA single API key, sent in the Authorization: Bearer header

Migrating a call, step by step

The same need in Python: the top 10 organic results for a query on google.com. The main difference is the two-step flow, create then fetch.

Before: Custom Search JSON API
import requests

r = requests.get("https://www.googleapis.com/customsearch/v1", params={
    "key": "GOOGLE_API_KEY",
    "cx": "SEARCH_ENGINE_ID",
    "q": "running shoes",
    "gl": "us",
    "hl": "en",
    "num": 10,
})
for item in r.json().get("items", []):
    print(item["link"], item["title"], item["snippet"])
After: Semscraper
import time
import requests

API = "https://api.semscraper.com/v1/serp"
HEADERS = {"Authorization": "Bearer API_KEY"}

# 1. create the search (up to 1,000 keywords per call)
r = requests.post(API, headers=HEADERS, timeout=60, json=[{
    "search_engine": "google_search",
    "keyword": "running shoes",
    "location": "en",
    "language": "en",
    "device": "desktop",
    "depth": 1,
}])
r.raise_for_status()
ids = [row["id"] for row in r.json()["data"]]

# 2. fetch the results once ready (about 20 s of collection for a depth-1 search,
#    plus queue time), 10 minutes at most
deadline = time.time() + 600
while ids and time.time() < deadline:
    time.sleep(10)
    r = requests.get(API, headers=HEADERS, timeout=60,
                     params={"ids": ",".join(ids[:100]), "output": "json"})  # 100 IDs per call
    r.raise_for_status()
    for row in r.json()["data"]:
        if row["status"] != "done":
            continue
        ids.remove(row["id"])
        for block in row["results"]:
            if block["type"] == "organic":
                for item in block["items"]:
                    print(item["url"], item["title"], item["description"])

if ids:
    print("Still pending, fetch them later by ID:", ids)

The link field becomes url, snippet becomes description. Each result also carries its rank within its block (rank_type), its rank on the page (rank_serp), its Google page and its pixel position. For thousands of keywords: create them in batches of 1,000, fetch results in batches of 100 IDs, or receive them on a callback URL. See the Bulk SERP API.

Switch over in four steps

A migration takes some preparation: allow a few days of testing before you turn the old API off.

1. Test

Run your representative queries with the 1,000 free SERPs you get at sign-up.

2. Adapt

Parameters (gl becomes location), the move to asynchronous calls, and response fields (link becomes url, snippet becomes description).

3. Compare

Relevance, result coverage, turnaround and consumption, on a sample of your real queries.

4. Switch

Move your application to Semscraper once the results are validated, well before January 1, 2027.

What it costs, for the same volume

Public prices: Google checked on October 10, 2026, Semscraper at the standard rate, before top-up discounts.

NeedCustom Search JSON APISemscraper
1,000 keywords, 1 page (about 10 results)$5 (1,000 paid queries, outside the daily free quota)€0.30
1,000 keywords, 10 pages (about 100 results)$50 (10 paid queries per keyword, outside the daily free quota)€2.10
More than 10,000 queries a dayNot possible: capped at 10,000 per dayNo daily cap

If the day's 100 free queries have not been used yet, count $4.50 and $49.50. The Custom Search JSON API is no longer available to new customers: these prices only apply to existing accounts, until January 1, 2027. Semscraper detailed pricing.

FAQ

Frequently asked questions

When does the Custom Search JSON API shut down?
It is closed to new customers, and Google states that existing customers have until January 1, 2027 to move to another solution.
Does Semscraper return the same results as Custom Search?
No, and that is often the point: Custom Search queries your Programmable Search Engine, which only covers part of Google's index. Semscraper returns the real Google results page, with every block, for the country, language, city and device you choose.
Can I restrict searches to my domains?
For one domain, add site:yourdomain.com to the keyword. There is no saved list of domains as in a Programmable Search Engine. For internal search over your own sites, a site search engine or Vertex AI Search is a better fit.
Is the answer instant?
No. Each page is rendered in a real browser: expect a median of about twenty seconds of collection for one page, about fifty for 10 pages. Median collection time measured on 12 million SERPs (5.3 million one-page and 260,000 ten-page) from September 12 to October 10, 2026; add the wait in your account's queue, which depends on the volume you send. You fetch the result by its ID, or we post it to your callback URL.
What does Semscraper cost after migrating?
There is no subscription and no access fee: you pay for each search you create, €0.30 per 1,000 for the first page. Fetching results is free. 1,000 SERPs are free at sign-up to test your queries.

Test your queries before the deadline

1,000 free SERPs, no credit card required.