ScavioScavio
Pricing
Tools
Sign InsGet Startedg

Show sections

  • Migrate: change the host
  • Drop-in endpoint
  • Parameter map
  • Response field map
  • Cost per 1,000
  • From Bing
  • Why switch?
  • Closed to new customers, and retiring on January 1, 2027
  • The limits CSE users were already escaping
  • Waiting until late 2026 to migrate is its own risk
  • Best alternatives
  • Scavio
  • SerpAPI
  • Serper
  • SearchAPI
  • Feature comparison
  • When to stay
  • How we compare
  • FAQ
  1. Home
  2. Alternatives
  3. Google Custom Search JSON API

Ranking the Top 4 Google Custom Search JSON API Alternatives for AI Agents

Written by Scavio TeamLast updated: October 2026

Google Custom Search JSON API Alternatives

The best Google Custom Search JSON API alternative in 2026 is Scavio ($30/mo, 50 free signup credits) — one API for 50+ platforms, including Google, YouTube, Amazon, Reddit, TikTok, Instagram and LinkedIn. Below, we compare 4 alternatives on pricing, platform coverage, output quality, and developer experience.

Try Scavio FreePricing

Skip to the 10-minute migration guide: every parameter and field mapped, with before/after code.

Summarize this article with

ChatGPTPerplexityGrokClaude

Pricing and features here are checked against each vendor's public docs. See our methodology.

TLDR: Google Custom Search JSON API Alternatives

#ToolPriceBest For
1Scavio$30/mo, 50 free signup creditsAgents needing the full SERP anatomy, not just basic organic results
2SerpAPI$25/mo (1,000 searches), 250 free searches/moMulti-engine diversity beyond just Google
3Serper$50 for 50,000 credits (no subscription), 2,500 free queriesHigh-volume Google SERP at the lowest per-query cost
4SearchAPI$40/mo (10,000 searches), 100 free requestsStructured SERP across Google, Bing, and Baidu

This comparison draws on each vendor's public pricing and documentation plus feedback from developer communities. Figures were last checked in 2026 -- verify current pricing on each vendor's site.

The Google Custom Search JSON API is closed to new customers, and existing customers have until January 1, 2027 to move off it. Google's own pages point JSON API users to Vertex AI Search for up to 50 domains, or to a sales-led full web search solution, and neither returns the same response schema. That gives every CSE integration a hard deadline to pick a Google Custom Search API alternative. The migration itself is smaller than it sounds: modern SERP APIs return response shapes close to CSE's items array, so switching is usually one endpoint swap and one field rename. This page compares the four best migration targets for the programmable search engine api replacement decision, starting with Scavio, the closest like-for-like match, with honest coverage of what each one costs, what it adds beyond CSE, and where it falls short.

Google Custom Search JSON API replacement: change the host, keep your code

To replace the Google Custom Search JSON API, keep your code and change two things: the host, from www.googleapis.com to api.scavio.dev, and the key, to your Scavio key. Scavio's GET /customsearch/v1 takes the same cse.list parameters and returns the same customsearch#search response, items[] with title, link, snippet and displayLink, searchInformation and queries.nextPage, and Google's own client works with client_options api_endpoint. Each search costs 1 credit, $2 per 1,000 on the Growth plan billed yearly, against CSE's $5.

  1. 1

    Get a key (1 minute)

    Sign up at the Scavio dashboard. The 50 free credits need no card and are enough to run your real production queries through both APIs and diff them.

  2. 2

    Change the host and key (2 minutes)

    Point https://www.googleapis.com/customsearch/v1 at https://api.scavio.dev/customsearch/v1 and send your Scavio key as key=. With Google's Python client, pass client_options={"api_endpoint": "https://api.scavio.dev"}. Your parser, your nextPage loop and your item fields stay as they are.

  3. 3

    Check the few parameters that behave differently (3 minutes)

    cx is accepted but ignored, so a site-restricted engine becomes siteSearch (enforced on the results) or site: operators in q. Image search, sort and rights return 400 instead of being silently dropped. The table below marks every one of the 30 cse.list parameters.

  4. 4

    Diff, then cut over (3 minutes, then let it run)

    Run both side by side on a sample of production queries, compare the links you keep, and switch the flag. CSE keeps answering existing customers until January 1, 2027, so the rollback path stays open while you watch. When you want the knowledge graph, AI Overview or People Also Ask, move that call to POST /api/v2/google.

Step 1: the drop-in, same request and same response

Scavio serves the Custom Search request at Google's own path, GET /customsearch/v1 (and /customsearch/v1/siterestrict), so the diff is the host and the key. The Python versions below were run against the live endpoint on 2026-10-13, and the response panel is that capture, trimmed.

Before: Custom Search JSON API
import requests

GOOGLE_API_KEY = "AIza..."
SEARCH_ENGINE_ID = "0123456789abcdef0"  # your engine (cx)

resp = requests.get(
    "https://www.googleapis.com/customsearch/v1",
    params={"key": GOOGLE_API_KEY, "cx": SEARCH_ENGINE_ID, "q": "how to make cold brew coffee", "num": 3},
    timeout=30,
)
resp.raise_for_status()
data = resp.json()
for item in data.get("items", []):
    print(item["title"], item["link"], item["snippet"])
next_start = data["queries"].get("nextPage", [{}])[0].get("startIndex")
After: Scavio /customsearch/v1
import requests

SCAVIO_API_KEY = "sk_live_your_key"  # dashboard.scavio.dev -> API keys
SEARCH_ENGINE_ID = "0123456789abcdef0"  # accepted and ignored; results come from the whole web

resp = requests.get(
    "https://api.scavio.dev/customsearch/v1",
    params={"key": SCAVIO_API_KEY, "cx": SEARCH_ENGINE_ID, "q": "how to make cold brew coffee", "num": 3},
    timeout=60,
)
resp.raise_for_status()
data = resp.json()
for item in data.get("items", []):
    print(item["title"], item["link"], item["snippet"])
