If a script in your stack calls googleapis.com/customsearch/v1 with site: queries to decide whether a page is indexed, it has an expiry date. Google is retiring the Custom Search JSON API on January 1, 2027, has stopped onboarding new customers, and offers only a partner-only successor with no published pricing. The full breakdown of what the shutdown changes for index checking covers the background; this post is the migration itself.
Step 1. Inventory the calls
Search the codebase for customsearch/v1 and cx=. In most projects it is three places: a single-URL check, a batch wrapper, and a nightly cron. Note the daily URL volume; it sets the budget for the replacement.
Step 2. Pick a replacement that meets three tests
- Bulk input: thousands of URLs per request, not one query per URL.
- A verdict per URL, not a results list you have to parse.
- A per-URL price with no daily cap.
The bulk Google index checker from SpeedyIndex meets all three: its REST API takes up to 10,000 URLs per task.
Step 3. Swap the calls
The one-URL-one-request loop becomes three calls. Open the report once, then wire it in:
| Old (CSE) | New (SpeedyIndex checker API) |
|---|---|
GET customsearch/v1?q=site:URL&cx=... per URL | POST app.speedyindex.com/v2/task/google/checker/create with urls[] |
parse items array | POST .../checker/fullreport returns indexed_links / unindexed_links |
API key as key= query param | API key in the Authorization header |
Processing is asynchronous, so the nightly cron splits in two: submit in the evening, collect the report in the morning. Endpoint details are in the checker API reference.
Step 4. Run a parallel check
Push the same 200–500 URLs through both checkers and hand-verify 10–20 disagreements in Search Console. Expect disagreements: CSE results never matched organic search one to one.
Step 5. Retire the old code before December
After the cutoff the old script will not return empty results; it will return auth errors, and your indexing monitor will stop silently. Switch early and leave the old function only as a comment.
Not indexed after the check? The same account can push those URLs into indexing with the free 200 tokens on signup.