A Google results page is a stack of blocks. Ten organic results are the constant, and around them Google places whatever it decides the query deserves: a knowledge panel, a featured answer, a map with local businesses, a row of videos, People also ask. The Google engine turns each block into a top-level key of the JSON response. This post walks through the mapping.
The keys you always get
Whatever the query, a successful search carries these keys:
search_metadata: the request id, status and timings, plushtml_urlandjson_url. The HTML link opens the exact page that was parsed, which is the first place to look when a field is missing.search_parameters: the parameters as they were applied, with defaults filled in.search_information: what Google reported about the query, such as the number of results.organic_results: the classic blue links, in order. Each item hasposition,title,link,domain,displayed_link,snippetandfavicon, withsnippet_highlighted_wordsandsitelinkswhen Google shows them.pagination: the links for the following pages.
{
"search_metadata": {
"id": "search_XXXXXXXXXXXX",
"status": "Success",
"html_url": "https://www.searchapi.io/api/v1/searches/search_XXXXXXXXXXXX.html",
"json_url": "https://www.searchapi.io/api/v1/searches/search_XXXXXXXXXXXX"
},
"organic_results": [
{
"position": 1,
"title": "...",
"link": "https://...",
"domain": "...",
"snippet": "..."
}
]
}
Blocks that come and go
Everything else is a SERP feature, and a feature is only in the response when it is on the page. The key is named after the block:
| On the page | In the response |
|---|---|
| Knowledge panel | knowledge_graph |
| Featured answer, calculator, weather, open hours | answer_box |
| AI Overview | ai_overview |
| People also ask | related_questions |
| Local pack | local_results and local_map |
| Text ads, shopping ads, local ads | ads, shopping_ads, local_ads |
| Shopping carousel | inline_shopping |
| Videos | inline_videos |
| Images | inline_images |
| Discussions and forums | discussions_and_forums |
| Jobs | jobs |
| Related searches | related_searches |
Because a key can be absent, code that reads a feature should check for it first rather than assume it:
data = response.json()
if "answer_box" in data:
print(data["answer_box"])
for question in data.get("related_questions", []):
print(question["question"])
The Google Search API documentation has a full example response for each block, from knowledge graph variants to showtimes and scholarly articles.
Redirect links
Some links on a Google page are encrypted redirects of the form https://www.google.com/goto?url=.... They appear in AI Overview and People also ask references, sitelinks, perspectives, knowledge graph profiles and video key moments. Organic result links are recovered from the page where possible. The rest are returned as-is by default (link=raw). Setting link=resolved follows each one to its destination; resolving is best-effort and adds latency, and a redirect that cannot be resolved stays as the redirect URL.
Reading a response you have not seen before
When a query returns a key you did not expect, open search_metadata.html_url. The block will be there on the page, and its position relative to the organic results tells you how Google weighted it for that query. Comparing the same query across a few days, locations or devices shows how much these blocks move, which is a topic for its own post.