Quick answer
What does a SerpCrypto SERP API response contain?
Each SerpCrypto response is one JSON object: search_metadata (status, engine, credits used), search_parameters (the settings applied), search_information, then one block per part of the results page, such as organic_results, ai_overview, people_also_ask or local_results. Absent parts are simply missing. One page costs 1 credit, from $0.30/1K searches; paid in crypto, no KYC.
What does a full Google response look like?
The example below is a Google search for standing desk in the United Kingdom, shortened to one item per array. A real answer has about ten organic results and every other block the page showed for that query, location and device.
{
"search_metadata": {
"id": "srch_2b81d0c6fa47",
"status": "success",
"engine": "google",
"created_at": "2026-10-22T10:02:31Z",
"credits_used": 1
},
"search_parameters": {
"engine": "google",
"q": "standing desk",
"gl": "gb",
"hl": "en",
"google_domain": "google.co.uk",
"device": "desktop",
"page": 1
},
"search_information": { "total_results": 52400000, "query_displayed": "standing desk" },
"ai_overview": {
"text": "A standing desk lets you work while standing or sitting…",
"references": [
{ "index": 1, "title": "How to choose a standing desk", "link": "https://www.example.co.uk/guide", "source": "Example Guide" }
]
},
"ads": [
{ "position": 1, "block": "top", "title": "Electric Standing Desks", "link": "https://shop.example.com/desks", "displayed_link": "shop.example.com", "description": "Free delivery on…" }
],
"organic_results": [
{
"position": 1,
"title": "Best standing desks 2026, tested",
"link": "https://www.example.co.uk/best-standing-desks",
"displayed_link": "www.example.co.uk › reviews",
"snippet": "We tested 14 electric and manual desks…",
"date": "12 Oct 2026",
"sitelinks": [ { "title": "Budget picks", "link": "https://www.example.co.uk/best-standing-desks#budget" } ]
}
],
"people_also_ask": [
{ "question": "Is it healthy to stand all day at a desk?", "snippet": "…", "title": "Standing at work", "link": "https://www.example.org/standing" }
],
"shopping_results": [
{ "position": 1, "title": "Example Desk Pro 140 cm", "price": "£299.00", "source": "Example Store", "link": "https://shop.example.com/desk-pro" }
],
"related_searches": [ { "query": "standing desk electric" }, { "query": "standing desk converter" } ],
"pagination": { "current": 1, "next_page": 2 }
}Why are some blocks missing from my response?
Because the results page did not show them. Google decides per query, place and device whether to show ads, an AI Overview, a local pack or top stories. SerpCrypto returns what the page showed and leaves the rest out, rather than sending empty placeholders.
Read every block with a default value, as in the Python lines below. The same rule applies inside a block: optional fields such as date or sitelinks appear only on results that have them.
data = response.json()
# A block is present only when the results page shows it: read with a default.
overview = data.get("ai_overview") or {}
organic = data.get("organic_results", [])
questions = [item["question"] for item in data.get("people_also_ask", [])]
if overview:
print("AI Overview sources:", [ref["link"] for ref in overview.get("references", [])])
print(len(organic), "organic results,", len(questions), "questions")What is in search_metadata?
| Field | Type | Description |
|---|---|---|
id | string | Identifier of the search. Quote it when you contact support. |
status | string | success on a 200 answer. |
engine | string | The engine that ran the search. |
created_at | string | Time of the search, ISO 8601 in UTC. |
credits_used | integer | Credits taken by this search: 1 on success. |
What are search_parameters and search_information?
Store search_parameters with your results: it records exactly which country, language, place and device a ranking came from.
| Field | Type | Description |
|---|---|---|
search_parameters | object | The parameters applied, with defaults filled in: engine, q, gl, hl, location, google_domain, device, page and the others you sent. |
search_information.total_results | integer | The result count the engine displayed, when it displayed one. An estimate, not an exact figure. |
search_information.query_displayed | string | The query as the results page showed it. |
What fields does organic_results have?
Organic results are the unpaid web results. On Bing, organic_results has the same shape.
| Field | Type | Description |
|---|---|---|
position | integer | Order of the result in this block on this page, starting at 1. |
title | string | The blue-link title. |
link | string | The URL of the result. |
displayed_link | string | The URL or breadcrumb as shown under the title. |
snippet | string | The text shown under the title. |
date | string | Date shown next to the snippet, as written on the page. Optional. |
sitelinks | array | Extra links shown under the result, each with title and link. Optional. |
How is the AI Overview returned?
ai_overview is present only when Google shows an AI Overview for that query and place. Many queries have none.
| Field | Type | Description |
|---|---|---|
ai_overview.text | string | The text of the AI Overview as shown on the page. |
ai_overview.references[].index | integer | Order of the source in the overview. |
ai_overview.references[].title | string | Title of the cited page. |
ai_overview.references[].link | string | URL of the cited page. |
ai_overview.references[].source | string | Name of the site, as shown. |
What do ads and people_also_ask contain?
| Field | Type | Description |
|---|---|---|
ads[].position | integer | Order within its block. |
ads[].block | string | top or bottom of the page. |
ads[].title, link, displayed_link | string | Headline, landing URL and shown URL of the ad. |
ads[].description | string | Ad text. |
people_also_ask[].question | string | The question as shown. |
people_also_ask[].snippet | string | The answer text shown when the question is opened. |
people_also_ask[].title, link | string | Title and URL of the page the answer comes from. |
Which other Google blocks can appear?
| Block | Fields | What it is |
|---|---|---|
local_results | position, title, address, rating, reviews, type | The local pack: businesses on a map for queries with a place intent. |
knowledge_graph | title, type, description, source.name, source.link | The knowledge panel about a person, place, company or thing. |
top_stories | title, link, source, date | News articles shown in a carousel. |
inline_videos | title, link, source, duration | Video results shown inside the web results. |
shopping_results | position, title, price, source, link | Product listings shown inside the web results. |
related_searches | query | Searches suggested at the bottom of the page. |
pagination | current, next_page | Current page number and the next one, when there is one. |
What do the other engines return?
Each vertical keeps the same frame and adds its own array. On Google Maps, local_results is richer than the local pack of a web search.
engine | Main array | Fields |
|---|---|---|
google_news | news_results | position, title, link, source, date, snippet, thumbnail |
google_images | images_results | position, title, original, original_width, original_height, thumbnail, source, link |
google_maps | local_results | position, title, place_id, address, phone, website, rating, reviews, type, hours, gps_coordinates.latitude, gps_coordinates.longitude |
google_shopping | shopping_results | position, title, price, extracted_price, currency, source, link, delivery, rating, reviews |
bing | organic_results, related_searches | Same fields as the Google organic results |
How are prices, ratings and dates typed?
Values keep the form the page used whenever the page wrote them as text. price is a string with its currency sign, such as £299.00, and Google Shopping adds extracted_price as a number with currency as a code. rating is a number and reviews an integer. Dates such as date stay as written on the page, for example 12 Oct 2026 or 3 days ago, so parse them in your own code if you need a timestamp.
How do I build an overall rank across several pages?
Store the page number with each result. position gives the order inside its block on one page, and search_parameters.page tells you which page that was. About 10 organic results per page, as Google has served since it stopped honouring num=100 in September 2025; each extra page is one more credit.
For rank tracking, most teams keep link, position, page, gl, location, device and created_at per keyword and day. That is enough to chart a ranking and to explain a change by place or device. See rank tracking for the full method.
Response format questions
Is the field naming stable?
Yes within version 1. New blocks or fields can be added, so ignore keys you do not know. Removing or renaming a field would come with a new version in the path, such as /api/v2/.
Can I get the raw HTML of the page?
No. Version 1 returns parsed JSON only. The parsed blocks cover what most tools need: results, ads, questions, the AI Overview, the local pack and the knowledge panel.
Why does total_results differ from what I counted?
It is the estimate the engine prints, not a count of the results you can page through. Pages stop long before that number; use pagination.next_page to know whether another page exists.
Does a response with no organic results cost a credit?
Yes, if the search succeeded: an empty page is still a result. Only errors are free. 1 credit = 1 successful search request, which returns one page of results on any supported engine. A request that fails is not charged.