<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[SerpKite]]></title><description><![CDATA[SerpKite]]></description><link>https://serpkite.hashnode.dev</link><generator>RSS for Node</generator><lastBuildDate>Mon, 02 Nov 2026 16:59:13 GMT</lastBuildDate><atom:link href="https://serpkite.hashnode.dev/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[Cheaper alternatives to the Google Search API in 2026]]></title><description><![CDATA[Google's Custom Search API costs $5 per 1,000 queries and ends Jan 1, 2027. What 100k and 1M searches a month cost on SERP APIs.]]></description><link>https://serpkite.hashnode.dev/cheaper-alternatives-to-the-google-search-api-in-2026</link><guid isPermaLink="true">https://serpkite.hashnode.dev/cheaper-alternatives-to-the-google-search-api-in-2026</guid><category><![CDATA[api]]></category><category><![CDATA[Google]]></category><category><![CDATA[Python]]></category><category><![CDATA[webdev]]></category><dc:creator><![CDATA[SerpKite]]></dc:creator><pubDate>Thu, 29 Oct 2026 21:16:08 GMT</pubDate><content:encoded><![CDATA[<p>We build SerpKite, one of the alternatives below. Prices come from each vendor's public pricing page, checked October 25–29, 2026, and the links let you check them yourself.</p>
<p>Google sells two ways to get its search results into code. The Custom Search JSON API costs $5 per 1,000 queries and stops working on January 1, 2027. Grounding with Google Search costs $14 per 1,000 requests and only hands results to a Gemini model. SERP APIs return the same public results page for $0.30 to $7.25 per 1,000.</p>
<h2>Google's own options</h2>
<table>
<thead>
<tr>
<th>Option</th>
<th>Price</th>
<th>Free</th>
<th>Limits</th>
<th>Status</th>
</tr>
</thead>
<tbody><tr>
<td><a href="https://developers.google.com/custom-search/v1/overview">Custom Search JSON API</a></td>
<td>$5 per 1,000 queries</td>
<td>100 queries a day</td>
<td>10,000 queries a day</td>
<td>Closed to new customers since January 20, 2026; shuts down January 1, 2027</td>
</tr>
<tr>
<td><a href="https://ai.google.dev/gemini-api/docs/pricing">Grounding with Google Search</a> (Gemini API)</td>
<td>$14 per 1,000 requests</td>
<td>5,000 a month</td>
<td>1,500 requests a day per project</td>
<td>Available; returns a Gemini answer with sources, not a results list</td>
</tr>
</tbody></table>
<p>The Custom Search cap matters at volume: 10,000 a day tops out near 300,000 a month, so a million searches a month can't fit. Grounding's daily cap on the Gemini API stops you at about 45,000 a month; Google points heavier users to Vertex AI, which has a higher quota.</p>
<p>Grounding also changes what you get back. You send a prompt, Gemini decides whether to search, and you receive an answer with citations. A rank tracker, an SEO tool or an agent with its own model needs the result list itself.</p>
<h2>What 100k and 1M searches a month cost</h2>
<p>List prices for a Google web search of 10 results. The 100k column uses each vendor's price at that volume; the 1M column uses its 1M price.</p>
<table>
<thead>
<tr>
<th>Option</th>
<th align="right">$ per 1k at 100k</th>
<th align="right">100k / month</th>
<th align="right">1M / month</th>
<th>Results from</th>
</tr>
</thead>
<tbody><tr>
<td>Grounding with Google Search</td>
<td align="right">$14.00</td>
<td align="right">Over the daily cap</td>
<td align="right">Over the daily cap</td>
<td>Google, through Gemini</td>
</tr>
<tr>
<td><a href="https://serpapi.com/pricing">SerpApi</a></td>
<td align="right">$7.25</td>
<td align="right">$725</td>
<td align="right">$3,750</td>
<td>Google</td>
</tr>
<tr>
<td>Custom Search JSON API</td>
<td align="right">$5.00</td>
<td align="right">$485</td>
<td align="right">Over the daily cap</td>
<td>Google (Programmable Search Engine)</td>
</tr>
<tr>
<td><a href="https://brave.com/search/api/">Brave Search API</a></td>
<td align="right">$5.00</td>
<td align="right">$500</td>
<td align="right">$5,000</td>
<td>Brave's own index</td>
</tr>
<tr>
<td><a href="https://www.searchapi.io/pricing">SearchApi</a></td>
<td align="right">$2.50</td>
<td align="right">$250</td>
<td align="right">$1,500</td>
<td>Google</td>
</tr>
<tr>
<td><a href="https://brightdata.com/pricing/serp">Bright Data</a></td>
<td align="right">$1.31</td>
<td align="right">$131</td>
<td align="right">$1,110</td>
<td>Google</td>
</tr>
<tr>
<td><a href="https://oxylabs.io/products/web-api/scrape/pricing">Oxylabs</a></td>
<td align="right">$0.90</td>
<td align="right">$90</td>
<td align="right">$700</td>
<td>Google</td>
</tr>
<tr>
<td><a href="https://serper.dev/">Serper</a></td>
<td align="right">$0.75</td>
<td align="right">$75</td>
<td align="right">$500</td>
<td>Google</td>
</tr>
<tr>
<td><a href="https://serpkite.com/pricing">SerpKite</a></td>
<td align="right">$0.60</td>
<td align="right">$60</td>
<td align="right">$600 ($300 in the batch lane)</td>
<td>Google</td>
</tr>
<tr>
<td><a href="https://dataforseo.com/pricing">DataForSEO</a> (Standard queue)</td>
<td align="right">$0.60</td>
<td align="right">$60</td>
<td align="right">$600</td>
<td>Google</td>
</tr>
<tr>
<td><a href="https://hasdata.com/prices">HasData</a></td>
<td align="right">$0.50</td>
<td align="right">$50</td>
<td align="right">$350</td>
<td>Google</td>
</tr>
<tr>
<td><a href="https://www.scrapingdog.com/pricing/">Scrapingdog</a></td>
<td align="right">$0.45</td>
<td align="right">$45</td>
<td align="right">$290</td>
<td>Google</td>
</tr>
</tbody></table>
<p>The Custom Search figure subtracts the 3,000 free queries a month (100 a day). At 100k a month, every Google-backed API in the table except SerpApi costs less than Custom Search, and Scrapingdog costs a tenth of it.</p>
<p>The cheapest list price is not always the cheapest invoice. Check three rules before you pick:</p>
<ul>
<li><strong>Credit expiry.</strong> Serper's credits expire after 6 months. SerpApi, HasData, Oxylabs, Bright Data and Scrapingdog's Lite plan reset monthly. SerpKite and DataForSEO never expire credits, so a $300 SerpKite pack covers 500,000 searches whether you use them in one month or in ten.</li>
<li><strong>Failed and empty searches.</strong> SerpApi, SearchApi and Scrapingdog don't bill failed requests. SerpKite also refunds empty results, including a 200 response with no organic results. Ask the other vendors.</li>
<li><strong>Minimum purchase.</strong> Serper's cheapest pack is $50 and SerpKite's is $10. If you run 3,000 searches a month, the minimum decides your price more than the per-1k rate does.</li>
</ul>
<h2>Cheaper than SerpApi</h2>
<p>SerpApi charges $25 for 1,000 searches on its Starter plan and $7.25 per 1,000 at 100k a month. If you are leaving SerpApi over price, the other Google-backed APIs in the table cost $45 to $250 at 100k a month against SerpApi's $725.</p>
<p>You give up some things when you leave. SerpApi covers dozens of engines, ships 11 official SDKs, holds an SOC 2 report and offers a $2M legal shield. SearchApi also offers the shield. If your legal team requires one, compare those two first; neither Serper, Scrapingdog nor SerpKite offers one.</p>
<h2>Moving off the Custom Search JSON API</h2>
<p>If your code calls <code>googleapis.com/customsearch/v1</code>, you can keep its request and response. SerpKite serves the same shape at <code>/customsearch/v1</code>: <code>items[]</code>, <code>searchInformation</code> and <code>queries</code>, with <code>start</code>, <code>num</code>, <code>gl</code>, <code>hl</code>, <code>lr</code>, <code>safe</code>, <code>dateRestrict</code>, <code>siteSearch</code> and <code>searchType=image</code>.</p>
<p>Google:</p>
<pre><code class="language-python">res = requests.get(
    "https://www.googleapis.com/customsearch/v1",
    params={"key": GOOGLE_API_KEY, "cx": CX, "q": query},
)
items = res.json().get("items", [])
</code></pre>
<p>SerpKite:</p>
<pre><code class="language-python">res = requests.get(
    "https://api.serpkite.com/customsearch/v1",
    params={"key": SERPKITE_API_KEY, "cx": CX, "q": query},
)
items = res.json().get("items", [])
</code></pre>
<p>One difference to plan for: SerpKite accepts <code>cx</code> and ignores it, so results come from the whole web. If your Programmable Search Engine searched a list of sites, move that list into the request with <code>siteSearch</code> or <code>site:</code> operators. The <a href="https://serpkite.com/docs/guides/migrate-from-google-cse">migration guide</a> covers the Python, Node and Go client libraries, and the <a href="https://serpkite.com/blog/google-custom-search-api-shutdown">shutdown post</a> has the timeline.</p>
<p>If you switch to a different response shape anyway, compare more than price. Brave runs its own index, so results differ from Google's. Grounding needs Gemini in the loop. A SERP API returns what a person sees on google.com.</p>
<h2>Free options</h2>
<table>
<thead>
<tr>
<th>Option</th>
<th>Free searches</th>
<th>Card</th>
</tr>
</thead>
<tbody><tr>
<td>Custom Search JSON API</td>
<td>100 a day, until January 1, 2027, existing customers only</td>
<td>Billing account</td>
</tr>
<tr>
<td>Grounding with Google Search</td>
<td>5,000 a month on Gemini 3 models</td>
<td>Billing account</td>
</tr>
<tr>
<td>Bright Data</td>
<td>5,000 a month</td>
<td>Not stated</td>
</tr>
<tr>
<td>Brave Search API</td>
<td>$5 of calls a month (about 1,000)</td>
<td>Required</td>
</tr>
<tr>
<td>SerpKite</td>
<td>2,500 on signup + 1,000 a month for verified accounts</td>
<td>No</td>
</tr>
<tr>
<td>HasData</td>
<td>1,000 a month</td>
<td>Not stated</td>
</tr>
<tr>
<td>Serper</td>
<td>2,500 once</td>
<td>No</td>
</tr>
<tr>
<td>SerpApi</td>
<td>250 a month</td>
<td>Not stated</td>
</tr>
<tr>
<td>Scrapingdog</td>
<td>100 credits once</td>
<td>No</td>
</tr>
</tbody></table>
<blockquote>
<p><strong>Where SerpKite is not the cheapest</strong> Scrapingdog ($0.45 at 100k, $0.136 at its top tier), HasData ($0.50) and Serper's largest packs ($0.30) list lower prices than our $0.60. Our batch lane gets to $0.30 if your jobs can wait up to 15 minutes. We compete on credits that never expire, free failed and empty searches, Markdown output for LLMs and the drop-in Custom Search endpoint.</p>
</blockquote>
<h2>FAQ</h2>
<p><strong>Is there a free Google Search API?</strong> Until January 1, 2027, existing Custom Search customers get 100 free queries a day. New accounts can't sign up. Grounding gives 5,000 free requests a month, as Gemini answers. For a free list of Google results, use a SERP API's free tier from the table above.</p>
<p><strong>What does the Google Search API cost?</strong> The Custom Search JSON API costs $5 per 1,000 queries after 100 free a day, up to 10,000 a day. Grounding with Google Search costs $14 per 1,000 requests after 5,000 free a month.</p>
<p><strong>What is the cheapest Google search API?</strong> On list price at volume: Scrapingdog, then HasData, Serper's large packs and the DataForSEO Standard queue. Effective price also depends on credit expiry and on whether failed and empty searches count.</p>
<p>More side-by-side numbers: <a href="https://serpkite.com/blog/serp-api-pricing-2026">SERP API pricing in 2026</a>, <a href="https://serpkite.com/compare/best-serp-api">Best SERP APIs in 2026</a> and the <a href="https://serpkite.com/compare/serpapi-alternatives">SerpApi alternatives</a> page.</p>
<hr />
<p><em>Originally published at <a href="https://serpkite.com/blog/cheaper-google-search-api-alternatives">serpkite.com</a>.</em></p>
]]></content:encoded></item><item><title><![CDATA[Google Custom Search JSON API ends Jan 1, 2027: what to do]]></title><description><![CDATA[Google shuts down the Custom Search JSON API on Jan 1, 2027. The timeline, what breaks, your options and a two-line migration.]]></description><link>https://serpkite.hashnode.dev/google-custom-search-json-api-ends-jan-1-2027-what-to-do</link><guid isPermaLink="true">https://serpkite.hashnode.dev/google-custom-search-json-api-ends-jan-1-2027-what-to-do</guid><category><![CDATA[Google]]></category><category><![CDATA[api]]></category><category><![CDATA[Python]]></category><category><![CDATA[migration]]></category><dc:creator><![CDATA[SerpKite]]></dc:creator><pubDate>Sat, 24 Oct 2026 22:51:22 GMT</pubDate><content:encoded><![CDATA[<p>If your app calls <code>https://www.googleapis.com/customsearch/v1</code>, it has a hard deadline. Google closed the Custom Search JSON API to new customers on <strong>January 20, 2026</strong>, and the API <strong>shuts down on January 1, 2027</strong>. After that, requests fail.</p>
<p>This post covers the timeline, what your options are, and how to migrate with the smallest possible diff.</p>
<blockquote>
<p><strong>Deadline: January 1, 2027.</strong> Plan to switch at least two weeks before the deadline, so December change freezes and holidays don't catch you.</p>
</blockquote>
<h2>The timeline</h2>
<table>
<thead>
<tr>
<th>Date</th>
<th>What happened</th>
</tr>
</thead>
<tbody><tr>
<td>2026-01-20</td>
<td>Custom Search JSON API closed to new customers; shutdown date set for 2027-01-01</td>
</tr>
<tr>
<td>Aug–Sep 2026</td>
<td>Docs for a partner-only "Web Search Service API" appear, then get pulled</td>
</tr>
<tr>
<td><strong>2027-01-01</strong></td>
<td><strong>The JSON API stops serving requests</strong></td>
</tr>
</tbody></table>
<p>The partner-only API matters because it was the only hint of an official successor. As of today there is <strong>no self-serve official Google web search API</strong> you can sign up for after the shutdown.</p>
<h2>What breaks on January 1</h2>
<p>The shutdown is at the endpoint, so everything that reaches it stops at once:</p>
<ul>
<li><strong>Direct HTTP calls</strong> to <code>https://www.googleapis.com/customsearch/v1</code>, whatever language or tool sends them.</li>
<li><strong>Google's client libraries</strong>, which call the same endpoint: Python's <code>googleapiclient.discovery.build("customsearch", "v1")</code>, the Node <code>googleapis</code> customsearch client, the Go <code>customsearch/v1</code> package and their equivalents.</li>
<li><strong>No-code flows</strong> whose HTTP or "Google Custom Search" nodes point at it (n8n, Make, Zapier, Pipedream).</li>
<li><strong>Plugins and integrations</strong> that fetch results as JSON for site search or "related content" features.</li>
<li><strong>API keys and quotas</strong> in Google Cloud: the keys stay, but there is nothing left for them to call.</li>
</ul>
<p>Plan for the calls to fail, not to slow down: add a timeout and an error path now, so a forgotten caller degrades instead of crashing.</p>
<h2>Who is affected</h2>
<p>Anything that reads <code>items[]</code> from the CSE JSON API:</p>
<ul>
<li>SaaS features that "search the web" behind the scenes (research assistants, fact-checking, content tools).</li>
<li>Internal tools and scripts, often years old, that nobody remembers owning.</li>
<li>No-code flows in n8n, Make and Zapier that call the endpoint through an HTTP node.</li>
<li>Agent tools that wrap CSE because it was the official, cheap option.</li>
</ul>
<p>Find them with a code search for <code>googleapis.com/customsearch</code> across your repos, and check your Google Cloud console for projects with the Custom Search API enabled.</p>
<h2>Your options</h2>
<ol>
<li><strong>Drop the feature.</strong> Sometimes right for internal scripts. Rarely right for customer-facing features.</li>
<li><strong>Move to a different kind of search.</strong> AI-native search APIs (Tavily, Exa, Brave) run their own index. Results and response shapes differ, so you rewrite the integration and re-test relevance.</li>
<li><strong>Use a SERP API that speaks CSE.</strong> You keep the same request and response, and the results are Google's public results page.</li>
</ol>
<p>We built SerpKite's <code>/customsearch/v1</code> endpoint for option 3. It accepts <code>key</code>, <code>cx</code>, <code>q</code>, <code>start</code>, <code>num</code>, <code>gl</code>, <code>hl</code>, <code>lr</code>, <code>safe</code>, <code>dateRestrict</code>, <code>siteSearch</code> and <code>searchType=image</code>, and returns <code>kind</code>, <code>searchInformation</code>, <code>items[]</code> and <code>queries</code>.</p>
<h2>The migration</h2>
<p>Before (Google):</p>
<pre><code class="language-python">res = requests.get(
    "https://www.googleapis.com/customsearch/v1",
    params={"key": GOOGLE_API_KEY, "cx": CX, "q": query, "start": 1},
)
items = res.json().get("items", [])
</code></pre>
<p>After (SerpKite):</p>
<pre><code class="language-python">res = requests.get(
    "https://api.serpkite.com/customsearch/v1",
    params={"key": SERPKITE_API_KEY, "cx": CX, "q": query, "start": 1},
)
items = res.json().get("items", [])
</code></pre>
<p>Two lines: the hostname and the key. Your parsing code doesn't change.</p>
<blockquote>
<p><strong>The one real difference: cx is ignored.</strong> SerpKite searches the public Google results page, so settings from the Programmable Search console (site lists, promotions, custom ranking) are not applied. If your engine was restricted to your own domains, add <code>siteSearch=example.com</code> or <code>site:a.com OR site:b.com</code> to the query.</p>
</blockquote>
<h2>A ten-week plan</h2>
<table>
<thead>
<tr>
<th>When</th>
<th>Do</th>
</tr>
</thead>
<tbody><tr>
<td>This week</td>
<td>Search your repos for <code>googleapis.com/customsearch</code> and <code>customsearch</code>, and list every Google Cloud project with the Custom Search API enabled</td>
</tr>
<tr>
<td>Next week</td>
<td>Create a SerpKite key per caller, give each a monthly credit limit, and swap the hostname on one low-risk caller</td>
</tr>
<tr>
<td>Weeks 3–4</td>
<td>Run a few dozen real queries through both endpoints and compare <code>items[].link</code>; recreate site restrictions with <code>siteSearch</code></td>
</tr>
<tr>
<td>Weeks 5–7</td>
<td>Move the remaining callers, no-code flows included</td>
</tr>
<tr>
<td>By mid-December</td>
<td>Turn off the Custom Search API in Google Cloud and watch for errors from anything you missed</td>
</tr>
</tbody></table>
<h2>A checklist before January</h2>
<ul>
<li>Inventory every caller of the CSE endpoint, including no-code flows.</li>
<li>Swap the hostname and key. Prefer sending the key as an <code>Authorization: Bearer</code> header so it stays out of URLs and logs.</li>
<li>Recreate site restrictions with <code>siteSearch</code> or <code>site:</code> operators.</li>
<li>Update error handling. SerpKite errors look like <code>{"error":{"code","message","request_id"}}</code>. Failed calls (<code>503</code>) are not billed and are safe to retry.</li>
<li>Run a few dozen real queries through both endpoints and compare <code>items[].link</code>.</li>
<li>Set a spend cap in the dashboard so a runaway loop can't surprise you.</li>
<li>Deploy well before the holidays. December 31 is a bad day to find a forgotten cron job.</li>
</ul>
<h2>Cost</h2>
<p>Google charged $5 per 1,000 queries after 100 free queries a day, with a cap of 10,000 queries a day. On SerpKite each <code>/customsearch/v1</code> call is 1 credit, packs run from $1.00 per 1,000 down to $0.60, there's no daily cap, and credits never expire. You get 2,500 free credits on signup and 1,000 a month after that. Details are on the <a href="https://serpkite.com/pricing">pricing page</a>.</p>
<h2>Next steps</h2>
<ul>
<li>The full parameter mapping and gotchas: <a href="https://serpkite.com/migrate/google-custom-search-api">Migrate from the Google Custom Search JSON API</a>.</li>
<li>Paste an existing CSE URL into the <a href="https://serpkite.com/tools/cse-migration">CSE migration helper</a> to get the SerpKite equivalent.</li>
<li>Need more than <code>items[]</code>? The <a href="https://serpkite.com/apis/google-search-api">Google Search API</a> returns the knowledge graph, People Also Ask and Markdown output.</li>
</ul>
<p>Runnable Python and Node.js versions of the migration, with a <code>--check</code> flag that compares response keys: <a href="https://github.com/SerpKite/custom-search-api-migration">SerpKite/custom-search-api-migration</a>.</p>
<p><em>Disclosure: I work on SerpKite. This post first appeared on the <a href="https://serpkite.com/blog/google-custom-search-api-shutdown">SerpKite blog</a>.</em></p>
]]></content:encoded></item></channel></rss>