# Google Shopping Scraper - Prices & Offers (`maximedupre/google-shopping-offers-scraper`) Actor

Search public Google Shopping by product keyword or EAN, GTIN, or Google Shopping SKU. Get product titles, current prices, currencies, merchants, rankings, and price benchmarks in a structured dataset. Filter by market, language, price, condition, rating, delivery, sale status, or merchant.

- **URL**: https://apify.com/maximedupre/google-shopping-offers-scraper.md
- **Developed by:** [Maxime Dupré](https://apify.com/maximedupre) (community)
- **Categories:** E-commerce, Business, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.10 / 1,000 shopping 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

### 🛍️ Compare product offers across Google Shopping

Retail teams, ecommerce sellers, and product researchers can search public Google Shopping with product keywords or EAN, GTIN, and Google Shopping SKU values. The Actor saves each first eligible offer match once, with its product title, current price, currency, merchant, query rank, and price benchmark. Use these rows to compare offers for a chosen market and language.

- Compare current prices with **[Google Shopping Price Comparison](https://apify.com/maximedupre/google-shopping-offers-scraper/examples/google-shopping-price-comparison)**.
- Compare seller prices for one product with **[Shopping Price Comparison](https://apify.com/maximedupre/google-shopping-offers-scraper/examples/shopping-price-comparison)**.
- Collect product offer rows with **[Ecommerce Price Scraper](https://apify.com/maximedupre/google-shopping-offers-scraper/examples/ecommerce-price-scraper)**.
- Check a product's current offers with **[Product Price Scraper](https://apify.com/maximedupre/google-shopping-offers-scraper/examples/product-price-scraper)**.
- Review merchant and price data with **[Google Shopping Offers Scraper](https://apify.com/maximedupre/google-shopping-offers-scraper/examples/google-shopping-offers-scraper)**.

#### 📦 Google Shopping offer rows

Each dataset row is one offer returned for a submitted keyword or identifier. It includes the product title, current displayed price, currency, merchant, query rank, a price benchmark, and the lowest-priced returned offer. Google may also provide a brand, image, rating, shipping details, return terms, condition, or sale details.

If the same offer appears through another submitted value, the saved row keeps the value that found it first. Rows reflect public Google Shopping data available at collection time. The Actor does not promise real-time merchant pricing, every seller or offer, or a direct merchant listing URL when Google does not expose one.

#### 🚀 Find offers with keywords or identifiers

**Run steps**

1. Choose **Product keywords** or **Product identifiers**.
2. Add one or more product keywords, or add EAN, GTIN, or Google Shopping SKU values, in the matching section.
3. Choose the Google Shopping market and result language.
4. Add optional price, condition, sale, merchant, rating, review, delivery, or sort settings.
5. Set **Max offers per query** or leave it empty to return all available offers until the source is exhausted.
6. Start the Actor and open the default dataset.

The Actor uses public Google Shopping data and does not need a customer-provided Google credential or login. Each run uses one list. Values in the other choice section are ignored. When a result matches more than one submitted keyword or identifier, only its first eligible match is saved.

#### ⚙️ Input

Choose one discovery method. Add values only to its matching list. Choose a market and language for the Google Shopping results.

**Input fields**

| Field | Type | What it does |
|---|---|---|
| `discoveryMethod` | string | Chooses `keywords` or `identifiers`. |
| `productKeywords` | string\[] | Adds one or more product search phrases, one per item. Used when `discoveryMethod` is `keywords`. |
| `productIdentifiers` | string\[] | Adds one or more EAN, GTIN, or Google Shopping SKU values. Used when `discoveryMethod` is `identifiers`. |
| `market` | string | Sets the two-letter Google Shopping market code, such as `US`, `GB`, or `DE`. |
| `language` | string | Sets the result language code, such as `en`, `de`, or `fr`. A country code can be added when needed, such as `pt-BR`. |
| `priceRange` | object | Sets optional lower and upper prices in the selected market currency. |
| `priceRange.min` | number | Sets the lower price bound. Use zero or a positive number. |
| `priceRange.max` | number | Sets the upper price bound. Use zero or a positive number. |
| `conditions` | string\[] | Keeps offers with the selected conditions: `new`, `used`, or `refurbished`. |
| `saleOnly` | boolean | When `true`, keeps only offers that Google marks as discounted. |
| `merchants` | string\[] | Keeps offers from the listed merchant or marketplace names. |
| `minimumRating` | number | Keeps products rated from this value up to 5 stars. |
| `minimumReviewCount` | integer | Keeps products with at least this many reviews. Use zero or a positive number. |
| `freeDeliveryOnly` | boolean | When `true`, keeps only offers that show free delivery. |
| `sortOrder` | string | Orders offers by `relevance`, `price`, `rating`, `reviews`, or `discount`. |
| `maxOffersPerQuery` | integer | Stops after this many offers for each keyword or identifier. Leave it empty to return all available offers until the source is exhausted. |

This is the public input from the successful current-beta default-input run:

```json
{
  "discoveryMethod": "keywords",
  "productKeywords": [
    "wireless headphones"
  ],
  "market": "US",
  "language": "en",
  "saleOnly": false,
  "freeDeliveryOnly": false,
  "sortOrder": "relevance",
  "maxOffersPerQuery": 10
}
```

#### 🧾 Output

Optional fields are absent when Google Shopping does not provide the related detail.

**Run output**

| Field | Type | What it does |
|---|---|---|
| `dataset` | string | Opens the Google Shopping offer rows in the default dataset. |

**Dataset rows**

| Field | Type | What it does |
|---|---|---|
| `query` | string | The keyword or identifier that first produced the offer. |
| `queryType` | string | Shows whether `query` is a `keyword` or an `identifier`. |
| `queryRank` | integer | The offer rank among offers returned for `query`. |
| `product` | object | Holds the product details shown by Google Shopping. |
| `product.title` | string | The product title shown by Google Shopping. |
| `product.brand` | string | The product brand when Google Shopping provides it. |
| `product.googleProductId` | string | Google's product identifier when available. |
| `product.imageUrl` | string | The product image URL when Google Shopping provides one. |
| `merchant` | object | Holds the merchant details for this offer. |
| `merchant.name` | string | The merchant or marketplace seller name shown by Google Shopping. |
| `price` | object | Holds the current displayed offer price and currency. |
| `price.amount` | number | The current displayed price amount. |
| `price.currency` | string | The currency code for the current price. |
| `price.previousAmount` | number | The previous displayed price when Google Shopping shows a promotion. |
| `price.discountText` | string | The sale or discount text shown by Google Shopping when available. |
| `rating` | object | Holds product rating details when Google Shopping provides them. |
| `rating.stars` | number | The product star rating shown by Google Shopping. |
| `rating.reviewCount` | integer | The product review count shown by Google Shopping. |
| `shipping` | object | Holds delivery or shipping details when Google Shopping provides them. |
| `shipping.text` | string | The delivery or shipping terms shown by Google Shopping. |
| `shipping.cost` | object | Holds the numeric shipping cost when Google Shopping provides it. |
| `shipping.cost.amount` | number | The shipping cost amount. Zero means free shipping when the source provides that value. |
| `shipping.cost.currency` | string | The currency code for the shipping cost. |
| `returns` | object | Holds return terms when Google Shopping provides them. |
| `returns.text` | string | The return terms shown by Google Shopping. |
| `condition` | string | The offer condition when Google Shopping exposes it: `new`, `used`, or `refurbished`. |
| `priceBenchmark` | object | Holds the price benchmark for offers returned for the same query. |
| `priceBenchmark.amount` | number | The benchmark price amount for the query. |
| `priceBenchmark.currency` | string | The currency code for the query price benchmark. |
| `lowestPriceOffer` | object | Holds the returned offer with the lowest current price for the same query. |
| `lowestPriceOffer.productTitle` | string | The product title of the lowest-priced returned offer. |
| `lowestPriceOffer.googleProductId` | string | Google's product identifier for the lowest-priced offer when available. |
| `lowestPriceOffer.merchantName` | string | The merchant or marketplace seller for the lowest-priced offer. |
| `lowestPriceOffer.price` | object | Holds the current price of the lowest-priced returned offer. |
| `lowestPriceOffer.price.amount` | number | The current price amount of the lowest-priced offer. |
| `lowestPriceOffer.price.currency` | string | The currency code for the lowest-priced offer. |

**Example offer row**

This genuine row is from the successful current-beta default-input run. It is shortened because the product image URL is large. The `"..."` value marks the omitted image data.

```json
{
  "query": "wireless headphones",
  "queryType": "keyword",
  "queryRank": 1,
  "product": {
    "title": "Anker Soundcore Sport X20 True Wireless Headphones",
    "googleProductId": "10833874325720519961",
    "imageUrl": "..."
  },
  "merchant": {
    "name": "Best Buy"
  },
  "price": {
    "amount": 79.99,
    "currency": "USD"
  },
  "priceBenchmark": {
    "amount": 79.99,
    "currency": "USD"
  },
  "lowestPriceOffer": {
    "productTitle": "JLab Rewind 2 Wireless Retro Headphones hbrewind2rblk4",
    "merchantName": "JLab",
    "price": {
      "amount": 26.99,
      "currency": "USD"
    },
    "googleProductId": "4839705362323684555"
  },
  "rating": {
    "stars": 4.5,
    "reviewCount": 2100
  },
  "shipping": {
    "text": "Free delivery",
    "cost": {
      "amount": 0,
      "currency": "USD"
    }
  }
}
```

#### 💳 Pricing

This Actor uses pay-per-event pricing. The `Shopping offer` event charges for each offer saved to the default dataset. The exact price is shown on the Pricing tab and can vary by plan tier.

#### 🔌 Integrations

https://www.youtube.com/watch?v=bNACk1\_S\_6w\&list=PLObrtcm1Kw6MUrlLNDbK9QRg8VDJg0gOW\&index=4

Use the dataset link in the run output or the Apify API to read saved rows. You can schedule runs in Apify when you need repeated collections. This Actor does not keep price history or send alerts.

#### ❓ FAQ

##### What happens when one offer matches more than one submitted value?

The Actor saves the first eligible match and ignores later matches for that offer. The row keeps the keyword or identifier that first caused it to be saved.

##### Can I use EAN, GTIN, or Google Shopping SKU values?

Yes. Choose **Product identifiers** and add one or more values. The output sets `queryType` to `identifier` for those rows.

##### Why is a rating, shipping detail, or return term missing?

Google Shopping does not show every detail for every offer. Optional fields are left out when the source does not provide them.

##### Can I filter and sort the offers?

Yes. You can set a price range, condition, sale-only, merchant, minimum rating, minimum review count, or free-delivery filter. You can also order offers by relevance, price, rating, reviews, or discount.

##### What if I leave Max offers per query empty?

The Actor returns all available offers for each query until the source is exhausted. There is no fixed maximum in the input schema.

##### Are prices real-time and exhaustive?

No. Rows show public Google Shopping data available at collection time. Prices can lag a merchant, and Google may not show every seller or offer.

##### Does the Actor need a Google login or private data?

No. It uses public Google Shopping data and does not collect private, account-only, or personal data from Google Shopping or merchants.

##### Does it keep price history or send alerts?

No. The Actor returns current rows for a run. It does not provide built-in historical price monitoring, alerting, or a time-series service.

### 📝 Changelog

**v0.0** (30-09-2026)

- Initial release.

### 🆘 Support

For issues, questions, or feature requests, [file a ticket](https://console.apify.com/actors/maximedupre~google-shopping-offers-scraper/issues) and I'll fix or implement it in less than 24h 🫡

### 🔗 Related Actors

- [Google Shopping Ads Scraper](https://apify.com/maximedupre/google-shopping-ads-scraper): collect paid Shopping ads for keyword and merchant research.
- [Amazon Price Tracker](https://apify.com/maximedupre/amazon-price-tracker): compare public Amazon prices with Google Shopping offers.
- [MercadoLibre Search Scraper](https://apify.com/maximedupre/mercado-libre-search-scraper): compare marketplace prices, sellers, shipping, ratings, images, and rank by query.
- [Trendyol Scraper: Products & Reviews](https://apify.com/maximedupre/trendyol-scraper): research another marketplace's products, sellers, prices, and reviews.
- [Allegro Scraper for Prices, Sellers, and Specs](https://apify.com/maximedupre/allegro-scraper): collect public Allegro offers, seller data, delivery, and prices.

**Made with ❤️ by Maxime Dupré**

# Actor input Schema

## `discoveryMethod` (type: `string`):

Choose one way to find Google Shopping offers. Use Product keywords for searches such as a product name, or Product identifiers for EAN, GTIN, or Google Shopping SKU values.

## `productKeywords` (type: `array`):

Add one or more product keywords, with one search phrase per item. This list is used when Product keywords is selected.

## `productIdentifiers` (type: `array`):

Add one or more EAN, GTIN, or Google Shopping SKU values, with one identifier per item. This list is used when Product identifiers is selected.

## `market` (type: `string`):

Enter a two-letter country code for the Google Shopping market, such as US, GB, or DE.

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

Enter the language code for Google Shopping results, such as en, de, or fr. Add a country code only when needed, such as pt-BR.

## `priceRange` (type: `object`):

Optionally set a lower and upper price in the selected market currency. Leave either value empty when that side of the range has no limit.

## `conditions` (type: `array`):

Optionally return only offers with one of the selected Google Shopping conditions.

## `saleOnly` (type: `boolean`):

When enabled, return only offers that Google marks as discounted.

## `merchants` (type: `array`):

Optionally add merchant or marketplace names. Return only offers from these names.

## `minimumRating` (type: `number`):

Optionally require a product rating from 0 to 5 stars.

## `minimumReviewCount` (type: `integer`):

Optionally require at least this many product reviews. Use zero or a positive number.

## `freeDeliveryOnly` (type: `boolean`):

When enabled, return only offers that show free delivery.

## `sortOrder` (type: `string`):

Choose how offers are ordered within each keyword or identifier query.

## `maxOffersPerQuery` (type: `integer`):

Optionally stop after this many offers for each submitted keyword or identifier. Leave it empty to return all available offers until the source is exhausted.

## Actor input object example

```json
{
  "discoveryMethod": "keywords",
  "productKeywords": [
    "wireless headphones"
  ],
  "market": "US",
  "language": "en",
  "saleOnly": false,
  "freeDeliveryOnly": false,
  "sortOrder": "relevance",
  "maxOffersPerQuery": 10
}
```

# Actor output Schema

## `dataset` (type: `string`):

Open the Google Shopping offers in the default dataset.

# 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 = {
    "discoveryMethod": "keywords",
    "productKeywords": [
        "wireless headphones"
    ],
    "market": "US",
    "language": "en",
    "maxOffersPerQuery": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("maximedupre/google-shopping-offers-scraper").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 = {
    "discoveryMethod": "keywords",
    "productKeywords": ["wireless headphones"],
    "market": "US",
    "language": "en",
    "maxOffersPerQuery": 10,
}

# Run the Actor and wait for it to finish
run = client.actor("maximedupre/google-shopping-offers-scraper").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 '{
  "discoveryMethod": "keywords",
  "productKeywords": [
    "wireless headphones"
  ],
  "market": "US",
  "language": "en",
  "maxOffersPerQuery": 10
}' |
apify call maximedupre/google-shopping-offers-scraper --silent --output-dataset

```

## MCP server setup

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

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/uhdBZ5FaasMPfbPHO/builds/Cdrt4BIhMg9IDuidI/openapi.json
