# Google Shopping Scraper & Price Tracker (MAP Monitor) (`s_actors/google-shopping-price-tracker`) Actor

Scrape Google Shopping in any country and city: products, prices, sellers, discounts, ratings. Find every seller of a product, the lowest price and MAP violations, and get only-changes price alerts. Reliable: market pinned on every request.

- **URL**: https://apify.com/s\_actors/google-shopping-price-tracker.md
- **Developed by:** [Superior Actors](https://apify.com/s_actors) (community)
- **Categories:** E-commerce, Automation, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.20 / 1,000 product or seller rows

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 Scraper & Price Tracker (MAP Monitor)

Scrape **Google Shopping** results in **any of 25 countries and any city**: product, price, old price and % off, seller and marketplace seller, condition, delivery, returns, rating and reviews. Get **every seller of a product** with the **lowest price**, flag **MAP violations** (sellers below your minimum advertised price) and schedule it to receive **only changes**: price drops, price increases, new sellers, sellers gone, a new lowest price.

**Reliable by design**: Google Shopping switches the market by IP (a US search often comes back with Brazilian or Mexican prices). This Actor pins the country and city on every request and checks the currency of every page, retrying the wrong ones, so your data is always from the market you asked for.

Export as **JSON, CSV, Excel or HTML**, or use it as a **Google Shopping API**. No browser, no login, no proxy setup.

#### How it works

1. Choose what to do: **Search products by keyword** or **All sellers of a product**
2. Add keywords (`air fryer`), or product names (`Sony WH-1000XM5`), optionally with your MAP price: `Sony WH-1000XM5 | 329.99`
3. Pick the **country** (and optionally a **city**, e.g. `Chicago,Illinois`)
4. Optional: filters (price range, condition, stores, on sale, free delivery) and **Only changes** for scheduled alerts (see [Monitoring](#only-changes-how-monitoring-works))

#### Why this Actor

| | |
|---|---|
| 🌍 **Right market, every time** | Country and city pinned on each request; every page is checked by currency and page region, wrong ones are retried |
| 🏪 **All sellers of a product** | One row per store and condition, sorted by price, with the lowest price, seller count and marketplace seller (e.g. `Walmart - Secondipity`) |
| ⚖️ **MAP monitoring** | Set your minimum advertised price per product: new offers below it get `belowMap` and the gap in `mapGap`; used and refurbished offers are not flagged |
| 🔔 **Only changes** | Scheduled runs return only price drops and increases, new sellers, sellers gone, a new lowest price and new MAP violations |
| 💯 **Up to 200 products per keyword** | Google shows ~40 per search; above that the Actor opens Google's own price-range filters of the search |
| 📍 **City-level prices** | See prices and "nearby" stores as a shopper in Chicago, Manchester or Munich sees them |
| 💰 **Pay per result** | About $1.6 per 1,000 products, no subscription |

#### Use cases

- **MAP enforcement**: brands and distributors find sellers advertising below the minimum advertised price, every day
- **Competitor price monitoring**: track your products and your competitors' across all stores in Google Shopping
- **Price comparison and deals**: the lowest price of a product, discounts and "Low price" badges across stores
- **Unauthorized sellers**: new marketplace sellers of your products appear as `new_offer`
- **Market research**: prices, sellers and ratings of a whole category in any of 25 countries
- **AI agents**: give your assistant live Google Shopping prices through the Apify MCP server

#### Search products

Real example, September 2026: `sony wh-1000xm5`, United States (New York), first rows:

| Product | Price | Was | Seller | Condition | Delivery | Rating |
|---|---|---|---|---|---|---|
| Sony WH-1000XM5 Noise Canceling Wireless Headphones | $298.00 | $398 (25% off) | Walmart & more | New | Free delivery | 4.6 (17K) |
| Sony - WH-1000XM5 Wireless Noise Cancelling Over-the-Ear Headphones - Black | $259.99 | | Best Buy | New | Free delivery | 4.6 (17K) |
| Sony Wh-1000xm5/s Wireless Industry Leading Noise Canceling Bluetooth Headphones | $159.99 | usually $225 | Walmart - Secondipity | New | Free delivery | |
| Sony WH-1000XM5 Wireless Noise-Canceling Headphones | $148.99 | | Unclaimed Baggage & more | Pre-owned | Free delivery | 4.8 (1.8K) |
| Joyus Sony WH-1000XM5 Wireless Noise Canceling Headphones | $189.99 | | Target & more | Refurbished | Free delivery by Sat | 3.7 (16) |

#### All sellers of a product and MAP

Put the exact product name (brand and model, as shoppers search it) and, optionally, your MAP after `|`. The Actor keeps only the offers of that product (other models, bundles for other products and unrelated items on the page are dropped), one row per seller and condition, cheapest first.

Real example, September 2026: `Nintendo Switch OLED | 399`, United States, minimum price $150: 22 sellers, lowest $158, 7 new offers below MAP. Some of the rows:

| Store | Marketplace seller | Condition | Price | Lowest | Below MAP | Gap |
|---|---|---|---|---|---|---|
| Acryl-Line | | New | $158.00 | $158.00 | ✅ | -241.00 |
| GameStop | | Pre-owned | $229.99 | $158.00 | (used: not checked) | |
| Fourth Emerald Games | | New | $250.00 | $158.00 | ✅ | -149.00 |
| Walmart | HyperTech | New | $419.99 | $158.00 | | |

Tips for MAP checks: set **Min price** to drop accessories and suspicious listings, and **Exclude stores** (e.g. `eBay`, `Poshmark`) if you only police retailers. Google Shopping does not search by barcode (UPC/EAN): a barcode query returns unrelated products, so use the product name.

#### Only changes: how monitoring works

Turn on **Only changes (monitoring)** and schedule the Actor (e.g. daily). The first run saves the current offers. Every later run with the same **Monitor name** and country returns only:

| `change` | Meaning |
|---|---|
| `price_drop` / `price_increase` | A seller changed its price (`previousPrice` has the old one); ignore small moves with **Min price change, %** |
| `new_offer` | A seller not seen before (new store or marketplace seller) |
| `offer_gone` | A seller missing for **N runs in a row** (default 3: Google shows a slightly different set of offers on every search, so one missing run is not a seller leaving) |
| `new_lowest_price` | The lowest price of the product went down |
| `map_violation` / `map_violation_resolved` | A new offer fell below your MAP, or came back above it |

Unchanged offers are not returned and not charged. Use separate **Monitor names** for separate brands or clients.

#### Output fields

| Field | Example |
|---|---|
| `title`, `price`, `currency` | `Sony WH-1000XM5 Noise Canceling Wireless Headphones`, `298`, `USD` |
| `oldPrice`, `typicalPrice`, `discountPercent`, `onSale`, `badge`, `lowPrice` | `398`, `null`, `25`, `true`, `25% OFF`, `false` |
| `merchant`, `store`, `marketplaceSeller`, `moreSellers` | `Walmart - Secondipity`, `Walmart`, `Secondipity`, `true` |
| `condition`, `delivery`, `freeDelivery`, `returns` | `Pre-owned`, `Free delivery by Sat`, `true`, `30-day returns` |
| `rating`, `reviewsCount`, `unitPrice`, `nearby` | `4.6`, `17000`, `0.11`, `13 mi` |
| `lowestPrice`, `isLowest`, `sellersCount` (all sellers mode) | `158`, `true`, `22` |
| `mapPrice`, `belowMap`, `mapGap` | `399`, `true`, `-241` |
| `change`, `changes`, `previousPrice` (monitoring) | `price_drop`, `["price_drop"]`, `444.99` |
| `productId`, `offerId`, `catalogId`, `googleUrl` | Google ids and a link that opens the product in Google Shopping |
| `image` | Product image URL when Google provides one (some images are embedded in the page and not returned) |
| `query`, `position`, `country`, `location`, `checkedAt` | |

#### Pricing

Pay per event, no subscription needed. Apify Scale and Business plans pay less:

| Event | Free and Starter plans | Scale plan | Business plan |
|---|---|---|---|
| Run start | $0.002 | $0.002 | $0.002 |
| Google Shopping page (up to ~40 products) | $0.005 | $0.0045 | $0.004 |
| Product or seller row | $0.0015 | $0.00135 | $0.0012 |

Examples: 40 products for one keyword ≈ **$0.067**; 200 products ≈ $0.33; a daily MAP check of 20 products with 10 sellers each ≈ $0.40 a day, and in monitoring mode only changed rows are charged. Rows removed by your filters are free.

#### Ready-made tasks

- [Google Shopping Scraper: Products, Prices & Sellers](https://apify.com/s_actors/google-shopping-price-tracker/examples/google-shopping-scraper)
- [MAP Violation Monitoring: Sellers Below Your MAP](https://apify.com/s_actors/google-shopping-price-tracker/examples/map-violation-monitoring)
- [Competitor Price Monitoring on Google Shopping](https://apify.com/s_actors/google-shopping-price-tracker/examples/competitor-price-monitoring)

#### Input example

```json
{
  "mode": "products",
  "products": ["Sony WH-1000XM5 | 329.99", "Nintendo Switch OLED | 399"],
  "country": "us",
  "minPrice": 150,
  "excludeStores": ["eBay"],
  "onlyChanges": true,
  "monitorName": "my-brand"
}
```

#### Tips

- **Countries**: US, UK, Canada, Australia, New Zealand, Ireland, Germany, Austria, Switzerland, France, Belgium, Netherlands, Spain, Portugal, Italy, Sweden, Denmark, Norway, Finland, Poland, Czechia, India, Japan, Brazil, Mexico. Prices are in the country's currency; texts are in English.
- **City**: Google's form `City,Region` (`Chicago,Illinois`, `Manchester,England`, `Munich,Bavaria`). Empty = the largest city.
- **More than 40 products**: set **Max products per keyword** up to 200; each extra Google price range costs one page.
- **Export to Google Sheets** with our [Google Sheets Import & Export](https://apify.com/s_actors/google-sheets-import-export) Actor, or connect Zapier, Make, n8n or a webhook for Slack and email alerts.
- Other retail Actors: [Target](https://apify.com/s_actors/target-scraper), [Home Depot](https://apify.com/s_actors/home-depot-scraper).

# Actor input Schema

## `mode` (type: `string`):

Search products: Google Shopping results for keywords (up to 200 per keyword). All sellers of a product: every store that sells a product (by its exact name), with the lowest price and MAP violations.

## `keywords` (type: `array`):

Search mode: what to search on Google Shopping, one per line (e.g. "air fryer", "iphone 16 case", "nike pegasus 41").

## `products` (type: `array`):

All sellers mode: one product per line, brand and model as shoppers search it (e.g. "Sony WH-1000XM5", "Nintendo Switch OLED"). Add your MAP price after "|" to flag sellers below it, e.g. "Sony WH-1000XM5 | 329.99". Google Shopping does not search by barcode (UPC/EAN).

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

Google Shopping market: prices, stores and currency of this country. Every request is pinned to it (Google otherwise switches markets by IP).

## `city` (type: `string`):

Prices and "nearby" stores as a shopper in this city sees them, in Google's form "City,Region" (e.g. "Chicago,Illinois", "Manchester,England"). Empty = the largest city of the country.

## `maxResultsPerQuery` (type: `integer`):

Google shows about 40 products per search. Above 40, the Actor also opens Google's price-range filters of the search to reach up to 200 (one extra Google page per range).

## `minPrice` (type: `number`):

Only products at or above this price (in the country's currency). Useful to drop accessories and suspicious listings when comparing sellers.

## `maxPrice` (type: `number`):

Only products at or below this price.

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

New only, used and refurbished only, or any.

## `stores` (type: `array`):

Keep only offers from stores whose name contains one of these words (e.g. "Walmart", "Best Buy", "Amazon").

## `excludeStores` (type: `array`):

Drop offers from stores whose name contains one of these words (e.g. your own store).

## `onlyOnSale` (type: `boolean`):

Only products with a discount (old price, "% OFF" or "SALE").

## `onlyFreeDelivery` (type: `boolean`):

Only offers with free delivery.

## `mapPrice` (type: `number`):

Minimum advertised price. New offers below it get belowMap = true and the gap in mapGap. A price after "|" on a product line overrides it for that product.

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

Remember prices and return only what changed since the last run with the same monitor name: price drops and increases, new sellers, sellers gone, a new lowest price, new MAP violations. Schedule the Actor to get alerts. The first run saves the current state.

## `monitorName` (type: `string`):

Separate monitors keep separate memories (e.g. one per brand or client).

## `minPriceChangePercent` (type: `number`):

Monitoring: ignore price changes smaller than this percent.

## `goneAfterMissedRuns` (type: `integer`):

Monitoring: Google shows a slightly different set of offers on every search, so a seller is reported as gone only after it is missing this many runs in a row.

## `maxConcurrency` (type: `integer`):

Google pages loaded at the same time.

## Actor input object example

```json
{
  "mode": "search",
  "keywords": [
    "sony wh-1000xm5"
  ],
  "country": "us",
  "maxResultsPerQuery": 40,
  "condition": "any",
  "onlyOnSale": false,
  "onlyFreeDelivery": false,
  "onlyChanges": false,
  "monitorName": "default",
  "minPriceChangePercent": 0,
  "goneAfterMissedRuns": 3,
  "maxConcurrency": 5
}
```

# Actor output Schema

## `overview` (type: `string`):

Search results: price, seller, rating.

## `sellers` (type: `string`):

All sellers of each product: lowest price, MAP violations.

## `deals` (type: `string`):

Discounted products.

## `changes` (type: `string`):

Monitoring: price drops and increases, new and gone sellers, MAP violations.

## `all` (type: `string`):

Every field of every row.

# 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 = {
    "keywords": [
        "sony wh-1000xm5"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("s_actors/google-shopping-price-tracker").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 = { "keywords": ["sony wh-1000xm5"] }

# Run the Actor and wait for it to finish
run = client.actor("s_actors/google-shopping-price-tracker").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 '{
  "keywords": [
    "sony wh-1000xm5"
  ]
}' |
apify call s_actors/google-shopping-price-tracker --silent --output-dataset

```

## MCP server setup

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

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/IjTrizaXknGIE8Yl1/builds/nCTYh37L0AoW4V6PH/openapi.json
