Shopping cards
Structured product listings surfaced inside a Google AI Mode response whenever cloro detects that the prompt carries shopping intent.
Overview
Shopping cards are not a standalone endpoint. They are delivered as part of the AI Mode extraction payload, so there is no extra request to make once you already call the Google AI Mode endpoint. When the underlying answer includes a product carousel, cloro parses it into a shopping_cards array with normalized pricing, ratings, and merchant details.
Detection is automatic. To make a card carousel likely, phrase the prompt with a clear commercial angle, for example asking about specific products, comparing prices, or looking for a place to buy. No dedicated parameter or flag has to be set.
Individual products that Google weaves directly into the prose of the answer are reported separately under inline products. Both collections can be present in a single response, so it is worth reading each one.
Shopping card structure
| Field | Type | Description |
|---|---|---|
| title | string | Name of the product as shown on the card. |
| position | number | One-based rank of the card within shopping_cards, following the rendered order. |
| price | object | Normalized current price (see the shape below). |
| old_price | object | Pre-discount price, using the same shape as price. |
| store | string | Merchant or retailer offering the item. |
| rating | number | Average product rating. |
| reviews | string | Review count as displayed, for example "2.3k". |
| thumbnail | string | URL of the product image. |
| product_link | string | Direct link to the product page. |
| snippet | string | Short descriptive blurb attached to the card. |
| snippet_links | array | Any hyperlinks embedded inside the snippet text. |
price and old_price
Both price fields share one contract. cloro tries to parse the visible text into a clean number, but always preserves the original string so nothing is lost when the text is ambiguous.
| Field | Type | Description |
|---|---|---|
| value | number | null | The parsed numeric amount. Returns null when the on-screen text cannot be resolved to a single unambiguous number. |
| currency | string | null | Detected currency symbol such as "$", "£", "€", or "R$". null when no symbol is present. |
| raw | string | The price text exactly as rendered, for example "$149.99" or "R$ 4,40/mês". Populated whenever the parser received any input text. |
Fall back to raw for display when value is null — this covers installment plans and locale-specific number formats. The same price shape is reused across every price-bearing field in AI Mode.
snippet_links
| Field | Type | Description |
|---|---|---|
| text | string | Anchor text of the link. |
| link | string | Destination URL. |
Response example
{
"success": true,
"result": {
"text": "Here are a few well-reviewed wireless headphones under $200...",
"shopping_cards": [
{
"title": "Sony WH-CH720N Noise Cancelling Headphones",
"position": 1,
"price": { "value": 149.99, "currency": "$", "raw": "$149.99" },
"old_price": { "value": 199.99, "currency": "$", "raw": "$199.99" },
"store": "Amazon",
"rating": 4.5,
"reviews": "2.3k",
"thumbnail": "https://cdn.example.com/products/wh-ch720n.jpg",
"product_link": "https://www.amazon.com/sony-wh-ch720n",
"snippet": "Lightweight over-ear headphones with active noise canceling and 30-hour battery life",
"snippet_links": [
{
"text": "noise canceling",
"link": "https://www.google.com/search?q=noise+canceling"
}
]
}
]
}
}
Notes
- The
shopping_cardsarray is omitted or empty when AI Mode returns no product carousel for the prompt. - Cards and inline products are independent; check both when you need complete product coverage.
- Questions about the response format can be sent to [email protected].