next_start = data["queries"].get("nextPage", [{}])[0].get("startIndex")
200 response.jsoncaptured
{
  "kind": "customsearch#search",
  "queries": {
    "request": [
      {
        "title": "Google Custom Search - how to make cold brew coffee",
        "totalResults": "108",
        "searchTerms": "how to make cold brew coffee",
        "count": 3,
        "startIndex": 1,
        "inputEncoding": "utf8",
        "outputEncoding": "utf8",
        "safe": "off",
        "cx": "017576662512468239146:omuauf_lfve"
      }
    ],
    "nextPage": [
      {
        "title": "Google Custom Search - how to make cold brew coffee",
        "totalResults": "108",
        "searchTerms": "how to make cold brew coffee",
        "count": 3,
        "startIndex": 4,
        "inputEncoding": "utf8",
        "outputEncoding": "utf8",
        "safe": "off",
        "cx": "017576662512468239146:omuauf_lfve"
      }
    ]
  },
  "searchInformation": {
    "searchTime": 0.31,
    "formattedSearchTime": "0.31",
    "totalResults": "108",
    "formattedTotalResults": "108"
  },
  "items": [
    {
      "kind": "customsearch#result",
      "title": "how do you guys make cold brew? : r/Coffee",
      "htmlTitle": "how do you guys make cold brew? : r/Coffee",
      "link": "https://www.reddit.com/r/Coffee/comments/oi7rm7/how_do_you_guys_make_cold_brew/",
      "displayLink": "www.reddit.com",
      "snippet": "i wanna learn how to make cold brew coffee but theres a lot of ways to make it, what ways do you guys go about it?",
      "htmlSnippet": "i wanna learn how to make cold brew coffee but theres a lot of ways to make it, what ways do you guys go about it?",
      "formattedUrl": "https://www.reddit.com/r/Coffee/comments/oi7rm7/how_do_you_guys_make_cold_brew/",
      "htmlFormattedUrl": "https://www.reddit.com/r/Coffee/comments/oi7rm7/how_do_you_guys_make_cold_brew/"
    },
    {
      "kind": "customsearch#result",
      "title": "A Preferred Way to Make Cold Brewed Coffee",
      "htmlTitle": "A Preferred Way to Make Cold Brewed Coffee",
      "link": "https://coffeegeek.com/blog/techniques/a-preferred-way-to-make-cold-brewed-coffee/",
      "displayLink": "coffeegeek.com",
      "snippet": "Mar 27, 2024 — You'll need: 250ML (1 Cup) by visual measure of coffee beans, medium-coarsely ground; 946mL (4 Cups) water; 2 large glass jars or pitchers, ...",
      "htmlSnippet": "Mar 27, 2024 — You&#39;ll need: <b>250ML (1 Cup) by visual measure of coffee beans, medium-coarsely ground</b>; 946mL (4 Cups) water; 2 large glass jars or pitchers, ...",
      "formattedUrl": "https://coffeegeek.com/blog/techniques/a-preferred-way-to-make-cold-brewed-coffee/",
      "htmlFormattedUrl": "https://coffeegeek.com/blog/techniques/a-preferred-way-to-make-cold-brewed-coffee/"
    }
  ],
  "scavio": {
    "credits_used": 1,
    "credits_remaining": 34506,
    "cached": false,
    "response_time": 4196
  }
}
  • num (1-10) and start (1-based) work as in CSE, and start + num cannot exceed 100, so a while-nextPage loop costs what it cost on CSE.
  • siteSearch is added as site: and also enforced on the results, so a page can come back with fewer items than num when Google loosens site:. It still costs 1 credit.
  • Errors use Google's error envelope (error.code, error.errors[0].reason) with Scavio's HTTP status: 401 for a bad key, 402 when out of credits, 429 for plan concurrency.
  • The response adds one scavio object with credits_used and credits_remaining. CSE parsers ignore it.

Every parameter, field and error code: Google Custom Search compatible API docs.

Want the full SERP? Move a call to /api/v2/google

Before and after, in the three forms most CSE integrations take, for when you want what CSE never returned: the knowledge graph, AI Overview, People Also Ask and ads. The Scavio versions were run against a captured /api/v2/google response with the HTTP call mocked, and the Python one against the live API; the response panel is that capture, trimmed.

Before: Custom Search JSON API
import requests

GOOGLE_API_KEY = "AIza..."
SEARCH_ENGINE_ID = "0123456789abcdef0"  # your engine (cx): developer.mozilla.org + stackoverflow.com

resp = requests.get(
    "https://www.googleapis.com/customsearch/v1",
    params={
        "key": GOOGLE_API_KEY,
        "cx": SEARCH_ENGINE_ID,
        "q": "abortcontroller fetch timeout",
        "gl": "us",
        "hl": "en",
        "start": 1,
    },
    timeout=30,
)
resp.raise_for_status()
data = resp.json()
for item in data.get("items", []):
    print(item["title"], item["link"], item["snippet"])
next_start = data["queries"].get("nextPage", [{}])[0].get("startIndex")
After: Scavio /api/v2/google
from urllib.parse import urlparse

import requests

SCAVIO_API_KEY = "sk_live_your_key"  # dashboard.scavio.dev -> API keys


def google_search(q, start=1, gl="us", hl="en", **extra):
    """Same call shape and same item fields your Custom Search code already reads."""
    resp = requests.post(
        "https://api.scavio.dev/api/v2/google",
        headers={"Authorization": f"Bearer {SCAVIO_API_KEY}"},
        # CSE's start is 1-based (1, 11, 21); Scavio's is a 0-based offset (0, 10, 20)
        json={"query": q, "start": start - 1, "gl": gl, "hl": hl, **extra},
        timeout=60,
    )
    resp.raise_for_status()
    data = resp.json()
    items = [
        {
            "title": r.get("title", ""),
            "link": r["link"],
            "snippet": r.get("snippet", ""),  # a few results carry no snippet
            "displayLink": urlparse(r["link"]).netloc,
        }
        for r in data.get("organic_results", [])
        if r.get("link")
    ]
    out = {
        "items": items,
        "searchInformation": {
            "totalResults": str(data.get("search_information", {}).get("total_results", 0)),
        },
        "queries": {},
    }
    if data.get("pagination", {}).get("next"):
        out["queries"]["nextPage"] = [{"startIndex": start + 10}]
    return out


data = google_search("site:developer.mozilla.org OR site:stackoverflow.com abortcontroller fetch timeout")
for item in data["items"]:
    print(item["title"], item["link"], item["snippet"])
next_start = data["queries"].get("nextPage", [{}])[0].get("startIndex")
200 response.jsoncaptured
{
  "search_parameters": {
    "q": "site:developer.mozilla.org OR site:stackoverflow.com abortcontroller fetch timeout",
    "hl": "en",
    "gl": "us",
    "device": "desktop",
    "start": 0,
    "google_domain": "google.com"
  },
  "search_information": {
    "query_displayed": "site:developer.mozilla.org OR site:stackoverflow.com abortcontroller fetch timeout",
    "total_results": 734,
    "time_taken_displayed": 0.31
  },
  "organic_results": [
    {
      "position": 1,
      "title": "AbortSignal: timeout() static method - Web APIs | MDN",
      "link": "https://developer.mozilla.org/en-US/docs/Web/API/AbortSignal/timeout_static",
      "displayed_link": "https://developer.mozilla.org › ... › AbortSignal",
      "source": "MDN Web Docs",
      "snippet": "Sep 1, 2026 — The AbortSignal.timeout() static method returns an AbortSignal that will automatically abort after a specified time."
    },
    {
      "position": 2,
      "title": "Fetch API request timeout? - javascript",
      "link": "https://stackoverflow.com/questions/46946380/fetch-api-request-timeout",
      "displayed_link": "10+ answers · 8 years ago",
      "source": "Stack Overflow",
      "snippet": "Recently implemented a solution for abort fetch with AbortController, AbortController is the best way to handle timeouts in fetch api, theres ..."
    }
  ],
  "pagination": {
    "current": 0,
    "next": "https://google.com/search?q=...&start=10"
  },
  "credits_used": 1
}

Every CSE request parameter, mapped

Every request parameter of the Custom Search JSON API (cse.list): what the drop-in /customsearch/v1 does with it, and what to send to /api/v2/google instead. On the drop-in, every parameter is either honoured or rejected with a 400 naming it; none is silently dropped. On /api/v2/google, "Query operator" means you write it into the query string, the way you would type it into Google.

CSE parameterScavio /customsearch/v1 (drop-in)Scavio /api/v2/googleNotes
keySame: ?key= with your Scavio key (an Authorization: Bearer header also works).Authorization: Bearer <key> headerRenamedOn /api/v2/google the key goes in the header, never the URL.
qSame.queryRenamedUp to 500 characters. Google operators work inside it.
cxAccepted and echoed, ignored. Results come from the whole web; use siteSearch.site: operators in queryQuery operatorThere is no engine to point at. An engine that searched the whole web needs nothing; one with a site list becomes site:a.com OR site:b.com. Refinements, weighting, promotions and synonyms you configured in the control panel have no equivalent.
num (1-10)Same: 1-10, sliced from one Google page, so items can be fewer.noneNo equivalentOne request returns one Google results page, usually 7-10 organic results because SERP features take some slots. Slice the list if you need fewer. A num key is accepted and ignored.
start (1-based)Same: 1-based; start + num cannot exceed 100.start (0-based offset)RenamedCSE 1, 11, 21 is Scavio 0, 10, 20. Scavio allows up to 990; CSE stops at 100 results.
glSame.glSameTwo-letter country code, lowercase.
hlSame.hlSameInterface language, e.g. en or zh-TW.
lrSame.lrSamelang_en, lang_ja and so on.
crSame; Boolean expressions over 20 characters return 400.crSamecountryUS style. One value; CSE's Boolean combinations are not supported.
safeSame: active or off.safe: "active"Sameactive filters explicit results. For off, omit the field.
filterSame.filterSame"0" turns off duplicate and omitted-result filtering, "1" keeps it.
dateRestrictSame: d1/w1/m1/y1 map to Google's time filter, other windows to after:.time_period, or after: operatorRenamedd1, w1, m1, y1 become last_day, last_week, last_month, last_year (last_hour also exists). For other windows such as d3 or m6, put after:YYYY-MM-DD in the query.
siteSearch + siteSearchFilter=iSame, and enforced on the results (off-site items are dropped).site:example.com in queryQuery operatorGoogle honors it for most domains. In a 2026-10-13 test one large documentation domain came back mostly off-site, so if a strict allowlist matters, also filter on the result host.
siteSearch + siteSearchFilter=eSame, enforced on the results.-site:example.com in queryQuery operator
exactTermsSame."exact phrase" in queryQuery operator
excludeTermsSame.-term in queryQuery operator
orTermsSame.a OR b in queryQuery operator
hqSame.append the terms to queryQuery operator
fileTypeAdds filetype:<ext> to the query. Google usually honours it; not enforced on the returned results.filetype:pdf in queryQuery operatorGoogle usually honours filetype:, but not always; check the link extension if it must be strict.
googlehostSame.google_domainRenamede.g. google.co.uk. Deprecated in CSE, supported here.
c2coffAccepted and ignored.noneNo equivalentChinese simplified/traditional search is Google's default behavior.
searchType=image400: image search is not supported.noneNo equivalent/api/v2/google returns web results only, with no image search mode. Keep image search on another source.
imgSize, imgType, imgColorType, imgDominantColor400.noneNo equivalentImage search only.
rights400.noneNo equivalentCreative Commons filtering is not available.
sort (e.g. date)400; use dateRestrict.noneNo equivalentResults come in Google's ranking order. Narrow by recency with time_period instead.
linkSite400.noneNo equivalentGoogle retired the link: operator, so there is nothing to translate to.
lowRange, highRange400.noneNo equivalent
(not in CSE)location, device, nfpr and no_cache are accepted as Scavio extensions.location, uule, device, nfprScavio onlyCity-level location, mobile vs desktop layout, and turning off autocorrection.

