Skip to main content
POST
Get a Google shopping card product
A shopping card opens a Google product panel, not a merchant page, and it carries no product URL. The card’s productResultToken gets you that panel. Google AI Mode shopping cards and inline products have the same token.
Google product panel opened from a More products shopping card

The product panel that opens from a 'More products' card

Get a token

Send a Google Search request with device: "desktop" (the default). Cards on the first results page carry a token when Google serves them with a panel reference. A Google AI Mode request returns a token on each shopping card and inline product that links to a Google product viewer. The token adds no cost to either request.
A token expires five minutes after the scrape that issued it. Time in the async queue counts against those five minutes, for the search and for the product request. If your search ran async, its tokens can expire before you read the result. Use the token immediately, or scrape again.

Get the product

The request takes only the token. The token keeps the query, locale and location of the request that issued it, so you cannot change them. It costs 1 credit plus the 2-credit sync surcharge, and only when it succeeds. It uses a concurrency slot. For async, send taskType: "GOOGLE_PRODUCT" with payload: { "productResultToken": "..." } to POST /v1/async/task or the batch endpoint. Async costs 1 credit.
If you send the product request async, set a high priority (for example 10). The default priority is 1, so the task waits behind your other queued tasks and the token can expire before the task starts.

Errors

The failure reason is in error.details.errorType. No error is charged. A failed async task has status: "FAILED" and the same errorType in response.error.details.

Product structure

The response has one entry in productResults, with the same shape as the right-rail product results. 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".

Authorizations

Authorization
string
header
required

cloro API key as a bearer token. One key grants every endpoint in this spec; per-key scopes are not available, so a client cannot request a narrower permission. Keys are created and revoked in the dashboard.

Body

application/json

The token from a Google Search shopping card

productResultToken
string
required

The productResultToken from a Google Search shopping card, or from a Google AI Mode shopping card or inline product. The token carries the query, locale and location of the request that issued it, so the request takes no other field.

Required string length: 1 - 512
Example:

"nuzK-QgAV8BqrZdwQJYZopzdoFhpvKr-N2_YDZevwzg"

Response

The product panel for the token

success
boolean
required
Example:

true

result
object
required