> ## Documentation Index
> Fetch the complete documentation index at: https://cloro.dev/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Google Search product results schema

> Schema for merchant offers parsed from the Google Search right-rail product panel: direct URLs, prices, installments, stock, and delivery badges.

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](/docs/api-reference/endpoint/monitor-google) returns them as `result.productResults` automatically: no flag, no extra credits, since the panel is already in the HTML the scrape fetches.

```json theme={null}
{
  "query": "iphone 17",
  "country": "US"
}
```

<Frame caption="Right-rail product panel on the Google SERP">
  <img src="https://mintcdn.com/cloro/xw1u3hOrJqeOEWTG/images/google/search-product-results.webp?fit=max&auto=format&n=xw1u3hOrJqeOEWTG&q=85&s=a10e583731894540b18f1c70d4b65639" alt="Right-rail product panel on the Google SERP" width="360" style={{ width: "360px", maxWidth: "100%", margin: "0 auto", display: "block" }} data-path="images/google/search-product-results.webp" />
</Frame>

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](/docs/api-reference/endpoint/google/shopping-cards) — both can appear on the same SERP.

Same shape as [AI Mode product results](/docs/api-reference/endpoint/aimode/product-results), which are opt-in via `include.expandProducts` and billed per cluster.

<Warning>
  **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, use [AI Mode with `include.expandProducts`](/docs/api-reference/endpoint/aimode/product-results).
</Warning>

## Product result structure

Each entry describes one product cluster and its merchant offers.

| Field             | Type   | Description                                                               |
| ----------------- | ------ | ------------------------------------------------------------------------- |
| `title`           | string | Product cluster title, as Google displayed it                             |
| `stores`          | array  | Merchant offers. See [store structure](#store-structure)                  |
| `aboutTheProduct` | object | `description` (Google's prose blurb) and `features` (bullets, when shown) |
| `specifications`  | object | Spec tables grouped by category. See [specifications](#specifications)    |
| `images`          | array  | `mainUrl` and `thumbnailUrl` per image, often identical                   |

Only `title` is guaranteed — anything Google's panel omits is left out of the object rather than sent as `null`. Panels can also carry `brand`, `rating`, `reviews`, `priceRange`, `typicalPrices`, `variants`, `relatedProducts`, `userReviews`, `videos`, `discussionsAndForums` and `highlights`, 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:

```json theme={null}
{
  "specifications": {
    "general": {
      "Brand": "Sennheiser",
      "Noise cancellation": "Yes"
    }
  }
}
```

<Warning>
  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`.
</Warning>

### Store structure

| Field           | Type   | Description                                                                                                                                                                      |
| --------------- | ------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `name`          | string | Merchant name (e.g. `"Amazon"`)                                                                                                                                                  |
| `link`          | string | Merchant product URL, passed through from Google verbatim                                                                                                                        |
| `price`         | object | See [price shape](#price-shape). Omitted entirely when the displayed text can't be parsed                                                                                        |
| `installments`  | string | Installment terms as displayed (e.g. `"for 24 mo, $0 now, $798.96 total"`)                                                                                                       |
| `description`   | string | Merchant's listing title, naming the exact SKU sold (e.g. `"iPhone 17 256GB White - Apple"`) — unlike `title`, which names the product overall                                   |
| `buyingOptions` | array  | Merchant badges in display order — stock status, rating, delivery promise, returns window. Google varies these per merchant and locale, so they stay an unparsed list of strings |
| `logo`          | string | Merchant logo URL                                                                                                                                                                |
| `shipping`      | string | Shipping cost or promise as displayed                                                                                                                                            |
| `condition`     | string | Item condition (e.g. `"New"`, `"Refurbished"`)                                                                                                                                   |
| `rating`        | number | Merchant rating                                                                                                                                                                  |
| `reviews`       | string | Merchant review count, abbreviated (e.g. `"384"`, `"2.3k"`)                                                                                                                      |

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.

<Warning>
  `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.
</Warning>

### Price shape

| Field      | Type   | Description                                                                                                     |
| ---------- | ------ | --------------------------------------------------------------------------------------------------------------- |
| `value`    | number | Parsed numeric price; always present when `price` is emitted. On installment offers this is the monthly payment |
| `currency` | string | ISO 4217 code (e.g. `"USD"`). Unrecognized symbols fall through as the glyph itself (e.g. `"R$"`)               |
| `raw`      | string | Visible price text verbatim (e.g. `"$149.99"`)                                                                  |

<Warning>
  `currency` here is an **ISO code** (`"USD"`), while [shopping cards](/docs/api-reference/endpoint/aimode/shopping-cards#price-and-oldprice) and [inline products](/docs/api-reference/endpoint/aimode/inline-products#price-and-oldprice) carry the raw symbol (`"$"`). Normalize before comparing across surfaces.
</Warning>

## Response example

```json theme={null}
{
  "success": true,
  "result": {
    "organicResults": [...],
    "productResults": [
      {
        "title": "iPhone 17",
        "stores": [
          {
            "name": "Apple",
            "link": "https://www.apple.com/shop/buy-iphone/iphone-17-pro",
            "price": {
              "value": 999.00,
              "currency": "USD",
              "raw": "$999.00"
            },
            "description": "iPhone 17 256GB White - Apple",
            "shipping": "Free delivery",
            "condition": "New",
            "buyingOptions": [
              "In stock online",
              "4.8/5",
              "Free next-day delivery",
              "14-day returns"
            ]
          },
          {
            "name": "Best Buy",
            "link": "https://www.bestbuy.com/site/apple-iphone-17-pro",
            "price": {
              "value": 41.62,
              "currency": "USD",
              "raw": "$41.62"
            },
            "installments": "for 24 mo, $0 now, $998.88 total",
            "description": "Apple - iPhone 17 256GB - Black (Verizon)",
            "rating": 4.7,
            "reviews": "1.2k",
            "buyingOptions": [
              "In stock online",
              "Free delivery by Sun",
              "30-day returns"
            ]
          }
        ]
      }
    ]
  }
}
```