Every CSE response field, mapped

On the drop-in /customsearch/v1 every field below keeps its CSE name and type (totalResults is still a string), except cacheId, mime, fileFormat, labels, image, spelling, context and promotions, which are not returned. The table maps each field to where the same information sits in a /api/v2/google response.

CSE fieldScavio fieldNotes
items[]organic_results[]RenamedIn Google's ranking order, with a position field.
items[].titleorganic_results[].titleSame
items[].linkorganic_results[].linkSame
items[].snippetorganic_results[].snippetSameOccasionally absent (a recipe card or similar); read it with a default.
items[].displayLinkderive from linkNo equivalentTake the host of link. source is the site's display name ("Stack Overflow", "Reddit · r/Coffee"), not a hostname.
items[].formattedUrlorganic_results[].displayed_linkRenamedThe breadcrumb Google shows. On forum results it can be a line such as "10+ answers · 8 years ago".
items[].htmlTitle, htmlSnippetsnippet_highlighted_words[]RenamedNo HTML strings; you get the bolded words as a list.
items[].pagemaprich_snippet, top-level blocksNo equivalentNo per-result schema.org dump. Ratings and similar extensions sit in rich_snippet when Google shows them; entity data is in knowledge_graph.
items[].cacheId, mime, fileFormat, labels, imagenoneNo equivalent
searchInformation.totalResults (string)search_information.total_results (number)RenamedGoogle's estimate. Do not drive pagination from it.
searchInformation.searchTimesearch_information.time_taken_displayedRenamedresponse_time is Scavio's end-to-end time in milliseconds.
queries.request[0]search_parametersRenamedAn echo of what was actually applied. A parameter missing from it was ignored.
queries.nextPage[0].startIndexstart + 10, when pagination.next existsRenamed
queries.previousPagestart - 10Renamed
spelling.correctedQuerysearch_information.query_displayedRenamedThe query Google actually ran. Send nfpr: true to stop autocorrection.
context, promotions, kind, urlnoneNo equivalentEngine metadata and control-panel promotions have no counterpart.
(not in CSE)knowledge_graph, ai_overview, related_questions, related_searches, top_stories, video_results, local_results, top_adsScavio onlyReturned in the same call when Google shows them, at no extra cost.

What it costs: CSE vs Scavio per 1,000 searches

Google search is 1 credit per request on every Scavio plan, so the cost per 1,000 searches is the plan's price per credit. Live plan prices as of October 2026:

OptionPer 1,000 searchesNotes
Google Custom Search JSON API$5.00After 100 free queries a day; hard cap of 10,000 queries a day; existing customers only
Scavio Growth, billed yearly ($4,788/yr, 200,000 credits/mo)$2.0050 concurrent requests
Scavio Growth, monthly ($500/mo)$2.50
Scavio Startup, billed yearly ($2,388/yr, 85,000 credits/mo)$2.34
Scavio Bootstrap, billed yearly ($948/yr, 28,000 credits/mo)$2.82
Scavio Project, monthly ($30/mo, 7,000 credits)$4.29$3.43 billed yearly
Scavio pay as you go$10.00$25 minimum purchase

Worked example at 200,000 searches a month: CSE bills (200,000 - 3,000 free) x $5 / 1,000 = $985 a month, and would have to stay under 10,000 on any single day. Scavio Growth billed yearly covers it for $399 a month. The honest exception: below roughly 9,000 searches a month, CSE's free 100 a day makes it cheaper than any Scavio plan, but only for teams that already have it enabled, and only until January 1, 2027.

Coming from the Bing Web Search API

Microsoft retired the Bing Search APIs on August 11, 2025, so Bing users are migrating from a dead endpoint rather than a closing one. The move to Scavio's /api/v2/google is the same shape of change: a GET with an Ocp-Apim-Subscription-Key header becomes a POST with a Bearer key, and webPages.value[] becomes organic_results[].

Bing Web Search v7Scavio /api/v2/googleNotes
qqueryRenamed
count (up to 50)noneNo equivalentOne Google page per request; page with start.
offsetstartRenamedBoth are 0-based. Step by 10.
mkt (en-US)gl + hl (us, en)Renamed
cc / setLanggl / hlRenamed
safeSearch=Strictsafe: "active"RenamedModerate has no separate setting.
freshness=Day / Week / Monthtime_periodRenamedlast_day, last_week, last_month. A date range becomes after: and before: in the query.
webPages.value[].name / url / snippetorganic_results[].title / link / snippetRenamed
webPages.value[].displayUrlorganic_results[].displayed_linkRenamed
webPages.totalEstimatedMatchessearch_information.total_resultsRenamed
news (v7.0/news/search)POST /api/v2/google/newsRenamedSame key, 1 credit.
images, videos, entitiesnone / video_results / knowledge_graphNo equivalentNo image search. Video and entity blocks come back inside the web search response when Google shows them.
Before: Bing Web Search API v7
import requests

BING_KEY = "your-azure-key"

resp = requests.get(
    "https://api.bing.microsoft.com/v7.0/search",
    headers={"Ocp-Apim-Subscription-Key": BING_KEY},
    params={"q": "abortcontroller fetch timeout", "mkt": "en-US", "count": 10, "offset": 0},
    timeout=30,
)
resp.raise_for_status()
data = resp.json()
for page in data.get("webPages", {}).get("value", []):
    print(page["name"], page["url"], page["snippet"])
After: Scavio /api/v2/google
import requests

SCAVIO_API_KEY = "sk_live_your_key"

resp = requests.post(
    "https://api.scavio.dev/api/v2/google",
    headers={"Authorization": f"Bearer {SCAVIO_API_KEY}"},
    json={"query": "abortcontroller fetch timeout", "gl": "us", "hl": "en", "start": 0},
    timeout=60,
)
resp.raise_for_status()
data = resp.json()
for r in data.get("organic_results", []):
    print(r["title"], r["link"], r.get("snippet", ""))

