Skip to the page

Custom Search JSON API 403

The same call works at SpecStream.

The 403 "This project does not have the access to Custom Search JSON API" has its cause on Google's own page: the API is closed to new customers, and Google ends it for everyone on January 1, 2027. Your key and billing are fine.

Send the same call to SpecStream. Change https://www.googleapis.com to https://api.specstream.ai and put a SpecStream key in key=. The path, q, num, start and Google's JSON reply stay as they are, and cx is accepted and not used.

SpecStream scores 97.9 F-score on all 1,000 SimpleQA Verified questions and 64.0 item F1 on all 200 WideSearch tasks, on the benchmarks page. A search costs $0.005, and new accounts get $10 of credit, no card.

New accounts get $10 of credit, no card. It covers 2,000 searches.

The same call at SpecStream and at Google

SpecStreamGoogle Custom Search JSON API
Open to a new projectYes. Create a key under Agents & API in the workspace and start with $10 of credit, no cardNo. Google's overview page says the API is closed to new customers. Existing customers have until January 1, 2027
What a 403 meansOne thing: the call would go over the spending limit set on the account or the key. Raise the limit and the same call answersPERMISSION_DENIED, "This project does not have the access to Custom Search JSON API", returned to projects with the API enabled and billing active (Stack Overflow, April and June 2026)
A wrong key401 with status UNAUTHENTICATED and reason invalid_token, in Google's error shape400 API_KEY_INVALID, as a developer found by sending a garbage key while the real key got the 403
Daily quotaNone. Calls spend from your balance. An empty balance returns 402 with status FAILED_PRECONDITION100 free queries a day, then $5 per 1,000 up to 10,000 queries a day, for existing customers
The requestGET /customsearch/v1?key=...&q=...&num=&start=, as your code sends it today. cx is accepted and not used. exactTerms, orTerms, siteSearch and hq shape the search as they do on GoogleGET /customsearch/v1 with q, an API key and cx, the ID of a Programmable Search Engine you configured
The replyGoogle's JSON: kind customsearch#search, items[] with title, link, snippet, displayLink, htmlTitle, htmlSnippet and formattedUrl, searchInformation.totalResults and queries.nextPage. Your parser reads it unchangedMetadata about the search and the engine, and an items array with the URL, title and text snippets of each result, in JSON
A refused argument400 with status INVALID_ARGUMENT and a message that names the parameter, such as "Use a num of 1 to 10."400 "Request contains an invalid argument." with reason badRequest, returned to an Azure Logic App while the same URL worked in a browser (Stack Overflow, October 2025)
Price per 1,000 searches$5. A call of up to 10 results is one search at $0.005$5 per 1,000 queries after 100 free queries a day, for existing customers until January 1, 2027
What answers the callThe whole live web, read at the moment of the call. 97.9 F-score on all 1,000 SimpleQA Verified questions (978 correct)The Programmable Search Engine you configured
More than 10 results a searchOn the same key, GET /v1/web-search returns up to 100 results for one search with num, and an answer with the page it was read from. num=100 costs $0.0591 to 10 results a call. Never more than 100 results for a query

Why the 403 ends at SpecStream

What else a 403 project can call

How SpecStream scores

The same numbers as the benchmarks page, from the official tasks and scorers.

How to end the 403

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 or https://customsearch.googleapis.com, and send the SpecStream key in key=.

import requests

BASE = "https://api.specstream.ai"  # was https://www.googleapis.com

reply = requests.get(
    f"{BASE}/customsearch/v1",
    params={"key": SPECSTREAM_KEY, "cx": CX, "q": "open source vector databases", "num": 10},
)
reply.raise_for_status()

for item in reply.json()["items"]:
    print(item["title"], item["link"], item["snippet"])
const params = new URLSearchParams({ key: process.env.SPECSTREAM_KEY, cx: CX, q: "open source vector databases", num: "10" });

const reply = await fetch(`https://api.specstream.ai/customsearch/v1?${params}`).then((r) => r.json());

