Skip to main content
Product results are the merchant offers in Google’s right-rail product panel — merchant URL, price, installment terms, and stock, delivery and returns badges. The Google Search endpoint returns them as result.productResults automatically: no flag, no extra credits, since the panel is already in the HTML the scrape fetches.
Right-rail product panel on the Google SERP

Right-rail product panel on the Google SERP

Each row becomes one entry in stores[]. This panel is separate from the main-column “Popular products” and “More products” grids, which remain shopping cards — both can appear on the same SERP. Same shape as the product that a productResultToken returns.
The panel is not guaranteed. Whether Google renders it varies by session, not just by query — the same query can return productResults on one scrape and omit it on the next. When absent the field is omitted entirely, so treat it as optional rather than expecting an empty array. For dependable offers on a known product, send the productResultToken of a shopping card to the product endpoint.

Product result structure

Each entry describes one product cluster and its merchant offers. Only title is guaranteed (Google Search entries also always carry stores) — anything Google’s panel omits is left out of the object rather than sent as null. Panels can also carry rating, reviews, variants, relatedProducts and userReviews, emitted under those names when present, though most carry none of them.

Specifications

A category name mapped to a flat set of spec key/value pairs:
Category names and spec keys arrive in the response language — a country: "MX" request returns {"general": {"Marca": "Sennheiser"}}. Iterate the object; don’t read a hard-coded key like specifications.general.Brand.

Store structure

Expect the first six on most offers and the rest only occasionally. Everything beyond name is optional and omitted when absent — Google shows different combinations per merchant, so an “Out of stock” listing may have no price or link at all.
link is not validated against the cluster. Google occasionally serves a merchant URL for an unrelated SKU, so an offer’s link can point at a different product than its description names. Verify against description if link correctness matters.

Price shape

currency here is an ISO code ("USD"), while shopping cards carry the symbol as displayed ("$") and inline products carry either, depending on the data Google supplies. Normalize before comparing across surfaces.

Currency codes

cloro maps the currency token Google displays next to the price to its ISO 4217 code. Multi-character and word tokens are recognized, so "R$ 5.597,99" returns "BRL", "MXN 19,499.00" returns "MXN", and "3,399.00 د.إ" returns "AED". Yen written as ¥, ¥ or 円 returns "JPY". A bare $ doesn’t name a market on its own, because Google writes US, Canadian and Australian offers the same way. On AI Mode, cloro resolves a bare $ from the request country: CA returns "CAD", AU returns "AUD", NZ returns "NZD", SG returns "SGD", HK returns "HKD", and any other country returns "USD". On Google Search, a bare $ always returns "USD". An explicit token always takes priority over the request country. A country: "CA" request that gets an offer displayed as "R$ 5.597,99" still returns "BRL".

Response example