Guides · 9 min read
Get Google search results as JSON with Python
Fetch Google results as JSON in Python: organic results, People Also Ask, related searches and AI Overview, desktop or mobile, plus pagination and CSV.
Google has closed the Custom Search JSON API to new customers, and existing customers have until January 1, 2027 to move. CrawlerData's Google Search API returns public Google results as JSON, with a short migration path.
Last checked against Custom Search JSON API's public pages. Sources
Google's overview page says: "The Custom Search JSON API is closed to new customers." Existing customers "have until January 1, 2027 to transition to an alternative solution."
Google recommends Vertex AI Search as an alternative for searching up to 50 domains, and asks teams that need full web search to contact Google. Vertex AI Search searches the sites you configure, so it is not a drop-in replacement if your code relies on public Google web results.
CrawlerData's Google Search API returns public Google results in any of 31 countries: organic results with title, link and snippet, as the Custom Search JSON API did, plus AI Overview, People Also Ask, ads, the local pack and more. It costs $1.00 to $0.30 per 1,000 requests, with no daily cap.
| CrawlerData | Custom Search JSON API | |
|---|---|---|
| Pricing model | Prepaid credit packs, no subscription. Credits valid 6 months | Closed to new customers. Existing customers: pay per query until January 1, 2027 |
| Cost per 1,000 at entry | $1.00 per 1,000 requests (Starter, $50 for 50k credits) | Free for 100 queries a day, then $5 per 1,000 |
| Cost per 1,000 at volume | $0.30 per 1,000 requests (Ultimate, $3,750 for 12.5M credits) | $5 per 1,000, up to 10,000 queries a day |
| Free tier | 50 free credits with a verified work email, valid 30 days | 100 queries a day (existing customers only) |
| Google Shopping sellers | Yes. Every seller for a product in one request, 1 credit per 10 sellers returned (rounded up, minimum 1) | Not offered. Web results, or images with searchType=image |
| Async and webhooks | Live (synchronous), plus Fast and Regular queues with polling or a webhook (postbackUrl). Same price on every queue | Synchronous GET request. Webhooks: not published |
| MCP server | Yes. Remote server at api.crawlerdata.com/mcp, 8 tools, same API key | Not published |
| Failed requests | Not charged. A failed job costs 0 credits | Not published |
| Rate limit | 100 requests per minute and 20 per second per API key | Up to 10,000 queries a day |
| Results per request | One Google results page per request, pages 1 to 10 | 1 to 10 (num); start + num cannot exceed 100 |
| What it searches | Public Google results for the country you choose | A Programmable Search Engine you configure (cx) |
| Availability | Open to new customers | Closed to new customers; ends January 1, 2027 |
List prices in USD, excluding tax, as published on October 13, 2026. "Not published" means we could not find it on Custom Search JSON API's public pages. Per-1,000 figures marked "our arithmetic" divide a plan price by its volume.
The core fields carry over. items[] becomes organic_results[], and title, link and snippet keep their names. Instead of an API key and a cx in the query string, you send a JSON body with a Bearer token.
| Custom Search JSON API | CrawlerData |
|---|---|
| GET customsearch/v1?key=… | POST api.crawlerdata.com/v1/jobs, Authorization: Bearer YOUR_API_KEY |
| cx | Not needed: results are public Google results |
| q | params.query |
| gl | params.country |
| hl | params.language |
| start (1, 11, 21 … 91) | params.page (1 to 10) |
| num (1 to 10) | Not needed: each request returns one Google results page |
| searchType=image | "endpoint": "google-images" |
| items[] | result.organic_results[] |
| items[].title / link / snippet | title / link / snippet |
| items[].displayLink | displayed_link |
| searchInformation.totalResults | search_information.total_results |
const url = new URL('https://www.googleapis.com/customsearch/v1');
url.search = new URLSearchParams({ key: API_KEY, cx: SEARCH_ENGINE_ID, q: 'best crm software', gl: 'us', hl: 'en' });
const data = await (await fetch(url)).json();
const results = (data.items ?? []).map((i) => ({ title: i.title, url: i.link, snippet: i.snippet }));const res = await fetch('https://api.crawlerdata.com/v1/jobs', {
method: 'POST',
headers: { Authorization: 'Bearer YOUR_API_KEY', 'Content-Type': 'application/json' },
body: JSON.stringify({ endpoint: 'google-search', params: { query: 'best crm software', country: 'us', language: 'en' }, queue: 'live' }),
});
const { job, result } = await res.json(); // job.status "failed" => result is null, 0 credits
const results = (result?.organic_results ?? []).map((r) => ({ title: r.title, url: r.link, snippet: r.snippet }));Full request and response schemas are in the OpenAPI spec, with runnable code in the examples repo. AI clients can connect to the MCP server at https://api.crawlerdata.com/mcp with the same API key.
Google's overview page says the API is closed to new customers and that existing customers have until January 1, 2027 to transition to an alternative solution.
Vertex AI Search, which Google calls a favorable alternative for searching up to 50 domains. For full web search, Google asks you to contact it. Vertex AI Search searches content you configure rather than returning public Google web results.
For existing customers: 100 queries a day free, then $5 per 1,000 queries, up to 10,000 queries a day, until January 1, 2027.
Usually the request and one line of parsing: items[] becomes result.organic_results[], and title, link and snippet keep their names. cx is not needed, and start becomes a page number from 1 to 10.
The Custom Search JSON API returns at most 10 per request and 100 in total. On CrawlerData you request pages 1 to 10, one request and 1 credit per page.
All checked on (as of Oct 2026). Spotted something out of date? Email contact@crawlerdata.com and we will correct it.
Organic results with real destination links, ads, AI Overview, People Also Ask, local pack, top stories, knowledge panel and related searches. Desktop or mobile.
from $0.30 / 1,000 requests
Image results with the source page, original image URL and size, and thumbnail.
from $0.30 / 1,000 requests
News articles with source, date, snippet and link.
from $0.30 / 1,000 requests
Organic positions and SERP features, desktop or mobile, per keyword and country.
See how it works
Fresh Google results as JSON for LLM agents, tools and RAG pipelines.
See how it works
Guides · 9 min read
Fetch Google results as JSON in Python: organic results, People Also Ask, related searches and AI Overview, desktop or mobile, plus pagination and CSV.
Prepaid packs from $1.00 per 1,000 vs SerpApi's monthly subscription from $25.00 per 1,000.
See the comparison
CompareSame pack prices. CrawlerData adds Google Shopping sellers, async queues with webhooks and MCP.
See the comparison
CompareOne price on every queue, live included, vs queue-based pricing for SERPs and Shopping.
See the comparison
CompareGoogle's own results and Shopping prices for agents vs LLM-ready web content summaries.
See the comparison
Get 50 free credits when you sign up with your work email and verify it. Failed requests are never charged.
We use Google Analytics cookies to understand how the site is used. See our privacy policy.