No KYC — no ID, no selfie, no documents. Pay in crypto: BTC, USDT, USDC, ETH, SOL, LTC
Language: English
Get an API key

Docs · Response format · API v1

SERP API response format: every block and field of the JSON

One frame on every engine, then one block per part of the results page. This page lists each block, its fields and their types. In the examples, IDs, counts, prices and results are illustrative.

Last updated: · 7 min read

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.

engine=google, gl=gb: shortened, illustrative values
{
  "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.

Python: read optional blocks safely
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?

FieldTypeDescription
idstringIdentifier of the search. Quote it when you contact support.
statusstringsuccess on a 200 answer.
enginestringThe engine that ran the search.
created_atstringTime of the search, ISO 8601 in UTC.
credits_usedintegerCredits 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.

FieldTypeDescription
search_parametersobjectThe parameters applied, with defaults filled in: engine, q, gl, hl, location, google_domain, device, page and the others you sent.
search_information.total_resultsintegerThe result count the engine displayed, when it displayed one. An estimate, not an exact figure.
search_information.query_displayedstringThe 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.

FieldTypeDescription
positionintegerOrder of the result in this block on this page, starting at 1.
titlestringThe blue-link title.
linkstringThe URL of the result.
displayed_linkstringThe URL or breadcrumb as shown under the title.
snippetstringThe text shown under the title.
datestringDate shown next to the snippet, as written on the page. Optional.
sitelinksarrayExtra 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.

FieldTypeDescription
ai_overview.textstringThe text of the AI Overview as shown on the page.
ai_overview.references[].indexintegerOrder of the source in the overview.
ai_overview.references[].titlestringTitle of the cited page.
ai_overview.references[].linkstringURL of the cited page.
ai_overview.references[].sourcestringName of the site, as shown.

What do ads and people_also_ask contain?

FieldTypeDescription
ads[].positionintegerOrder within its block.
ads[].blockstringtop or bottom of the page.
ads[].title, link, displayed_linkstringHeadline, landing URL and shown URL of the ad.
ads[].descriptionstringAd text.
people_also_ask[].questionstringThe question as shown.
people_also_ask[].snippetstringThe answer text shown when the question is opened.
people_also_ask[].title, linkstringTitle and URL of the page the answer comes from.

Which other Google blocks can appear?

BlockFieldsWhat it is
local_resultsposition, title, address, rating, reviews, typeThe local pack: businesses on a map for queries with a place intent.
knowledge_graphtitle, type, description, source.name, source.linkThe knowledge panel about a person, place, company or thing.
top_storiestitle, link, source, dateNews articles shown in a carousel.
inline_videostitle, link, source, durationVideo results shown inside the web results.
shopping_resultsposition, title, price, source, linkProduct listings shown inside the web results.
related_searchesquerySearches suggested at the bottom of the page.
paginationcurrent, next_pageCurrent 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.

engineMain arrayFields
google_newsnews_resultsposition, title, link, source, date, snippet, thumbnail
google_imagesimages_resultsposition, title, original, original_width, original_height, thumbnail, source, link
google_mapslocal_resultsposition, title, place_id, address, phone, website, rating, reviews, type, hours, gps_coordinates.latitude, gps_coordinates.longitude
google_shoppingshopping_resultsposition, title, price, extracted_price, currency, source, link, delivery, rating, reviews
bingorganic_results, related_searchesSame 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.

From $0.30/1K searches · no KYC

Get an API key