More on the Bing side: Bing Web Search API alternatives.

What you stop maintaining

After the host swap there is no engine to configure, no 10,000-a-day ceiling to plan around, and no second integration for the Knowledge Graph, People Also Ask or AI Overview data CSE never returned. Scavio keeps the Google endpoint working; you keep one parser. Google search is 1 credit a request, $2 per 1,000 on Growth billed yearly.

Get a key and run your queries side by side (50 free credits, no card). Reference: Google search API docs.

Why do teams switch from Google Custom Search JSON API to Scavio?

These are common themes in Google Custom Search JSON API user feedback across developer communities.

1. Closed to new customers, and retiring on January 1, 2027

Google's overview page for the Custom Search JSON API (checked 12 October 2026) says the API is closed to new customers, and that existing customers have until January 1, 2027 to transition to an alternative solution; its pricing section applies only to existing customers until that date. Google announced the change on its Programmable Search Engine blog on January 20, 2026. So a team that does not already have the API enabled cannot start using it today, and every application, agent or pipeline that does call it needs a new data source before the deadline. Google's suggested paths are Vertex AI Search, which it describes as an alternative for searching up to 50 domains, and a sales-led full web search solution that teams register interest in through a form. Neither is a lift-and-shift replacement for a SERP-results-as-JSON endpoint: Vertex AI Search has its own setup, pricing and response schema, and the full web search option has no published self-serve price.

The counterweight is that the migration itself is small. Several third-party SERP APIs return response shapes close enough to CSE's that switching is usually a matter of swapping one HTTP call and renaming one field, and the ranked list below compares the four strongest migration targets on exactly that basis.

2. The limits CSE users were already escaping

Even before the shutdown was announced, the Custom Search JSON API imposed constraints that pushed production workloads elsewhere. For existing customers, the free tier allows 100 queries per day. Paid usage costs $5 per 1,000 queries and is capped at 10,000 queries per day regardless of how much a team is willing to pay, so any workload above roughly 300,000 queries a month simply cannot run on it. And the API never returned the real Google SERP: results come from the Programmable Search Engine the developer configures, which by default is restricted to a list of sites and, even with whole-web search enabled, applies its own ranking, so top results often differ from what the same query returns on google.com. Structured SERP features — Knowledge Graph panels, People Also Ask, AI Overviews, related searches — were never part of the response at any price.

For teams that tolerated these limits because the API was official and cheap, the retirement removes the last reason to stay. A programmable search engine api replacement has to be chosen anyway, and the third-party options return more data with fewer caps at a comparable or lower price.

3. Waiting until late 2026 to migrate is its own risk

A hard shutdown date changes the economics of procrastination. On January 1, 2027 the API does not degrade gracefully — requests to a retired endpoint fail outright, which means agents and applications that have not migrated stop working at the cutoff, not slowly. Teams that defer the CSE API migration to the final weeks face a compressed schedule: evaluating a replacement under its free tier, mapping response fields, updating parsers, and re-testing edge cases all take calendar time, and a problem discovered in late December leaves no fallback because the old API dies days later. A last-minute rush also runs into ordinary rate and free-tier limits on whichever replacement is being evaluated, exactly when there is no slack left to wait for quota.

Migrating early has a structural advantage: both APIs can run side by side for weeks, letting a team diff responses on real production queries and cut over only when the outputs match, with an instant rollback path if something looks wrong. Because most CSE integrations are a single HTTP call and a response parser, the actual work is small — the risk is almost entirely in the timing, and it compounds the longer the migration waits.

Looking for a Google Custom Search JSON API alternative?

50 free credits on signup. No credit card required.

Try Scavio Free

What are the best Google Custom Search JSON API alternatives in 2026?

#1

Scavio

Full Google SERP with knowledge graph, PAA, YouTube, and Amazon data

$30/mo, 50 free signup credits

For teams migrating off the Google Custom Search JSON API before the January 1, 2027 shutdown, Scavio is the closest like-for-like replacement, because the response shapes align on the fields that matter. CSE is a GET request that returns an items[] array where each result carries title, link, and snippet. Scavio's Google endpoint is a POST to /api/v2/google with a JSON body of {"query": "..."}, and it returns an organic_results[] array whose entries use the same three core field names: title, link, snippet. In most codebases the CSE API migration is therefore two changes: swap the GET call for the POST call, and rename items to organic_results. Downstream parsing, ranking, and deduplication logic keeps running unchanged, and pagination maps directly once start becomes a 0-based offset (CSE's 1, 11, 21 is Scavio's 0, 10, 20).

What changes after the swap is how much data comes back. The Custom Search JSON API never returned Knowledge Graph panels, People Also Ask, AI Overviews, or related searches; Scavio includes them as structured fields in the same response, alongside dedicated news, maps, and shopping verticals that CSE had no equivalent for. Integrations that previously stitched together multiple Google APIs to approximate the real SERP collapse into one call, and the MCP server lets Claude and other LLM agents call the same endpoints without wrapper code.

The mechanics are covered by official SDKs — Python via pip install scavio and JavaScript via npm i scavio — with request and response formats documented at scavio.dev/docs/search-api. On price, a Google search is 1 credit: $2 per 1,000 on the Growth plan billed yearly and $4.29 per 1,000 on the $30/month Project plan, versus CSE's $5 per 1,000, with no equivalent of CSE's 10,000-query daily cap. The 50 free signup credits, with no card required, are enough to run the field mapping against real production queries and confirm parity before cutting over.

What we liked

  • 50+ platforms from one API key: Google, YouTube, Amazon, Walmart, Reddit, Instagram, TikTok, LinkedIn and more replace multiple provider subscriptions
  • Full SERP anatomy with Knowledge Graph, People Also Ask, AI Overviews, and related searches as typed JSON fields
  • No daily query cap; monthly credit pool lets agents burst without hitting mid-day limits
  • MCP server with 250+ tools and first-party langchain-scavio package for native agent integration

