Skip to main content
Product results are the merchant offers behind a product in a Google AI Mode response: merchant URL, price, installment terms, and stock, delivery and returns badges. Shopping cards and inline products carry only a headline price and a link to Google’s product viewer. Each one that links to the viewer also has a productResultToken, with no flag and at no extra cost:
Send the token to POST /v1/monitor/google/product within five minutes to get the offers inside the viewer. That page has the request, the price, the token rules and the errors.
Product viewer opened from an AI Mode product

Product viewer opened from an AI Mode product

Join the product blocks

Shopping cards and inline products have a productDocid, which is Google’s ID for the product. When a card and an inline product in one response show the same product, the two have the same productDocid. The value is not unique in a block: when Google shows a product in two card groups, the two cards have the same productDocid, so one inline product can match more than one card. A product result has the productDocid of the card or inline product that it came from. Use it to match the result of a product request to the entry whose token you sent. Google can give the same product a different productDocid in another response. Use it to join blocks in one response, not to track a product over time. A card or inline product has no productDocid when the link from Google has none.

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

The product request returns one entry in productResults: