GET /customsearch/v1
CSE-compatible /customsearch/v1 endpoint
The endpoint reference: SerpKite's /customsearch/v1 accepts the Custom Search JSON API's query parameters and returns the same items[], searchInformation and queries objects. Moving an app before the January 1, 2027 shutdown? Follow the Google Custom Search JSON API alternative guide.
Overview
What the CSE-compatible /customsearch/v1 endpoint does
Google closed the Custom Search JSON API to new customers on January 20, 2026 and will shut it down on January 1, 2027. Thousands of apps, plugins and automations still call https://www.googleapis.com/customsearch/v1.
SerpKite's endpoint mirrors that contract: GET /customsearch/v1 with key, cx, q, start and num (plus gl, hl, lr, safe, dateRestrict, siteSearch and searchType=image), returning kind: "customsearch#search" with items[] (title, htmlTitle, link, displayLink, snippet, htmlSnippet, formattedUrl, pagemap) and searchInformation. Existing parsers keep working.
What you get
-
kindstring - Always customsearch#search, as in Google's API.
-
items[]array - kind, title, htmlTitle, link, displayLink, snippet, htmlSnippet, formattedUrl, htmlFormattedUrl, pagemap, image.
-
searchInformationobject - searchTime, formattedSearchTime, totalResults, formattedTotalResults.
-
queriesobject - request[] and nextPage[] with searchTerms, count and startIndex, for pagination code that reads them.
Request
curl "https://api.serpkite.com/customsearch/v1?key=$SERPKITE_API_KEY&cx=any&q=site:docs.python.org+asyncio&start=1&num=10"Response (illustrative, placeholder domains)
{
"kind": "customsearch#search",
"searchInformation": {
"searchTime": 0.94,
"formattedSearchTime": "0.94",
"totalResults": "1240000",
"formattedTotalResults": "1,240,000"
},
"items": [
{
"kind": "customsearch#result",
"title": "asyncio — Asynchronous I/O",
"htmlTitle": "<b>asyncio</b> — Asynchronous I/O",
"link": "https://docs.python.org/3/library/asyncio.html",
"displayLink": "docs.python.org",
"snippet": "asyncio is a library to write concurrent code using the async/await syntax.",
"formattedUrl": "https://docs.python.org/3/library/asyncio.html"
}
],
"queries": {
"request": [
{
"searchTerms": "site:docs.python.org asyncio",
"count": 10,
"startIndex": 1
}
],
"nextPage": [
{
"searchTerms": "site:docs.python.org asyncio",
"count": 10,
"startIndex": 11
}
]
}
}
Every response also carries X-Credits-Used, X-Credits-Remaining,
X-Cache and X-Tokens-Estimate headers.
Run this query in the playground
Google Custom Search JSON API shuts down on January 1, 2027
It closed to new customers on January 20, 2026. After the shutdown, requests to googleapis.com/customsearch/v1 stop working. See the full CSE migration guide or paste a URL into the CSE migration helper.
Parameter mapping
Google CSE and SerpKite, side by side
Same path, same parameters, same response keys. The only behavioral difference is cx: SerpKite searches the whole web.
| Google Custom Search | SerpKite | Notes |
|---|---|---|
| https://www.googleapis.com/customsearch/v1 | https://api.serpkite.com/customsearch/v1 | Only the host changes. |
| key (Google API key) | key (skt_live_…) or Authorization: Bearer | Create a key in the dashboard. |
| cx | cx (accepted, ignored) | Whole-web results. Use siteSearch or site: to restrict. |
| q | q | Operators like site:, filetype: and quotes work. |
| start (1–91) | start (1–91) | Same pagination. |
| num (1–10) | num (1–10) | For 100 at once, use POST /v1/search with num=100. |
| gl, hl, lr | gl, hl, lr | Country and language (Google CSE names). |
| safe | safe | active or off. |
| dateRestrict | dateRestrict | d7, w2, m6, y1… |
| siteSearch | siteSearch | Restrict to one site. |
| searchType=image | searchType=image | Image items in CSE shape. |
| items[], searchInformation, queries | items[], searchInformation, queries | Same keys; parsers keep working. |
The whole migration, as a diff
Most codebases change two lines. The response still has items[], searchInformation.totalResults and
queries.nextPage, so pagination and parsing code is untouched.
When you're ready for more, move to POST /v1/search for People Also Ask, knowledge graph, Markdown output and top-100 results.
- const BASE = "https://www.googleapis.com/customsearch/v1";
- const KEY = process.env.GOOGLE_API_KEY;
+ const BASE = "https://api.serpkite.com/customsearch/v1";
+ const KEY = process.env.SERPKITE_API_KEY; // skt_live_…
const url = `${BASE}?key=${KEY}&cx=${CX}&q=${encodeURIComponent(q)}&start=${start}`;
const { items, searchInformation } = await (await fetch(url)).json();Reference
Parameters
The parameters /customsearch/v1 accepts, in the JSON body or the query string.
| Name | Type | Default | Description |
|---|---|---|---|
key
required
|
string | – | Your SerpKite API key (skt_live_…). Or send it as an Authorization: Bearer header. |
cx
|
string | – | Accepted and ignored, so existing URLs don't break. Results are from the whole web. |
q
required
|
string | – | The search query, including operators like site:. |
start
|
integer | 1 | Index of the first result, 1–91, as in CSE. |
num
|
integer | 10 | Results to return, 1–10. |
gl
|
string | – | Country code. |
hl
|
string | – | Interface language. |
lr
|
string | – | Language restrict, e.g. lang_de. |
safe
|
string | off | active or off. |
dateRestrict
|
string | – | d7, w2, m6, y1… |
siteSearch
|
string | – | Restrict results to one site. |
searchType
|
string | – | image for image results. |
Full reference, error codes and headers are in the API docs. Send a JSON array of up to 100 request objects to run them in one call.
Use cases
What people build with the CSE-compatible /customsearch/v1 endpoint
Beat the shutdown
Keep apps that call customsearch/v1 running after January 1, 2027.
Plugins and CMS search
WordPress plugins, internal tools and Zapier flows built on CSE keep their parser.
Site search via site:
Use siteSearch or site: operators to recreate a site-restricted engine.
Upgrade later
Move to POST /v1/search or the official SDKs when you want Markdown, SERP features or top-100 results.
Pricing
CSE-compatible /customsearch/v1 endpoint pricing
Cost per call
1 credit
per request (up to 10 items)
- From $0.60 per 1,000 calls at volume.
- Credits never expire. No subscription.
- Failed, empty and blocked calls are refunded.
- 2,500 free credits = 2,500 calls, then 1,000 credits a month.
For reference: Serper lists Google searches at $1.00 per 1k on its entry tier and $0.30 at its best tier, and its credits expire after 6 months. SerpKite credits cost $1.00 to $0.60 per 1k.
| Pack | Price | Per 1k credits | Per 1k calls | Calls per pack |
|---|---|---|---|---|
| Starter | $10 | $1.00 | $1.00 | 10,000 |
| Growth | $50 | $0.80 | $0.80 | 62,500 |
| Pro | $300 | $0.60 | $0.60 | 500,000 |
FAQ
CSE-compatible /customsearch/v1 endpoint: common questions
Keep exploring
Related APIs and integrations
Start building
Start with the CSE-compatible /customsearch/v1 endpoint
2,500 free credits, then 1,000 every month. No credit card.