What could be better

  • Not an official Google endpoint; returns the public SERP rather than results from Google's sanctioned API
  • Free tier is 50 one-time signup credits with no monthly refill, thinner than Google CSE's 100/day free tier
  • Newer product with a smaller community compared to Google's extensive documentation and Stack Overflow coverage

Pricing

PlanPriceCreditsIncludes
Free$050 credits, one-timeNo credit card required, 1 request/s
Pay As You Go$0.01 per creditBuy as needed1 request/s
Project$30/mo ($24/mo billed yearly)7,000 credits/mo5 requests/s, Email support
Bootstrap$100/mo ($79/mo billed yearly)28,000 credits/mo10 requests/s, Email support
Startup$250/mo ($199/mo billed yearly)85,000 credits/mo15 requests/s, Priority support
Growth$500/mo ($399/mo billed yearly)200,000 credits/mo50 requests/s, Priority support
EnterpriseCustomCustomCustom credits and rate limits, Dedicated account manager

Our verdict

Scavio is the most direct migration target for the Custom Search JSON API shutdown. The response schema keeps CSE's core field names — title, link, snippet — so most integrations migrate by swapping the endpoint call and renaming items to organic_results, and the payoff is SERP data Google's official API never exposed: Knowledge Graph, People Also Ask, AI Overviews, plus news, maps, and shopping verticals. At $2 per 1,000 Google searches on Growth billed yearly, and $4.29 on the $30 Project plan, it also undercuts CSE's $5 rate, with no daily cap. The trade-off is that it is not an officially sanctioned Google endpoint, which matters for compliance-sensitive environments.

#2

SerpAPI

Mature SERP API with 100+ APIs across Google, Bing, Baidu, Amazon, YouTube and more

$25/mo (1,000 searches), 250 free searches/mo

SerpAPI is a common migration target for teams leaving the Google Custom Search JSON API ahead of the January 1, 2027 shutdown, particularly when the roadmap involves more than Google. Its Google engine returns the full SERP (organic results, Knowledge Graph, People Also Ask, local pack, and shopping results) as structured JSON, all data the retiring CSE API never exposed, and separate APIs cover Google AI Overview and AI Mode. The response schema is well documented and stable, and the client libraries are mature. Where SerpAPI stands out is breadth: its pricing page (checked 12 October 2026) lists more than 100 APIs, covering Google's verticals, Bing, Baidu, Yahoo, Yandex, DuckDuckGo and Naver, plus Amazon, Walmart, eBay, YouTube (including video transcripts), Apple App Store, Yelp and Tripadvisor. For teams treating the forced migration as a chance to add engine diversity, that range is hard to match. The downside is cost. Plans run from $25 a month for 1,000 searches to $275 for 30,000, so the effective rate is $9 to $25 per 1,000 searches against CSE's $5; only successful searches count toward the quota. There is no Reddit endpoint, so migrations that also need community data still require a second provider.

What we liked

  • Full Google SERP structure including Knowledge Graph, People Also Ask, local pack and shopping results, with separate AI Overview and AI Mode APIs
  • 100+ APIs: Bing, Baidu, Yahoo, Yandex, DuckDuckGo and Naver engines plus Amazon, Walmart, eBay and YouTube, including YouTube transcripts
  • Only successful searches count toward the quota; cached, errored and failed searches are not counted
  • 250 free searches every month for evaluation

What could be better

  • Per-search cost of $0.009-$0.025 on the four entry plans is roughly 2-5x Google CSE's $0.005
  • No Reddit endpoint; community data from Reddit needs a second provider
  • Monthly subscription plans with an hourly throughput cap per plan

Pricing

PlanPriceCreditsIncludes
Free$0250 searches/moAll APIs, 50 searches/hour throughput
Starter$25/mo1,000 searchesAll APIs, 200 searches/hour throughput
Developer$75/mo5,000 searchesAll APIs, 1,000 searches/hour throughput
Production$150/mo15,000 searchesAll APIs, 3,000 searches/hour throughput
Big Data$275/mo30,000 searchesAll APIs, 6,000 searches/hour throughput

Our verdict

SerpAPI is the best Custom Search JSON API migration target for teams that want the shutdown to double as an upgrade to multi-engine coverage. It returns the Knowledge Graph, People Also Ask, and rich snippets that Google's official API withheld, plus Bing, Baidu, Yandex, Amazon and YouTube from one provider. The trade-off is per-query cost: $75 a month for 5,000 searches on the Developer plan is $15 per 1,000, three times CSE's $5, and there is no Reddit endpoint. Google-heavy, cost-sensitive migrations get better per-query economics elsewhere on this list.

Read full SerpAPI comparison →

#3

Serper

Fast, lean Google SERP API at very low per-query cost

$50 for 50,000 credits (no subscription), 2,500 free queries

Serper is the migration target to pick when the entire Custom Search workload is Google web search and the priority after the shutdown is the lowest per-query cost. Serper sells prepaid credits rather than subscriptions: its $50 Starter top-up buys 50,000 credits, valid for six months, an effective rate of $0.001 per search, roughly 5x cheaper than the $0.005 that CSE charged, and larger top-ups fall to $0.0003 per search. The API surface is deliberately minimal: send a query and get back organic results, a knowledge graph when available, and People Also Ask. That already exceeds what the Custom Search JSON API returned, since CSE included none of those rich sections, and Serper's synchronous responses are fast. The trade-off is singular focus. Serper only does Google. There are no YouTube transcript endpoints, no Amazon product lookups, no Reddit data, and no content extraction. If an agent needs to pull a YouTube video summary or compare Amazon product specs, a second provider becomes necessary. For pure Google SERP at high volume after CSE retires, Serper is hard to beat on price.

What we liked

  • Lowest per-query cost for Google SERP data: $0.001 per search on the $50 top-up, down to $0.0003 on the largest
  • Returns Knowledge Graph and People Also Ask that Google CSE does not include
  • Fast synchronous responses for Google SERP queries
  • 2,500 free one-time queries for evaluation, generous for thorough testing

