# Google Shopping Scraper: Prices, Sellers, Deals & Price History (`zaiq/google-shopping-scraper`) Actor

Every product Google Shopping shows for a search: price, was-price, discount, seller, delivery, returns, rating and reviews, by country. Each row also shows how the price moved since your last run, so a scheduled run becomes a price tracker. No login, no API key.

- **URL**: https://apify.com/zaiq/google-shopping-scraper.md
- **Developed by:** [Zaiq](https://apify.com/zaiq) (community)
- **Categories:** E-commerce, SEO tools, Automation
- **Features:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.60 / 1,000 products

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 API: prices, sellers, deals and price history for any search

![Google Shopping Scraper: Prices, Sellers, Deals & Price History](https://api.apify.com/v2/key-value-stores/4VJNANhwKgqPpXtAi/records/hero-google-shopping-scraper.jpg)

Get **every product Google Shopping shows for a search**: **price**, **was-price**, **discount**, **seller**, **delivery**, **returns**, **rating** and **reviews**, in the **country you choose**, with its currency.

Each row also shows **how the price moved since your last run**, free, so a **scheduled run becomes a price tracker** for your market. Built for **ecommerce teams**, **pricing analysts**, **brands watching resellers** and **AI agents** that need live market prices without a data subscription.

### What you get

| Field | What it holds |
|---|---|
| Product rows | `query`, `position`, `title`, `price`, `currency`, `priceIsFrom`, `wasPrice`, `usualPrice`, `unitPrice`, `discountPercent`, `priceNote`, `seller`, `moreSellers`, `condition`, `delivery`, `returns`, `rating`, `reviews`, `catalogId`, `groupId`, `offerId`, `productId`, `shelf`, `country` |
| Price tracking | `previousPrice`, `priceChange`, `priceChangePercent`, `priceStatus`, `firstSeenAt` |

### What people use it for

- **Price monitoring:** run a list of products every day and see what moved
- **Competitor pricing:** see who sells what at which price in your market
- **Reseller watch:** see which sellers list your brand and at what price
- **Deal finding:** filter to products on sale, biggest discounts first
- **Market research:** compare price ranges and ratings across a category or country
- **AI agents:** live market prices inside any workflow, per product

### How to use it

1. Enter your **product searches**.
2. Pick the **country**.
3. Click **Start**. Set a schedule to track prices.

### Input

| Field | Example | Notes |
|---|---|---|
| Product searches | `robot vacuum` | Up to 50 |
| Country | `US` | Prices and sellers are the ones shown there |
| Products per search | `50` | Up to 300 |
| Pages per search | `1` | About 50 products a page, up to 5 |
| Minimum and maximum price | `100`, `500` | Optional. You are not charged for rows left out |
| Only products on sale | off | Keeps products with a was-price |
| Compare with my last run | on | Free |
| Tracking name | `my-list` | Optional, one history per list |

### Output

Each result is one row in the run's dataset (download it as JSON, CSV, Excel, XML or HTML, or read it through the API). An example row (values shortened):

```json
{
  "kind": "product",
  "query": "robot vacuum",
  "position": 1,
  "title": "Sample Robot Vacuum and Mop with Auto-Empty Dock",
  "price": 329.99,
  "currency": "USD",
  "wasPrice": 550,
  "discountPercent": 40,
  "seller": "Sample Store",
  "moreSellers": true,
  "delivery": "Free delivery",
  "returns": "30-day returns",
  "rating": 4.4,
  "reviews": 1100,
  "catalogId": "16342406777859619960",
  "shelf": "Robot Vacuums with Mopping",
  "country": "US",
  "previousPrice": 349.99,
  "priceChange": -20,
  "priceChangePercent": -5.7,
  "priceStatus": "dropped"
}
```

A record named `SUMMARY` in the run's key-value store says what each input returned, with any notes (for example an account that does not exist), what was charged and how much traffic the run used.

### Pricing

- **$0.002 per product** ($2 per 1,000)
- **$0.01 per results page read**, about 50 products
- Price tracking is free
- A page with no products is free, and so are failed requests
- Apify's $0.00005 start charge counts towards your Maximum cost per run.

What typical jobs cost at the list price:

| Job | Cost |
|---|---|
| 10 products from one search | $0.03 |
| 50 products from one search | $0.11 |
| 100 products over two pages | $0.22 |
| 50 products a day for a month | about $3.30 |

On Apify's Scale and Business plans the per-event prices are lower (Store discounts). Set **Maximum cost per run** and the Actor stops cleanly when it is reached: you never pay more than that.

### Tips

- Set a daily schedule with one tracking name per list: every row then shows the change.
- Google changes which products it shows, so read the full 50 rather than the first 10 when you track prices.
- Use Minimum and Maximum price to pay only for the rows you want.
- The same search in another country gives you that market's sellers and currency.

### Use it through the API

**Python**

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("zaiq/google-shopping-scraper").call(run_input={"searches": ["robot vacuum"], "country": "US", "maxProductsPerSearch": 50})
for row in client.dataset(run.default_dataset_id).iterate_items():
    print(row)
```

**JavaScript**

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

const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });
const run = await client.actor('zaiq/google-shopping-scraper').call({"searches": ["robot vacuum"], "country": "US", "maxProductsPerSearch": 50});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
```

**HTTP (one call, results back)**

```bash
curl -X POST 'https://api.apify.com/v2/acts/zaiq~google-shopping-scraper/run-sync-get-dataset-items?token=<YOUR_APIFY_TOKEN>' \
  -H 'Content-Type: application/json' \
  -d '{"searches": ["robot vacuum"], "country": "US", "maxProductsPerSearch": 50}'
```

### Integrations and schedules

- **Schedules:** run it every hour, day or week from the Apify Console (Schedules) and keep a history of results.
- **Make, Zapier, n8n, Google Sheets, Slack, Airtable:** connect it through Apify's integrations, or send each finished run to a **webhook**.
- **Datasets:** results stay in the run's dataset; export them or read them by API whenever you need them.

### Use it with AI agents (MCP)

Add Apify's MCP server with this Actor already pinned (`https://mcp.apify.com?tools=zaiq/google-shopping-scraper`) to Claude, ChatGPT, Cursor, VS Code or any MCP client. The agent can find this Actor and run it for you: ask it for "what robot vacuums cost in the UK right now, and who is selling them". AI agents can also pay for runs directly through Apify's agentic payments.

### Limits

- The product list shows Google's headline offer: the seller shown and whether more sellers exist. A card that only says "from" a price has `priceIsFrom` true and may name no seller. Google opens the full list of offers and the sellers' links only in its own product viewer, so those are not included.
- Sponsored listings are not included.
- The price compared between runs is the headline offer, which can move to another seller, so one change can be a different shop rather than a real price cut. Check `seller` with `priceChange`.
- Google reshuffles this page between visits: in our tests two runs minutes apart shared 12 to 32 of 50 products. So read more than the first few, and expect some products to come and go. A product that returns is still compared with its last known price.
- Some countries show fewer products. A page Google serves from the wrong country is refused and read again, not charged.
- Apify's free plan: one search, one page and 10 products.

### FAQ

**Do I need a Google account or API key?**

No.

**How does the price tracking work?**

Each row is compared with your last run of the same list. The history is kept in a store in your own Apify account, and it is free.

**Which countries?**

Any country Google Shopping serves. We read real pages for the US, UK, Germany and South Africa, each with its own currency.

**Does it include sellers' links?**

No. Google only shows those in its product viewer. You get the seller's name and the product's Google ids.

**How many products can I get?**

About 50 a page, up to 5 pages a search.

**What if a search finds nothing?**

You get a note and pay nothing for it.

### Related Actors from Zaiq

- [walmart-scraper](https://apify.com/zaiq/walmart-scraper): Walmart products, prices and stock
- [target-scraper](https://apify.com/zaiq/target-scraper): Target products, prices and store stock
- [amazon-product-scraper](https://apify.com/zaiq/amazon-product-scraper): products, prices and reviews from 23 Amazon stores

### Support

Questions, a site that changed, or a field you need? Open an issue on this Actor's **Issues** tab: we answer there, usually within a day.

***

Also found as: google shopping scraper, google shopping api, google shopping price tracker, product price monitoring, competitor price tracking, price comparison scraper, google shopping results, ecommerce price data, price history, seller prices.

# Actor input Schema

## `searches` (type: `array`):

What to search Google Shopping for, such as robot vacuum. Up to 50 a run.

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

Two-letter country code, such as US, GB, DE, AU or CA. Prices and sellers are the ones Google shows there.

## `maxProductsPerSearch` (type: `integer`):

A results page holds about 50 products.

## `maxPagesPerSearch` (type: `integer`):

Each page read is one Results page charge. Raise it with Products per search for more than about 50.

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

Optional. Leave out cheaper products. You are not charged for those rows.

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

Optional. Leave out dearer products. You are not charged for those rows.

## `onSaleOnly` (type: `boolean`):

Keep only products Google shows with a was-price. You are not charged for the others.

## `trackPrices` (type: `boolean`):

Free. Each row shows the previous price and the change. The history stays in a store in your own Apify account.

## `trackingName` (type: `string`):

Optional. Give different lists their own history, such as my-competitors.

## Actor input object example

```json
{
  "searches": [
    "robot vacuum"
  ],
  "country": "US",
  "maxProductsPerSearch": 10,
  "maxPagesPerSearch": 1,
  "onSaleOnly": false,
  "trackPrices": true
}
```

# Actor output Schema

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

Dataset: the results.

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

What each input returned, and notes.

# 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 = {
    "searches": [
        "robot vacuum"
    ],
    "maxProductsPerSearch": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("zaiq/google-shopping-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 = {
    "searches": ["robot vacuum"],
    "maxProductsPerSearch": 10,
}

# Run the Actor and wait for it to finish
run = client.actor("zaiq/google-shopping-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 '{
  "searches": [
    "robot vacuum"
  ],
  "maxProductsPerSearch": 10
}' |
apify call zaiq/google-shopping-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,zaiq/google-shopping-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/lDzaMWWIeqpBlp46w/builds/Gc4G5oEmFMejfy4yx/openapi.json
