# Google Shopping Prices Scraper: Products, Stores & Deals (`plainrows/google-shopping-prices`) Actor

Get Google Shopping prices for any search or product: price, old price and discount, seller, rating, delivery, image, plus each store's offer with domain, shipping and total price. 20 countries, no browser, no proxies. Pay per result, plus small run and page fees from October 25, 2026.

- **URL**: https://apify.com/plainrows/google-shopping-prices.md
- **Developed by:** [PlainRows](https://apify.com/plainrows) (community)
- **Categories:** E-commerce, Marketing, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.00 / 1,000 product offers

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Google Shopping Prices Scraper: Products, Stores & Deals

Get **Google Shopping prices** for any search: **title, price, old price and discount, seller, product rating, delivery, image and Google Shopping link** for up to 120 products per search. Then **compare stores**: give a Google Shopping product ID and get every store's offer with **store domain, product link, price, shipping and total price, availability and store rating**.

It calls a commercial search data API instead of driving a browser: **no proxies, no CAPTCHAs, no Google account**, results in about a minute. **Until October 25, 2026 you only pay for results returned**; from October 25, 2026 each run also costs $0.001 to start and each block of results $0.0026. Searches with no result, unknown product IDs and sponsored listings are free.

### Typical uses

- **Price monitoring**: track your products' and competitors' prices on Google Shopping every day, with discounts and old prices.
- **Price comparison across stores**: who sells a product, at what total price including shipping, and who is in stock.
- **Product and market research**: which brands, models and sellers show up for a category, at which price points and ratings.
- **Repricing and MAP checks**: spot sellers below your minimum advertised price, by store domain.
- **Automations and AI agents**: feed n8n, Make, Zapier, Google Sheets or an MCP client with structured JSON.

### What you get

Each row is one product offer. `source` tells you where it comes from:

- `search`: a listing from a Google Shopping search (one seller's offer of a product, as Google shows it in the results);
- `stores`: one store's offer for a product ID (the "compare prices" list of Google Shopping).

| Field | Description |
|---|---|
| `query`, `source`, `position` | Your search query or product ID, row type, position in Google's results (sponsored listings excluded) |
| `productId` | Google Shopping product ID. Put it in **Product IDs** to compare all stores for this product |
| `title`, `productTitle` | Listing title as shown by the seller, and Google's product title |
| `seller`, `storeDomain` | Store name; store domain (store offers only: search listings do not show it) |
| `price`, `oldPrice`, `discountPercent`, `currency` | Price, previous price when Google shows a discount, discount in %, ISO currency |
| `shippingPrice`, `tax`, `totalPrice` | Shipping, tax and total price when shown (store offers) |
| `deliveryInfo`, `availability`, `condition` | e.g. "Free delivery by Fri"; `in_stock`, `backordered`...; New / Used / Refurbished |
| `badges` | Labels such as "40% OFF", "Best price", "Usually $210" |
| `productRating`, `productRatingCount` | Product rating out of 5 and number of ratings |
| `storeRating`, `storeRatingCount` | Store rating out of 5 and number of ratings (store offers) |
| `offerUrl`, `googleShoppingUrl`, `imageUrl` | Product page on the store's site (store offers), Google Shopping page (search), image |
| `gtin` | GTIN/EAN when Google shows it (rare) |
| `correctedQuery` | Google's spelling correction of your query, if it applied one |
| `searchCountry`, `languageCode`, `observedAt` | Market, language and when the data was fetched (UTC) |

Missing values are always `null`, never guessed. Seller handles on consumer marketplaces (for example "eBay - username") are reduced to the marketplace name ("eBay"), because they can name private people.

### Input

```json
{
  "searchQueries": ["sony wh-1000xm5", "espresso machine"],
  "productIds": ["17653315832884157286"],
  "country": "US",
  "maxProductsPerQuery": 40,
  "maxOffersPerProduct": 20,
  "sortBy": "relevance",
  "minPrice": 100,
  "maxPrice": 400
}
```

- **searchQueries**: what you would type in Google Shopping, up to 1,000 per run. 1 to 120 products each (**maxProductsPerQuery**, default 40).
- **productIds** (optional): Google Shopping product IDs, taken from the `productId` column of a search run, or a Google Shopping link that contains one. 1 to 100 store offers each (**maxOffersPerProduct**, default 20). **Product IDs are per country**: use IDs found by a search in the same country. You can run searches only, product IDs only, or both.
- **country**: US, GB, CA, AU, IE, IN, DE, AT, CH, FR, BE, ES, MX, IT, NL, PT, BR, PL, SE, JP. **languageCode** (optional) defaults to the country's main language.
- **sortBy** (`relevance`, `price_low_to_high`, `price_high_to_low`, `review_score`), **minPrice**, **maxPrice** (whole numbers in the country's currency): Google Shopping's own filters, applied to searches.
- Searching by GTIN/EAN barcode is not supported: in our tests a barcode search returned unrelated products, so search by product name or model instead.

### Output example

Real rows from a run on 2026-10-07 (US). A search listing for `sony wh-1000xm5`:

```json
{
  "query": "sony wh-1000xm5",
  "source": "search",
  "found": true,
  "position": 1,
  "productId": "17755277695162489284",
  "gtin": null,
  "title": "Sony WH-1000XM5 Noise Canceling Wireless Headphones",
  "productTitle": "Sony WH-1000XM5 Noise Canceling Wireless Headphones",
  "seller": "Best Buy",
  "storeDomain": null,
  "price": 238,
  "oldPrice": 398,
  "discountPercent": 40,
  "currency": "USD",
  "shippingPrice": null,
  "tax": null,
  "totalPrice": null,
  "deliveryInfo": "Free delivery",
  "availability": null,
  "condition": null,
  "badges": ["40% OFF"],
  "productRating": 4.6,
  "productRatingCount": 17000,
  "storeRating": null,
  "storeRatingCount": null,
  "offerUrl": null,
  "googleShoppingUrl": "https://google.com/search?ibp=oshop&q=sony+wh-1000xm5+sale&prds=gpcid:11726664398501807381,rds:PC_11726664398501807381%7CPROD_PC_11726664398501807381,headlineOfferDocid:8123523306754565002,catalogid:17755277695162489284,pvo:3,pvt:hg&hl=en&gl=US",
  "imageUrl": "https://encrypted-tbn3.gstatic.com/shopping?q=tbn:ANd9GcSm7uUShvddjQbva7YmqYU4jZM-t27McoF3MYKhFd5gD_5yjYPqRPmoYfG5I1Ys4L3ypm6LUdYBqJTP1N054lKh0EFHUnJ3NEYC_P0tUPmw",
  "correctedQuery": null,
  "searchCountry": "US",
  "languageCode": "en",
  "observedAt": "2026-10-07T14:58:34.195Z",
  "schemaVersion": "1.0"
}
```

A store offer for product ID `17653315832884157286` (12 stores returned in that run: Best Buy, Sony, Walmart, Target, B\&H, Crutchfield...):

```json
{
  "query": "17653315832884157286",
  "source": "stores",
  "found": true,
  "position": 1,
  "productId": "17653315832884157286",
  "gtin": null,
  "title": "Sony - WH-1000XM5 Wireless Noise Cancelling Over-the-Ear Headphones - Silver",
  "productTitle": "Sony WH-1000XM5 Noise Canceling Wireless Headphones",
  "seller": "Best Buy",
  "storeDomain": "bestbuy.com",
  "price": 198,
  "oldPrice": null,
  "discountPercent": null,
  "currency": "USD",
  "shippingPrice": null,
  "tax": null,
  "totalPrice": 198,
  "deliveryInfo": null,
  "availability": "in_stock",
  "condition": null,
  "badges": ["50% off $398"],
  "productRating": null,
  "productRatingCount": null,
  "storeRating": 4.63,
  "storeRatingCount": 1734,
  "offerUrl": "https://www.bestbuy.com/product/sony-wh-1000xm5-wireless-noise-cancelling-over-the-ear-headphones-silver/J7XSRH5CXV/sku/6505728?utm_source=feed",
  "googleShoppingUrl": null,
  "imageUrl": "https://encrypted-tbn3.gstatic.com/shopping?q=tbn:ANd9GcSV_sZCb0RTsNbfzE0gmj_tDvgolFxbjjZyHZ_yUW_qF_6OpwpMLZES7KgBItQD1tryrmpIR8tn6YNgfZ_89lqsQoNC4ketBITvSV2TCJg_0tDnrak3P9uAJg",
  "correctedQuery": null,
  "searchCountry": "US",
  "languageCode": "en",
  "observedAt": "2026-10-07T14:58:34.195Z",
  "schemaVersion": "1.0"
}
```

### Pricing

Pay per result, no subscription, no proxy costs; no fee per run until October 25, 2026, then $0.001 per run start. See the **Pricing** tab for current prices: one event per **product offer found** (a search listing or a store offer), cheaper on higher Apify plans. Store domains, shipping, total price and ratings are included in that price (no "details" or "sellers" add-on).

Price change on October 25, 2026: $0.001 per run start, and one `results-page` event ($0.0026, all plans) per block of results that returns at least one result (up to 40 products for a search, up to 10 store offers for a product ID). The result price does not change.

Searches with no result, unknown product IDs, sponsored listings, duplicates and input mistakes cost nothing (from October 25, 2026, apart from the $0.001 start fee per run). The run never spends more than the maximum cost you set.

**Free Apify plan:** each run returns up to 20 results for up to 2 searches or product IDs, so you can check the output. A paid Apify plan removes these limits.

### Use it from code, automations or AI agents

**API (one call, results returned directly):**

```bash
curl -X POST "https://api.apify.com/v2/acts/plainrows~google-shopping-prices/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"searchQueries": ["sony wh-1000xm5"], "country": "US", "maxProductsPerQuery": 20}'
```

**n8n, Make, Zapier:** use the Apify integration, pick `plainrows/google-shopping-prices`, schedule it daily and send the rows to Google Sheets, Airtable or your database to follow prices over time.

**AI agents (MCP):** add `https://mcp.apify.com?tools=plainrows/google-shopping-prices` to Claude, Cursor or any MCP client. The agent gets a typed tool and pays per result.

### What this is not

- **No product reviews text and no reviewer names.** Ratings are averages and counts only.
- Not a live feed: Google Shopping prices change during the day; each row carries `observedAt`.
- Search listings show the seller's name but not its domain or direct link; use **Product IDs** for store domains and links. Listings without a `productId` cannot be compared across stores.
- Not affiliated with Google.

### Run summary

Each run stores a summary in the key-value store (`OUTPUT`): searches and product IDs submitted and run, how many returned nothing, results billed, sponsored listings skipped, requests Google did not answer, duplicates and invalid values, and anything skipped because of the free-plan or budget limit.

### FAQ

**How do I monitor product prices on Google Shopping?**
Enter product names or models in **searchQueries**, pick the country and schedule the run daily: each row is one listing with price, old price, discount, seller and rating.

**How do I compare the prices of one product across stores?**
Run a search, copy the `productId` of the product, and put it in **productIds**: you get every store's offer with domain, link, shipping and total price.

**How many products per search?**
1 to 120 (**maxProductsPerQuery**, default 40), and 1 to 100 store offers per product ID.

**Can I search by GTIN or EAN barcode?**
No: in our tests barcode searches returned unrelated products, so search by product name or model.

**Are sponsored listings included?**
No: sponsored listings are skipped and never billed.

### More PlainRows tools

Same pay-per-result pricing, same clean JSON, built to chain together in n8n, Make, Zapier or AI agents.

- **SEO and keywords:** [Keyword Search Volume, CPC & Difficulty](https://apify.com/plainrows/keyword-search-volume) · [Keyword Ideas Generator](https://apify.com/plainrows/keyword-ideas-generator) · [Google Autocomplete & People Also Ask](https://apify.com/plainrows/google-autocomplete-questions) · [Google Trends Explorer](https://apify.com/plainrows/google-trends-explorer) · [Website Organic Traffic & Top Keywords](https://apify.com/plainrows/domain-seo-overview) · [Bulk Domain Authority Checker](https://apify.com/plainrows/domain-authority-checker) · [Backlink Checker](https://apify.com/plainrows/backlink-checker) · [Broken Link Checker](https://apify.com/plainrows/broken-link-checker) · [AI Search Visibility Tracker (ChatGPT, Gemini, AI Mode)](https://apify.com/plainrows/ai-search-brand-visibility) · [Google Maps Rank Tracker (Geo-Grid Local SEO)](https://apify.com/plainrows/google-maps-rank-tracker)
- **Leads and companies:** [Google Maps Scraper](https://apify.com/plainrows/google-maps-businesses) · [Website Technology Checker](https://apify.com/plainrows/website-tech-stack) · [ATS Jobs Scraper (Workday, Greenhouse, Lever, Ashby)](https://apify.com/plainrows/ats-job-postings) · [Google Jobs Scraper](https://apify.com/plainrows/google-jobs-scraper) · [Google Ads Scraper (Transparency Center)](https://apify.com/plainrows/google-ads-transparency) · [Company Registry Lookup (SIRENE, LEI, Brreg)](https://apify.com/plainrows/company-registry-lookup) · [Public Tenders Search (EU TED & UK)](https://apify.com/plainrows/public-tenders-search)
- **E-commerce and travel:** [Amazon Product Search Scraper](https://apify.com/plainrows/amazon-product-search) · [Google Hotels Prices Scraper](https://apify.com/plainrows/google-hotels-prices) · [Tripadvisor Reviews Scraper](https://apify.com/plainrows/tripadvisor-reviews)
- **Content and media:** [Google News Scraper](https://apify.com/plainrows/google-news-scraper) · [YouTube Search Scraper](https://apify.com/plainrows/youtube-search-scraper) · [YouTube Comments Scraper](https://apify.com/plainrows/youtube-comments-scraper) · [Google Images Scraper](https://apify.com/plainrows/google-images-scraper) · [Website Screenshot API](https://apify.com/plainrows/website-screenshot) · [Google Maps Reviews Scraper](https://apify.com/plainrows/google-maps-reviews) · [App Store & Google Play Reviews Scraper](https://apify.com/plainrows/app-reviews-scraper)

**Compared with other APIs:** [Competitor prices on Google Shopping as JSON, store by store](https://nadaho.github.io/plainrows/google-shopping-competitor-prices/)

### Support

Missing a field, a country or found a bug? Open an issue on this page. Issues are read and answered.

# Actor input Schema

## `searchQueries` (type: `array`):

What you would type in Google Shopping, one per line: a product name, model or category, e.g. "sony wh-1000xm5", "espresso machine". Up to 1,000 per run. Leave empty if you only use Product IDs below.

## `productIds` (type: `array`):

Google Shopping product IDs (the productId column of a search run, or a Google Shopping link that contains one). For each product you get every store's offer: store domain, link, price, shipping and total price. Search results without a productId cannot be compared.

## `country` (type: `string`):

Google Shopping market (prices and stores of this country).

## `languageCode` (type: `string`):

Two-letter language code, e.g. "en" or "fr". Leave empty to use the country's main language (for example German for Switzerland, French for Belgium).

## `maxProductsPerQuery` (type: `integer`):

Google Shopping shows up to about 120 products per search. Each product returned is billed; see Pricing.

## `maxOffersPerProduct` (type: `integer`):

Popular products can have 40 or more store offers (Google's order: best known stores first). Each offer returned is billed.

## `sortBy` (type: `string`):

Order of the search results, as on Google Shopping. Applies to search queries only.

## `minPrice` (type: `integer`):

Only products from this price, in the country's currency (whole number). Applies to search queries only.

## `maxPrice` (type: `integer`):

Only products up to this price, in the country's currency (whole number). Applies to search queries only.

## Actor input object example

```json
{
  "searchQueries": [
    "sony wh-1000xm5"
  ],
  "country": "US",
  "maxProductsPerQuery": 40,
  "maxOffersPerProduct": 20,
  "sortBy": "relevance"
}
```

# Actor output Schema

## `results` (type: `string`):

No description

## `summary` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "searchQueries": [
        "sony wh-1000xm5"
    ],
    "country": "US"
};

// Run the Actor and wait for it to finish
const run = await client.actor("plainrows/google-shopping-prices").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "searchQueries": ["sony wh-1000xm5"],
    "country": "US",
}

# Run the Actor and wait for it to finish
run = client.actor("plainrows/google-shopping-prices").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "searchQueries": [
    "sony wh-1000xm5"
  ],
  "country": "US"
}' |
apify call plainrows/google-shopping-prices --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,plainrows/google-shopping-prices"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/RYBNtCAXFfoCXE6uj/builds/x98LDraKSY4jz6pO4/openapi.json