What could be better

  • Google only: no YouTube transcripts, no Amazon products, no Reddit, no content extraction
  • No official MCP server or first-party LangChain package; community wrappers exist but lag behind
  • No AI Overview field in Serper's documented response sample; Knowledge Graph appears only when Google shows one

Pricing

PlanPriceCreditsIncludes
Free$02,500 queries (one-time)Google Search, No credit card required
Starter$5050,000 credits ($1.00/1k)50 queries/sec, Credits valid 6 months
Standard$375500,000 credits ($0.75/1k)100 queries/sec, Credits valid 6 months
Scale$1,2502.5M credits ($0.50/1k)200 queries/sec, Credits valid 6 months

Our verdict

Serper is the best Custom Search JSON API migration target for teams that only need Google web results and want to minimize cost per query after the shutdown. At $0.001 per search it undercuts CSE's $0.005 rate by 5x and returns richer SERP data, including Knowledge Graph and People Also Ask. The limitation is that it does nothing beyond Google, so agents that eventually need YouTube, Amazon, or Reddit data will outgrow it and need a multi-platform provider.

#4

SearchAPI

Real-time multi-engine SERP API with structured JSON

$40/mo (10,000 searches), 100 free requests

SearchAPI is a middle-ground migration target for Custom Search JSON API users: broader than CSE was, and cheaper per query. It returns Knowledge Graph data, People Also Ask, AI Overviews and organic results that track live Google SERP rankings more closely than the retiring CSE API did, in a clean, well-typed response schema. Its docs (checked 12 October 2026) list engines for Google's verticals, Bing, Baidu, Yandex, DuckDuckGo and Yahoo, plus Amazon search, product and offers, Walmart, YouTube search and transcripts, TikTok, Instagram and the app stores. The pricing is competitive: $40 a month for 10,000 searches on the Developer plan is $4 per 1,000, 20% less than CSE's $5, falling to $2 per 1,000 on the $500 Scale plan, and failed requests are not billed. The main limitation is Reddit: SearchAPI's Reddit endpoint covers the Reddit Ad Library, not threads or comments. The free allowance of 100 requests at signup is enough for a quick migration test but disappears fast during integration work.

What we liked

  • Returns full SERP structure including Knowledge Graph, People Also Ask, and featured snippets
  • Engines for Google, Bing, Baidu, Yandex and DuckDuckGo, plus Amazon, Walmart, TikTok and YouTube transcripts
  • Clean JSON schema with consistent response structure across all supported engines
  • $4 per 1,000 searches on the $40 plan, falling to $2 per 1,000 on the $500 plan; failed requests are not billed

What could be better

  • No Reddit thread or comment endpoint; its Reddit coverage is the Reddit Ad Library
  • Free allowance is 100 requests at signup, thin for a full integration test
  • Smaller ecosystem with fewer community integrations than SerpAPI or Google CSE

Pricing

PlanPriceCreditsIncludes
Free$0100 requestsSign-up allowance, Failed requests not billed
Developer$40/mo10,000 searches$4 per 1,000 searches, 99.9% SLA
Production$100/mo35,000 searches$3 per 1,000 searches, Team management
BigData$250/mo100,000 searches$2.50 per 1,000 searches, Team management

Our verdict

SearchAPI is a solid Custom Search JSON API migration target that returns the full SERP anatomy at a lower price than CSE. At $40 a month for 10,000 searches it costs $4 per 1,000 against CSE's $5, and it adds Bing, Baidu and YouTube, Amazon and TikTok endpoints, including YouTube transcripts. The main gap is Reddit: its Reddit coverage is the Reddit Ad Library, not threads or comments. For migrations that need community data on the same key, a provider like Scavio covers more ground.

How does Scavio compare to Google Custom Search JSON API?

Check marks indicate the feature is available. X marks indicate it is not.

FeatureScavioGoogle Custom Search JSON API
Google SearchFull SERP with knowledge graph, PAA, AI overviewsOfficial Google results with basic snippets
AI OverviewsGoogle AI-generated summaries included
Knowledge GraphEntity data with title, subtitle, factoidsSeparate Knowledge Graph API (additional cost)
People Also AskQuestions and answers from Google PAA
YouTube Search + Transcripts4 dedicated endpoints with 15 filtersSeparate YouTube Data API required
Amazon Product DataSearch + product details across 22 marketplaces
Content ExtractionFull JavaScript rendering
LangChain PackageNative langchain-scavio with 12 toggleable sectionsCommunity wrapper available
Daily Query LimitNo daily cap, monthly credit pool10,000 queries/day hard limit
Related SearchesFollow-up query suggestions

Looking for a Google Custom Search JSON API alternative?

50 free credits on signup. No credit card required.

Try Scavio Free

When should you stay with Google Custom Search JSON API?

Google Custom Search makes sense in a narrow set of cases now. If the need is a search box on your own website rather than an API, Google's Programmable Search Element continues as a free product for site search across up to 50 domains (its "Search the entire web" option also ends on January 1, 2027). And existing JSON API customers whose volume fits inside the free tier of 100 queries per day can keep calling it until January 1, 2027; new customers cannot sign up.

For everything else, including production applications, AI agents and any workload that must keep running past the deadline, the question is not whether to migrate but where. Scavio returns organic results with the same core field names CSE uses (title, link, snippet), so most integrations move with an endpoint swap and a single field rename, and gain the Knowledge Graph, People Also Ask, and AI Overview data the official API never exposed.

How do we compare Google Custom Search JSON API alternatives?

We compare each tool on the criteria below using its public documentation, pricing pages, and reported developer experience, weighting the factors that matter most for AI agents and search pipelines.

CriteriaWeight
SERP feature completeness (Knowledge Graph, PAA, AI Overviews)30%
Daily and monthly query limits at production volume25%
Multi-platform coverage (YouTube, Amazon, Reddit)20%
Response latency and structured JSON quality15%
Agent framework integration (LangChain, MCP, SDKs)10%