for (const item of reply.items) console.log(item.title, item.link, item.snippet);

3. Leave the rest. q, num and start work as before, and queries.nextPage gives the next start. Each call is billed as one search on your key, inside the spending limit you give it.

Frequently asked questions

Something we didn't answer? Talk to a human

Why does the Custom Search JSON API say "This project does not have the access"?
Because Google closed the Custom Search JSON API to new customers, and ends it for existing customers on January 1, 2027. The 403 comes with PERMISSION_DENIED. The same call answers at https://api.specstream.ai/customsearch/v1 with a SpecStream key.
Google Custom Search API 403 forbidden with billing enabled: how do I fix it?
Billing does not open the API: two developers on Stack Overflow had billing active, in April and June 2026, and kept the 403. Send the call to https://api.specstream.ai with a SpecStream key, and items[] comes back in Google's JSON.
Why is the Google Custom Search API not working?
Since Google closed it to new customers, a new project gets a 403 on every call, and from January 1, 2027 no project gets an answer. A garbage key gets 400 API_KEY_INVALID, so a 403 is not a key mistake. SpecStream answers the same call today.
Is the 403 caused by the 100 queries a day limit?
No. Google gives 100 free queries a day and stops existing customers at 10,000 a day; that is a quota, and the 403 says the project has no access. SpecStream has no daily quota: calls spend $0.005 each from your balance.
What does Custom Search 400 INVALID_ARGUMENT mean?
Google refused one argument of the request, with the message "Request contains an invalid argument." and no more detail. On SpecStream a refused parameter returns 400 with a message that names it, such as "Use a num of 1 to 10."
Can I still get a Custom Search JSON API key?
No. Google's overview page says the API is not available for new customers. A SpecStream key works in the same key= parameter, and a new account starts with $10 of credit, which covers 2,000 searches.
How much does SpecStream cost for the same call?
$5 per 1,000 searches of up to 10 results, the same rate Google charges existing customers, with no daily limit. A call stopped by a 429 is not charged. Every rate is on the pricing page.

Sources

SpecStream wrote this page. Each Google figure comes from Google's own pages, and each error text from the Stack Overflow question that shows it.

  1. Google Custom Search JSON API overviewdevelopers.google.com/custom-search/v1/overview, read Nov 10, 2026
  2. Google Programmable Search Engine blog, January 20, 2026programmablesearchengine.googleblog.com/2026/01/updates-to-our-web-search-products.html, read Nov 10, 2026
  3. Google Custom Search JSON API reference, cse.listdevelopers.google.com/custom-search/v1/reference/rest/v1/cse/list, read Nov 10, 2026
  4. Google Custom Search JSON API, using RESTdevelopers.google.com/custom-search/v1/using_rest, read Nov 10, 2026
  5. Stack Overflow: persistent 403, does not have the accessstackoverflow.com/questions/79950572, read Nov 10, 2026
  6. Stack Overflow: 403 with billing enabledstackoverflow.com/questions/79918133, read Nov 10, 2026
  7. Stack Overflow: 400 INVALID_ARGUMENT from an Azure Logic Appstackoverflow.com/questions/79788744, read Nov 10, 2026
  8. Google Cloud: Agent Search pricingcloud.google.com/generative-ai-app-builder/pricing, read Nov 10, 2026
  9. Google Cloud: Agent Search, servingConfigs.searchcloud.google.com/generative-ai-app-builder/docs/reference/rest/v1/projects.locations.collections.engines.servingConfigs/search, read Nov 10, 2026
  10. Gemini API: Grounding with Google Searchai.google.dev/gemini-api/docs/google-search, read Nov 10, 2026
  11. Brave Search APIbrave.com/search/api/, read Nov 10, 2026
  12. Serperserper.dev/, read Nov 10, 2026
  13. SpecStream benchmarksspecstream.ai/benchmarks, read Nov 10, 2026
  14. SpecStream pricingspecstream.ai/pricing, read Nov 10, 2026
  15. SpecStream for agentsspecstream.ai/agents.md, read Nov 10, 2026