Custom Search Site Restricted JSON API
It stopped on January 8, 2025. The same call works again.
Google's Custom Search Site Restricted JSON API stopped serving traffic on January 8, 2025, and Google sent its customers to Vertex AI Search. A GitHub code search on November 10, 2026 finds 2,196 public files that still hold its address.
Since November 10, 2026, SpecStream answers that call. Change https://www.googleapis.com to https://api.specstream.ai and put a SpecStream key in key=. GET /customsearch/v1/siterestrict replies in Google's JSON, and siteSearch keeps the search to one site.
It is the most accurate web search API in the world: 97.9 F-score on all 1,000 SimpleQA Verified questions, shown on the benchmarks page. A call of up to 10 results costs $0.005, with no daily limit.
New accounts get $10 of credit, no card. It covers 2,000 searches.
SpecStream, the retired Site Restricted JSON API and Vertex AI Search, from Google's own pages on Nov 10, 2026
| SpecStream | Site Restricted JSON API (retired) | Vertex AI Search (Agent Search) | |
|---|---|---|---|
| Status | Answers since November 10, 2026 at https://api.specstream.ai/customsearch/v1/siterestrict | Stopped serving traffic on January 8, 2025 | Google's named replacement. Its pricing page is titled Agent Search pricing |
| What you change | The base address and the key. The path, the parameters and the parser stay | Google's notice says every customer must move to Google Cloud's Agent Search | The endpoint and the request, to a POST in a Google Cloud project. Google's migration guide covers Site Restricted JSON API users |
| The request | GET /customsearch/v1/siterestrict?key=...&q=...&siteSearch=..., as your code sends it. cx is accepted and not used | https://www.googleapis.com/customsearch/v1/siterestrict?[parameters], with the same parameters as the Custom Search JSON API | POST https://discoveryengine.googleapis.com/v1/{servingConfig}:search, with a serving config under a project, location, collection and engine |
| Which sites | One site with siteSearch=<site>, or the whole live web without it | 10 or fewer sites in the engine, with Search the entire web set to off | Up to 50 domains |
| The reply | Google's JSON: kind customsearch#search, items[] with title, link, snippet and displayLink, searchInformation.totalResults and queries.nextPage | The Custom Search JSON API's reply: items[] with the URL, title and text snippets of each result | The reply of the servingConfigs.search method |
| Price per 1,000 | $5 per 1,000 searches of up to 10 results, $0.005 a call. A busy call gets 429 with Retry-After and is not charged | $5 per 1,000 queries | $1.50 per 1,000 queries on Standard and $4.00 on Enterprise, plus data storage |
| Daily limit and free use | No daily limit. A new account gets $10 of credit, no card, which covers 2,000 searches | No daily query limit | A free trial of 10,000 queries per account a month |
Why the call works again on SpecStream
The same call, at a new address
# Before: answered by Google until January 8, 2025
curl "https://www.googleapis.com/customsearch/v1/siterestrict?key=$GOOGLE_KEY&cx=$CX&q=rate+limits&siteSearch=docs.github.com"
# After
curl "https://api.specstream.ai/customsearch/v1/siterestrict?key=$SPECSTREAM_KEY&cx=$CX&q=rate+limits&siteSearch=docs.github.com"The path, the parameters and the parser stay as they are. The address changes, and the key.
How a site restricted search works here
Google kept a search to your sites through the engine you set up under cx. SpecStream accepts cx and does not use it. Send siteSearch=<site> and the search stays on that site; leave it out and the call searches the whole live web. q, num, start, siteSearch, exactTerms, orTerms and hq shape the search as they did on Google.
Google's client libraries work with one changed line
cse.siterestrict.list answers in google-api-python-client 2.201.0 and in googleapis 189.0.0 for Node, tested on production on November 10, 2026. In Python, pass client_options={"api_endpoint": "https://api.specstream.ai"} to build. In Node, pass rootUrl: "https://api.specstream.ai/" to google.customsearch. The SpecStream key goes where Google's key went.
The same $5 per 1,000, with no daily limit
Google charged $5 per 1,000 queries on the Site Restricted JSON API, with no daily limit. SpecStream charges $5 per 1,000 searches of up to 10 results, with no daily limit. A busy call gets a 429 with Retry-After and is not charged. Every rate is on the pricing page.
The most accurate web search API, in under a second
The Search API scores 97.9 F-score on all 1,000 SimpleQA Verified questions, 978 of them correct, and 64.0 item F1 on all 200 WideSearch tasks. Measured on production on November 9, 2026, the median call took 0.82 seconds at one search a second and 1.07 seconds at 20 a second, and one account can send 8,800 searches a minute.
Pages and rows on the same key
The same key reads up to 20 pages or documents a call with the Extract API at $0.80 per 1,000 pages, and runs Deep Search, which returns every match on the live web as structured rows at 5¢, 15¢ or $1 a row. A key made with zero_retention keeps nothing of your calls.
Other Site Restricted JSON API replacements
Vertex AI Search
The replacement Google's notice names, now priced as Agent Search: $1.50 per 1,000 queries on Standard and $4.00 on Enterprise, plus data storage, for up to 50 domains. The call becomes a POST to a serving config in a Google Cloud project. SpecStream answers the GET your code already sends.
Custom Search JSON API
The sibling API, at /customsearch/v1. It is closed to new customers, and existing customers have until January 1, 2027. SpecStream answers /customsearch/v1 too, at the same $5 per 1,000.
Brave Search API
A search API on Brave's own index at $5 per 1,000 requests, with $5 in free credits every month. Its guide describes the move as "swapping the endpoint and updating how you read the response". On SpecStream the reply is Google's JSON, so the code that reads it stays.
How SpecStream scores
The same numbers as the benchmarks page, from the official tasks and scorers.
How to bring a siterestrict call back
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. Set the base address to https://api.specstream.ai where your code has https://www.googleapis.com, and send the SpecStream key in key=. In Python:
import requests
BASE = "https://api.specstream.ai" # was https://www.googleapis.com
reply = requests.get(
f"{BASE}/customsearch/v1/siterestrict",
params={"key": SPECSTREAM_KEY, "cx": CX, "q": "rate limits", "siteSearch": "docs.github.com", "num": 10},
timeout=30,
)
reply.raise_for_status()
for item in reply.json().get("items", []):
print(item["title"], item["link"], item["snippet"])3. In JavaScript:
const params = new URLSearchParams({ key: process.env.SPECSTREAM_KEY, q: "rate limits", siteSearch: "docs.github.com", num: "10" });
const res = await fetch(`https://api.specstream.ai/customsearch/v1/siterestrict?${params}`);
const data = await res.json();
for (const item of data.items ?? []) console.log(item.title, item.link);4. Put the site your engine searched in siteSearch. To page, send the startIndex from queries.nextPage[0] as start. On a 429, wait the seconds in Retry-After and send the call again; nothing was charged.
Frequently asked questions
Something we didn't answer? Talk to a human
When did the Custom Search Site Restricted JSON API stop working?
Can I still call customsearch/v1/siterestrict?
GET https://api.specstream.ai/customsearch/v1/siterestrict with a SpecStream key in key=, and the reply comes back in Google's JSON.How do I restrict a search to one site?
siteSearch=<site>, for example siteSearch=docs.github.com. cx is accepted and not used, so the engine ID in your code can stay.Does cse.siterestrict.list still work in Google's client library?
google-api-python-client 2.201.0 and googleapis 189.0.0, tested on November 10, 2026. Set the address to https://api.specstream.ai where the client is built and put the SpecStream key where Google's key went.How much does it cost?
429 with Retry-After and is not charged, and a new account gets $10 of credit, no card.What did Google replace the Site Restricted JSON API with?
POST to a serving config in a Google Cloud project. SpecStream answers the GET your code sends today.Sources
SpecStream wrote this page. Each Google figure comes from Google's own page. The file count is a GitHub code search for customsearch/v1/siterestrict on Nov 10, 2026: files that hold the address.
- Google, Custom Search Site Restricted JSON APIdevelopers.google.com/custom-search/v1/site_restricted_api, read Nov 10, 2026
- Google Custom Search JSON API overviewdevelopers.google.com/custom-search/v1/overview, read Nov 10, 2026
- Google Custom Search JSON API, using RESTdevelopers.google.com/custom-search/v1/using_rest, read Nov 10, 2026
- Google Cloud, Agent Search pricingcloud.google.com/generative-ai-app-builder/pricing, read Nov 10, 2026
- Google Cloud, migrate from Custom Searchdocs.cloud.google.com/generative-ai-app-builder/docs/migrate-from-cse?hl=en, read Nov 10, 2026
- Google Cloud, servingConfigs.searchcloud.google.com/generative-ai-app-builder/docs/reference/rest/v1/projects.locations.collections.engines.servingConfigs/search, read Nov 10, 2026
- Brave Search APIbrave.com/search/api/, read Nov 10, 2026
- Brave, alternatives to the Google Search APIbrave.com/learn/google-api-shutdown/, read Nov 10, 2026
- GitHub code search, customsearch/v1/siterestrictgithub.com/search?q=%22customsearch%2Fv1%2Fsiterestrict%22&type=code, read Nov 10, 2026
- SpecStream benchmarksspecstream.ai/benchmarks, read Nov 10, 2026
- SpecStream pricingspecstream.ai/pricing, read Nov 10, 2026
- SpecStream for agentsspecstream.ai/agents.md, read Nov 10, 2026