We revisit these comparisons when providers change pricing or ship major updates.

Frequently Asked Questions

Yes. Google's Custom Search JSON API overview (checked 12 October 2026) says the API is closed to new customers and that existing customers have until January 1, 2027 to transition to an alternative solution. The change was announced on the Programmable Search Engine blog on January 20, 2026. The Programmable Search Element, which renders a Google-powered search box on a website, continues as a free product for up to 50 domains, but its "Search the entire web" option also ends on January 1, 2027. Every application, AI agent, or data pipeline that calls the JSON API needs to move to a Google Custom Search API alternative before the deadline.

For most CSE integrations the most direct migration target is Scavio, because the response shapes line up: CSE returns an items array where each result has title, link, and snippet, and Scavio's Google endpoint returns an organic_results array using the same core field names, so existing parsing code keeps working after renaming one key. It also adds the SERP data CSE never returned — knowledge graph, People Also Ask, AI overview — and costs $2 per 1,000 Google searches on the Growth plan billed yearly ($4.29 on the $30 Project plan) versus CSE's $5. SerpAPI is the pick for multi-engine coverage beyond Google, Serper for the lowest per-query price on Google-only workloads, and SearchAPI as a middle ground. All four are compared in detail above.

For most integrations the CSE API migration is a small, mechanical change, because modern SERP APIs kept their response shapes close to CSE's. Taking Scavio as the example: CSE is a GET request that returns items[], each with title, link, and snippet; Scavio is a POST to /api/v2/google with a JSON body like {"query": "..."} that returns organic_results[] with the same three core field names. Migrating means swapping the endpoint call and renaming items to organic_results — downstream parsing, ranking, and dedup logic typically runs unchanged, and pagination maps directly once start becomes a 0-based offset (CSE's 1, 11, 21 is Scavio's 0, 10, 20). Teams that prefer an SDK over raw HTTP can use the Python client (pip install scavio) or the JavaScript client (npm i scavio); request and response formats are documented at scavio.dev/docs/search-api.

Not a drop-in one. For Custom Search JSON API users, Google names Vertex AI Search as an alternative for searching up to 50 domains, and asks teams that need full web search to register interest in a separate full web search solution, with pricing available on request. Vertex AI Search requires Google Cloud setup and returns its own response schema, not the items array CSE integrations parse. Neither is a simple SERP-results-as-JSON API. Teams that want a programmable search engine api replacement with the same call-and-parse workflow they run today are better served by a dedicated SERP API, which is what this page compares.

Google Custom Search JSON API charges existing customers $5 per 1,000 queries after a free tier of 100 queries per day, with a hard cap of 10,000 queries per day, and is closed to new customers. Scavio charges 1 credit per Google search, so it costs $2 per 1,000 on the Growth plan billed yearly ($4,788 a year for 200,000 credits a month) and $4.29 per 1,000 on the $30/month Project plan (7,000 credits), with 50 free signup credits and no card required to test the migration. Serper is cheaper per query for high-volume Google-only workloads ($50 for 50,000 credits, valid for six months). SearchAPI costs $40 a month for 10,000 searches ($4 per 1,000), slightly less per query than Scavio's entry plan, and SerpAPI costs more per query ($25 a month for 1,000 searches, $75 for 5,000) but adds the widest engine coverage. None of the four imposes a daily query cap the way CSE did, though SerpAPI plans set an hourly throughput limit.

Because the Custom Search JSON API is closed to new customers. It is the error a Google Cloud project reports when it calls customsearch/v1 without already having access, and no quota request or form reopens it; only existing customers keep access, until January 1, 2027. A new project needs another source of Google results, such as Scavio's POST /api/v2/google, which returns organic_results[] with the same title, link and snippet fields and comes with 50 free credits to test.

There is no engine to point at, so cx goes away. If your Programmable Search Engine searched the entire web, send the query as it is. If it was limited to a list of sites, put them in the query as site: operators, for example site:docs.example.com OR site:example.com followed by your terms. Google honors site: for most domains, but in a test on 13 October 2026 one large documentation domain came back mostly off-site, so code that needs a strict allowlist should also check the host of each link. Control-panel refinements, weighting and promotions have no equivalent.

No. Scavio's /api/v2/google returns web results and has no image search mode, so searchType=image and the imgSize, imgType, imgColorType and imgDominantColor filters have no equivalent. Keep image search on another source and migrate the web search calls, which are usually the bulk of CSE traffic.

Microsoft retired the Bing Search APIs on August 11, 2025. Send the same query to Scavio's POST /api/v2/google with an Authorization: Bearer key: q becomes query, offset becomes start, mkt becomes gl plus hl, freshness becomes time_period, and webPages.value[] with name, url and snippet becomes organic_results[] with title, link and snippet. Bing news queries move to /api/v2/google/news. Each request is 1 credit, $2 per 1,000 on Growth billed yearly.

Switch from Google Custom Search JSON API to Scavio

50 free credits on signup. No credit card required. Migrate in under an hour with our REST-compatible API.

Get Started FreeRead the Docs
ScavioScavio

One scraper API for every social, search, e-commerce and real estate platform. Built for AI agents.

Product

  • Features
  • Pricing
  • Dashboard
  • Affiliates

Developers

  • Documentation
  • API Reference
  • Quickstart
  • MCP Integration
  • Python SDK

Alternatives

  • Tavily Alternative
  • SerpAPI Alternative
  • Firecrawl Alternative
  • Exa Alternative
  • Serper Alternative
  • Tavily vs Scavio
  • SerpAPI vs Scavio
  • All alternatives
  • Compare Scavio vs alternatives

Search APIs

  • Google Search API
  • Amazon Product API
  • YouTube API
  • Reddit API
  • Walmart Product API
  • TikTok API
  • Instagram API

Tools

  • All Tools

© 2026 Scavio. All rights reserved.

Featured on TAAFT
Terms of ServicePrivacy Policy