# Google Shopping Scraper - Price Comparison & UPC (`wrenfield-data/google-shopping-price-comparison`) Actor

Compare Google Shopping prices by keyword, barcode (UPC/EAN/GTIN), product ID or URL. Every seller offer with price, shipping, total, condition and stock, plus min/max/typical price. Price monitoring flags price drops and new or removed sellers. 45 countries.

- **URL**: https://apify.com/wrenfield-data/google-shopping-price-comparison.md
- **Developed by:** [Wrenfield Data](https://apify.com/wrenfield-data) (community)
- **Categories:** E-commerce
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.30 / 1,000 product results

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 Price Comparison & Barcode (UPC/EAN) Lookup

Compare prices across stores on **Google Shopping** and look up products **by barcode (UPC, EAN, GTIN)**. For every product you get the lowest, highest and typical price, the number of sellers, rating and reviews. You also get **every seller offer**, with price, shipping, total price, condition, availability, seller rating and a **direct link to the store** (not a Google redirect). Works in 45 countries. A built-in **price-monitoring mode** tells you what changed since the last run.

Use it to:

- **Compare prices** for a product across Amazon, Walmart, Target, Best Buy, eBay and thousands of other stores.
- **Look up barcodes** (UPC-A, EAN-13, EAN-8, GTIN-14) in bulk and get the product name, brand, image and current market prices.
- **Monitor prices and sellers** daily. See price drops, price increases, and new or removed sellers.
- **Do MAP / reseller monitoring**, competitor price intelligence, repricing, and catalog enrichment from barcodes.

💸 **$2 per 1,000 products** and **$0.50 per 1,000 seller offers** (the top Google Shopping scrapers in the Store charge a median $3.25 per 1,000). Try it on Apify's free plan ($5 of monthly credit, no credit card).

#### Sample output

| Product | Min price | Max price | Sellers | Rating |
|---|---|---|---|---|
| FOLGERS Classic Roast Ground Coff… | 15.49 | 37.88 | 5 | 4.54 |
| Mr. Coffee 12 Cup Programmable Co… | 39.99 | 274.12 | 3 | 4 |

<sub>Real rows from the prefilled example run (Oct 19, 2026), 5 of 35+ fields shown. Export as JSON, CSV, Excel or HTML, or read them through the API.</sub>

### What data can you get?

| Product rows (`type: "product"`) | Offer rows (`type: "offer"`) |
|---|---|
| Title, brand, Google product ID, GTIN / UPC / EAN | Seller (store) name and domain |
| Image, description, specifications (with details) | Price, shipping, **total price**, currency |
| Rating and number of reviews | Condition (new / used / refurbished) |
| **Min / max / typical price**, cheapest total price, cheapest seller | Availability (in stock / out of stock) |
| Number of sellers, headline price and seller | Seller rating and reviews count |
| Google Shopping URL, manufacturer URL | **Direct offer URL** at the store |
| Price-monitoring status (`priceMonitor.status`: new / price_drop / ...) | Change status vs. the previous run |

### How to use

1. Enter **search queries** (e.g. `coffee maker`), **barcodes** (UPC/EAN/GTIN), **Google product IDs** or **Google Shopping product URLs**. You can mix them in one run.
2. Pick the **country** (and optionally the language and a city/ZIP/region), plus sort, price range and condition filters.
3. Keep **Get all seller offers** on to get every store's price for each product, and set **max offers per product**.
4. Run the Actor and download the results as JSON, CSV or Excel, or read them through the API.

### Input example

```json
{
  "queries": ["coffee maker"],
  "gtins": ["025500304076", "5060033821114"],
  "productIds": ["14870010698400265781"],
  "country": "US",
  "sort": "price_low_to_high",
  "minPrice": 20,
  "condition": "new",
  "maxProducts": 50,
  "fetchOffers": true,
  "maxOffersPerProduct": 20
}
```

### Output example

Product row (barcode lookup):

```json
{
  "type": "product",
  "title": "FOLGERS Classic Roast Ground Coffee",
  "productId": "14870010698400265781",
  "gtin": "025500304076",
  "gtin14": "00025500304076",
  "brand": "Folgers",
  "rating": 4.52,
  "reviewsCount": 10152,
  "price": 16.48,
  "minPrice": 12.96,
  "maxPrice": 43.99,
  "typicalPrice": 19.99,
  "cheapestSeller": "Home Depot",
  "sellersCount": 10,
  "currency": "USD",
  "googleShoppingUrl": "https://www.google.com/search?ibp=oshop&q=oid:...&prds=...",
  "match": {"method": "barcode_search", "confidence": "high", "searchRank": 1},
  "source": {"type": "barcode", "input": "025500304076"},
  "country": "US"
}
```

Offer row:

```json
{
  "type": "offer",
  "productId": "14870010698400265781",
  "gtin": "025500304076",
  "productTitle": "FOLGERS Classic Roast Ground Coffee",
  "sellerName": "Target",
  "offerTitle": "Folgers Classic Medium Roast Ground Coffee - 25.9oz",
  "price": 15.49,
  "shippingPrice": 5.99,
  "totalPrice": 21.48,
  "currency": "USD",
  "condition": "new",
  "availability": "in_stock",
  "sellerRating": 4.46,
  "sellerReviewsCount": 2073,
  "offerUrl": "https://www.target.com/p/folgers-classic-medium-roast-ground-coffee-25-9oz/-/A-13397813",
  "merchantDomain": "target.com"
}
```

The dataset has ready-made views: **Products overview**, **Seller offers**, **Price changes** and **Product details**. A `SUMMARY` record in the key-value store has run statistics (products, offers, matched and unmatched barcodes, changes).

### Barcode (UPC / EAN / GTIN) lookup – how matching works

Google Shopping does not have an exact "search by barcode" filter. A barcode query often returns the right product mixed with unrelated sponsored "deals". This Actor does not just take the first result:

1. It validates the barcode (check digit; UPC-A, EAN-13, EAN-8, GTIN-14 and UPC with or without the leading zero).
2. It checks what the barcode **is** on the web and builds a fingerprint of the product name and brand from several independent sources.
3. It picks the Google Shopping product that matches that fingerprint, and it must contain the brand. If nothing matches, it searches Google Shopping by the product's name.
4. Each row tells you how it matched: `match.method` (`barcode_search` or `name_search`) and `match.confidence` (`high` / `medium` / `low`).

Barcodes that cannot be found come back as a `not_found` row, and **you are not charged for them**.

**Measured accuracy (October 2026, 21 real barcodes across the US, UK and Germany):** 18 matched the correct product, 2 were not found, and 1 matched the wrong product (since fixed by the brand check). Some multipacks and flavour variants match to the product family. Check `match.confidence` if you need exact pack sizes.

### Price monitoring (compare with the previous run)

Set **Price monitoring store name** (e.g. `my-prices`) and schedule the Actor daily with the same input. Each product row gets a `priceMonitor` object with:

- `status`: `new`, `price_drop`, `price_increase`, `sellers_changed` or `unchanged`
- `previousPrice`, `priceChange`, `priceChangePct` and `previousRunAt`
- `newSellers` and `removedSellers`

Each offer gets a `changeStatus`, and removed offers are reported too. Turn on **Output only changes** to get only what changed, which is ideal for alerts through webhooks, Slack, email or Zapier. Snapshots are kept per country, language and location in a named key-value store on your account.

### Chain with Walmart Product Scraper (UPC → price comparison)

[Walmart Product Scraper](https://apify.com/wrenfield-data/walmart-product-scraper) outputs each product's `upc` and `gtin14`. Feed them into this Actor to see what every other store charges for the same item:

1. Run Walmart Product Scraper (search, category or item IDs).
2. Collect the `upc` values from its dataset. With the API: `GET https://api.apify.com/v2/datasets/<datasetId>/items?fields=upc&clean=true`.
3. Start this Actor with `{"gtins": [<those UPCs>], "country": "US", "fetchOffers": true}`.

You can automate this with an Apify **integration (webhook)** on the Walmart run that starts this Actor, or with a few lines in Python:

```python
from apify_client import ApifyClient
client = ApifyClient("<APIFY_TOKEN>")
wm = client.actor("wrenfield-data/walmart-product-scraper").call(run_input={"searchKeywords": ["air fryer"], "maxItems": 20})
upcs = [i["upc"] for i in client.dataset(wm["defaultDatasetId"]).iterate_items() if i.get("upc")]
gs = client.actor("wrenfield-data/google-shopping-price-comparison").call(run_input={"gtins": upcs, "country": "US"})
for row in client.dataset(gs["defaultDatasetId"]).iterate_items():
    print(row["type"], row.get("title") or row.get("sellerName"), row.get("minPrice") or row.get("totalPrice"))
```

The other direction also works. Offers sold on walmart.com include `walmartItemId`, which you can pass to Walmart Product Scraper's `productIds` to get stock, the Buy Box seller and reviews.

### Reliability and performance

The Actor uses a commercial SERP data provider to get Google Shopping results, so there are no CAPTCHAs, blocked IPs or proxies for you to manage. Failed upstream requests are retried automatically. Offer links are resolved from Google redirects to the store's own URL.

**Measured on the Apify platform (October 2026)**, 3 runs (US, UK, DE), each with 8 search products plus barcodes and up to 10 offers per product:

| Test | Result |
|---|---|
| Search products | 24/24 returned with prices and offers |
| Barcode lookups | 19/21 found (18 correct) |
| Products / offers | 43 products, 379 offers; **100% of offers with a direct store URL** |
| Run time | 4–5 minutes per run (upstream processing; larger runs are processed in parallel) |

### Pricing

This Actor uses **pay-per-event** pricing. You only pay for results. Platform usage (compute) is included.

| Event | Price |
|---|---|
| Product (`product-result`) | **$2.00 per 1,000 products** |
| Barcode lookup (`barcode-lookup`) – a product matched from a UPC/EAN/GTIN, details included | $0.012 per matched barcode |
| Product details (`product-details`) – product ID/URL lookups, or *Product details for search results* for search results | $0.003 per product |
| Seller offer (`offer-result`) | **$0.50 per 1,000 offers** |
| Actor start (`actor-start`) | $0.001 per run |

Example: comparing prices for 100 barcodes with 10 offers each costs about 100 × ($0.002 + $0.012) + 1,000 × $0.0005 = **$1.90**. Barcodes that are not found, retries and failed requests are **free**. Set **Maximum cost per run** in the run options to cap your spend. The Actor stops cleanly at that limit and keeps everything collected so far.

On the Apify Free plan, runs are limited to 10 products and 10 offers per product. Upgrade to any paid plan to remove these limits.

### Related tools

Compare marketplace prices with retailer-level data from Walmart, Home Depot, Lowe's and Shopify stores.

- [Walmart Scraper](https://apify.com/wrenfield-data/walmart-product-scraper): Walmart prices, stock, sellers and reviews
- [Home Depot & Lowe's Scraper](https://apify.com/wrenfield-data/home-depot-lowes-scraper): prices, store stock and aisle locations
- [Shopify Store Scraper & Price Monitor](https://apify.com/wrenfield-data/shopify-store-scraper): full catalogs and price/stock change alerts for any Shopify store

All of these are maintained by the same developer and export flat JSON, CSV or Excel, so you can feed one tool's dataset into the next.

### FAQ

**Can I search Google Shopping by UPC or EAN?**
Yes. Put the barcodes in **Barcodes (UPC / EAN / GTIN)**. Each barcode is matched to a Google Shopping product and you get its offers. See "how matching works" above.

**How accurate is the barcode lookup?**
In our tests about 86% of barcodes matched the exact product and about 10% were not listed on Google Shopping in that country (those are free). Every row has `match.confidence`. Use `high` and `medium` for automated pipelines.

**Why is a barcode "not found"?**
The product isn't sold by any store on Google Shopping in the chosen country, or the barcode isn't publicly known (common for private-label products). Try the country where the product is sold.

**Which countries are supported?**
45 countries, including the US, UK, Germany, France, Italy, Spain, the Netherlands, Canada, Australia, India, Japan and Brazil. You can also set a city, ZIP code or region for local prices.

**Does it include shipping and tax?**
`shippingPrice` and `totalPrice` are included whenever Google shows them. In the US, prices exclude sales tax, as on Google Shopping.

**Can I get all sellers for a product?**
Yes. Turn on **Get all seller offers** and set **max offers per product** (up to 100).

**How do I get a Google product ID?**
It is the number in a `google.com/shopping/product/<ID>` URL, or the `catalogid` in a newer Google Shopping URL. You can paste either form, or take `productId` from a previous run.

**Is it legal to scrape Google Shopping?**
The Actor collects publicly visible product listings and prices. It does not log in or access personal data. You are responsible for how you use the data and for compliance with the laws and terms that apply to you. This Actor is not affiliated with, endorsed by, or sponsored by Google.

**Can I use it from Python, Make, Zapier, n8n or an AI agent?**
Yes. You can call it through the Apify API, the Python or JavaScript client, the Apify MCP server or any Apify integration.

### Acceptable use

- This Actor is an independent tool. It is not affiliated with, endorsed by or sponsored by Google, DataForSEO or the merchants whose offers appear.
- Don't use the data to build a competing search engine, or otherwise to compete with or harm Google or the other search engines the data comes from.
- The Actor may not be used from, or for people or organizations in, Russia, Belarus, Cuba, Iran, Syria, Myanmar, North Korea, Crimea or the Russian-occupied territories of Ukraine.
- You are responsible for using the results lawfully, including privacy laws such as GDPR for any personal data they contain.

# Actor input Schema

## `queries` (type: `array`):

Product searches, exactly as you would type them into Google Shopping (e.g. <code>air fryer</code>, <code>iphone 15 128gb</code>). One product row per result, up to <b>Max products per query</b>. You can also paste a Google Shopping search URL.

## `gtins` (type: `array`):

Barcodes to look up, one per line: 12-digit UPC, 13-digit EAN, 14-digit GTIN or 8-digit EAN-8 (e.g. <code>025500304076</code>). Each barcode is matched to its Google Shopping product and verified against independent web listings for that barcode. Barcodes that cannot be matched are listed as <code>not_found</code> and are free.

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

Google Shopping product IDs (the <code>productId</code> from a previous run, e.g. <code>14870010698400265781</code>) or Google Shopping product URLs (<code>google.com/shopping/product/...</code> or <code>google.com/search?ibp=oshop&...prds=...</code> links). Best for monitoring a fixed list of products.

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

Google Shopping country. Prices, sellers and currency are for this country.

## `language` (type: `string`):

Language code such as <code>en</code>, <code>de</code>, <code>fr</code>, <code>es</code>, <code>pt-BR</code>. Leave empty for the country's main language.

## `location` (type: `string`):

Get local results for a place inside the country, e.g. <code>10001</code>, <code>Chicago</code>, <code>Bavaria</code> or <code>London,England,United Kingdom</code>. Leave empty for the whole country.

## `sort` (type: `string`):

Sort order for search queries (barcodes and product IDs are not affected).

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

Only search results at or above this price (whole currency units).

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

Only search results at or below this price (whole currency units).

## `condition` (type: `string`):

Filters seller offers by condition. For search results it removes or keeps products whose title says refurbished / renewed / used / pre-owned (best effort).

## `maxProducts` (type: `integer`):

Maximum product rows for the whole run (barcodes and product IDs first, then search results). Duplicate products are skipped.

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

How many results to take from each search query (Google Shopping returns up to about 120).

## `fetchOffers` (type: `boolean`):

For every product, get the seller offers (Compare prices list): seller, price, shipping, total, condition, availability, seller rating and offer URL. Also fills min/max/typical price and number of sellers. Turn off for a cheaper product-only scrape.

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

Maximum seller offers per product (Google lists up to about 100).

## `includeDetails` (type: `boolean`):

Also get brand, description, all images, specifications and variants for each search result (adds the product-details event per product). Barcode and product ID lookups always include details.

## `resolveOfferUrls` (type: `boolean`):

Turn Google redirect links into the direct merchant product URL (e.g. the walmart.com or target.com page). Off = keep Google's redirect link.

## `monitoringStoreName` (type: `string`):

Turn on price monitoring: give a name (e.g. <code>my-price-watch</code>). Each run is compared with the previous run that used the same name, country and language. Products get a <code>priceMonitor</code> object (price drop / increase, new and removed sellers) and offers get <code>changeStatus</code>. Removed sellers are added as free offer rows. Schedule the Actor to monitor prices daily.

## `onlyChanges` (type: `boolean`):

With price monitoring on, skip products whose price and sellers did not change (they are not charged) and unchanged offers.

## `minPriceChangePct` (type: `integer`):

Price changes below this percentage count as unchanged.

## Actor input object example

```json
{
  "queries": [
    "coffee maker"
  ],
  "gtins": [
    "025500304076"
  ],
  "country": "US",
  "sort": "relevance",
  "condition": "any",
  "maxProducts": 2,
  "maxProductsPerQuery": 40,
  "fetchOffers": true,
  "maxOffersPerProduct": 10,
  "includeDetails": false,
  "resolveOfferUrls": true,
  "onlyChanges": false,
  "minPriceChangePct": 0
}
```

# Actor output Schema

## `products` (type: `string`):

No description

## `offers` (type: `string`):

No description

## `changes` (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 = {
    "queries": [
        "coffee maker"
    ],
    "gtins": [
        "025500304076"
    ],
    "maxProducts": 2,
    "maxOffersPerProduct": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("wrenfield-data/google-shopping-price-comparison").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 = {
    "queries": ["coffee maker"],
    "gtins": ["025500304076"],
    "maxProducts": 2,
    "maxOffersPerProduct": 10,
}

# Run the Actor and wait for it to finish
run = client.actor("wrenfield-data/google-shopping-price-comparison").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 '{
  "queries": [
    "coffee maker"
  ],
  "gtins": [
    "025500304076"
  ],
  "maxProducts": 2,
  "maxOffersPerProduct": 10
}' |
apify call wrenfield-data/google-shopping-price-comparison --silent --output-dataset

```

## MCP server setup

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

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/TG5YgzyrcRFVJgbX4/builds/bHeXAwYLela6j3N2d/openapi.json
