# Google Shopping Scraper (`parsebird/google-shopping-scraper`) Actor

Scrape Google Shopping search results: product titles, prices, sale prices, stores, ratings, review counts, shipping and returns. Filter by price, sale, condition, store and country.

- **URL**: https://apify.com/parsebird/google-shopping-scraper.md
- **Developed by:** [ParseBird](https://apify.com/parsebird) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.29 / 1,000 product scrapeds

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

**Google Shopping Scraper** extracts product listings from [Google Shopping](https://shopping.google.com/) for any search term: product titles, brands, current and original prices, discounts, store names, ratings, review counts, condition, shipping and returns, in 29 countries. Export the data as JSON, CSV or Excel, or pull it through the Apify API.

<table><tr>
<td style="border-left:4px solid #1A73E8;padding:12px 16px;font-weight:600">
Search Google Shopping by keyword in 29 countries, sort by price or rating, keep only products in a price range, on sale, with free shipping or free returns, in new, used or refurbished condition, or from the stores you name, and get one clean row per product.
</td>
</tr></table>

##### Copy to your AI assistant

Copy this block into ChatGPT, Claude, Cursor, or any LLM to start using this actor.

```text
Use the Apify Actor "parsebird/google-shopping-scraper" to scrape Google Shopping search results. Call it with the apify-client package: client.actor("parsebird/google-shopping-scraper").call(run_input={"searchQueries": ["nike running shoes"], "maxResults": 50, "country": "us"}), then read items from client.dataset(run["defaultDatasetId"]).iterate_items(). Inputs: searchQueries (array of strings, required), maxResults (integer per query, default 50), country (us, gb, ca, au, nz, ie, de, at, ch, fr, be, nl, es, it, pt, se, dk, no, pl, in, jp, kr, sg, my, ph, br, mx, za, ae; default us), language (ISO 639-1 code, default en), sortBy (BEST_MATCH, LOWEST_PRICE, HIGHEST_PRICE, TOP_RATED), minPrice and maxPrice (integers in local currency), productCondition (ANY, NEW, USED, REFURBISHED), stores (array of store names), onSale, freeShipping, freeReturns (booleans). Each dataset item is one product with: search_query, position, page, product_id, catalog_id, gpc_id, offer_id, product_title, brand, product_photo, product_rating, product_num_reviews, price, price_value, original_price, original_price_value, on_sale, percent_off, badge, store_name, more_stores_available, product_condition, condition_label, shipping, returns, country, language, search_url, scraped_at. API docs: https://apify.com/parsebird/google-shopping-scraper/api. Get an API token at https://console.apify.com/settings/integrations. Pricing is pay per product saved.
```

### What is Google Shopping Scraper?

Google Shopping Scraper is a **Google Shopping API alternative** that turns any Google Shopping search into structured data. Type a product search the way you would on Google, choose a country, and the Actor collects the product cards Google shows: **title, brand, price, sale price, store, rating, number of reviews, condition, delivery and returns**.

The easiest way to try it is to press **Start** with the prefilled search (`nike running shoes`). You get your first products in a few seconds.

### What can Google Shopping Scraper do?

- 🔎 **Scrape several searches in one run.** Add as many search queries as you need. Each query is scraped and paginated separately.
- 🌍 **Get local prices in 29 countries.** Results are pinned to the country you pick, so you get that market's stores, prices and currency. The Actor checks the currency of every page and retries if Google serves another region.
- ↕️ **Sort like on Google.** Best match, price low to high, price high to low, or rating high to low.
- 🏷️ **Filter the results.** Price range, on sale only, free shipping only, free returns only, new / used / refurbished, and specific stores.
- 📦 **Get clean data.** Prices come as the text Google shows (`$46.97`) and as numbers (`46.97`). Ratings and exact review counts are numbers, and duplicate cards are removed.
- ⚙️ **Use the Apify platform.** Run it on a [schedule](https://docs.apify.com/platform/schedules) for daily price monitoring, call it from the [Apify API](https://docs.apify.com/api/v2), and send results to Google Sheets, Slack, Make, Zapier or a webhook with [integrations](https://docs.apify.com/platform/integrations). Download results as JSON, CSV, Excel, XML or HTML.

### What data can you extract from Google Shopping?

| Field | Description |
|-------|-------------|
| `product_title` | Product name as shown on Google Shopping |
| `brand` | Brand name Google assigns to the product |
| `price` / `price_value` | Current price as text and as a number |
| `original_price` / `original_price_value` | Previous or usual price when the product is discounted |
| `on_sale` / `percent_off` / `badge` | Discount flag, percentage off and the card badge (for example `37% OFF`) |
| `store_name` | Store selling the offer shown on the card (for example `Best Buy`, `eBay - seller`) |
| `more_stores_available` | `true` when Google says the product is sold by more stores (`& more`) |
| `product_rating` / `product_num_reviews` | Average product rating and number of reviews |
| `product_condition` / `condition_label` | `NEW`, `USED` or `REFURBISHED`, plus Google's label such as `Pre-owned` |
| `shipping` / `returns` | Delivery and return text, for example `Free delivery by Tue`, `Free 30-day returns` |
| `product_photo` | Product image URL |
| `product_id`, `catalog_id`, `gpc_id`, `offer_id`, `product_cluster_id` | Google's identifiers for the product and the offer |
| `search_query`, `position`, `page`, `search_url` | The search that found the product, its rank and the Google Shopping URL of that page |

Fields stay `null` when Google does not show them on the card. For example, many products have no shipping text, and products sold by several stores may show only `& more` instead of a store name.

### How to scrape Google Shopping

1. Open [Google Shopping Scraper](https://apify.com/parsebird/google-shopping-scraper) in Apify Console (an Apify account is needed).
2. In **Search queries**, enter one or more product searches, for example `nike running shoes` or `iPhone 16`.
3. Set **Max products per query** and pick a **Country**.
4. Optional: choose **Sort by** and any filters such as price range, condition, stores, on sale, free shipping or free returns.
5. Click **Start** and wait for the run to finish.
6. Open the **Output** tab to see the products, or export them as JSON, CSV or Excel.

### How much does it cost to scrape Google Shopping?

Google Shopping Scraper uses pay-per-event pricing. You pay only for products saved to your dataset. Compute and proxy costs are included in the price, so platform usage is not billed separately.

| Event | Free plan | Bronze | Silver | Gold |
|-------|-----------|--------|--------|------|
| `product-scraped` (per product) | $0.00329 | $0.00299 | $0.00249 | $0.00229 |
| **Per 1,000 products** | **$3.29** | **$2.99** | **$2.49** | **$2.29** |

One event is charged for each product saved to the dataset. Scraping 1,000 Google Shopping products costs $3.29 on the Free plan and $2.29 on Gold. Products removed by your filters are not charged. You can set a maximum cost per run in the run options, and the Actor stops once that limit is reached.

### Input parameters

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| `searchQueries` | array of strings | **Yes** | — | Product searches, one per line |
| `maxResults` | integer | No | 50 | Maximum products saved per query (1–1000) |
| `country` | string | No | `us` | Google Shopping country (29 supported, see the input form) |
| `language` | string | No | `en` | Interface language code, for example `en`, `de`, `fr`, `ja` |
| `sortBy` | string | No | `BEST_MATCH` | `BEST_MATCH`, `LOWEST_PRICE`, `HIGHEST_PRICE` or `TOP_RATED` |
| `minPrice` | integer | No | — | Minimum price in the country's currency |
| `maxPrice` | integer | No | — | Maximum price in the country's currency |
| `productCondition` | string | No | `ANY` | `ANY`, `NEW`, `USED` or `REFURBISHED` |
| `stores` | array of strings | No | `[]` | Keep products from these stores only (case-insensitive, partial match) |
| `onSale` | boolean | No | `false` | Keep only discounted products |
| `freeShipping` | boolean | No | `false` | Keep only products with free delivery |
| `freeReturns` | boolean | No | `false` | Keep only products that show free returns |

Example input:

```json
{
    "searchQueries": ["iPhone 16"],
    "country": "us",
    "language": "en",
    "maxResults": 20,
    "sortBy": "LOWEST_PRICE",
    "minPrice": 500,
    "maxPrice": 1200,
    "productCondition": "NEW"
}
```

### Output example

Each dataset item is one Google Shopping product. Download the dataset in JSON, CSV, Excel, XML or HTML.

```json
{
    "type": "product",
    "search_query": "nike running shoes",
    "position": 5,
    "page": 1,
    "product_id": "17595205775049529424",
    "catalog_id": "17595205775049529424",
    "gpc_id": "5477693794596520766",
    "offer_id": "1089652071209512702",
    "product_cluster_id": "5477693794596520766",
    "product_title": "Nike Men's Revolution 8 Running Shoes",
    "brand": "Nike",
    "product_photo": "https://static.nike.com/a/images/t_web_pdp_535_v2/f_auto,u_9ddf04c7-2a9a-4d76-add1-d15af8f0263d,c_scale,fl_relative,w_1.0,h_1.0,fl_layer_apply/a7dd159c-25c7-4c07-b708-075f1eb61ece/NIKE+REVOLUTION+8.png",
    "product_rating": 5,
    "product_num_reviews": 4750,
    "price": "$46.97",
    "price_value": 46.97,
    "price_from": false,
    "original_price": "$75",
    "original_price_value": 75,
    "on_sale": true,
    "percent_off": "37%",
    "badge": "37% OFF",
    "store_name": "nike.com",
    "more_stores_available": true,
    "product_condition": "NEW",
    "condition_label": null,
    "shipping": null,
    "returns": "Free 60-day returns",
    "country": "us",
    "language": "en",
    "search_url": "https://www.google.com/search?q=nike+running+shoes&udm=28&hl=en&gl=us",
    "scraped_at": "2026-10-21T11:01:35+00:00"
}
```

The Output tab has two table views: **Products** (photo, title, brand, price, store, rating, reviews) and **Offers & pricing** (price, original price, discount, condition, store, shipping and returns).

### Use the Google Shopping Scraper API

Start runs and read results from your own code with the [Apify API](https://docs.apify.com/api/v2) and its clients.

**Python** ([apify-client](https://docs.apify.com/api/client/python/)):

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_APIFY_TOKEN>")

run = client.actor("parsebird/google-shopping-scraper").call(run_input={
    "searchQueries": ["nike running shoes", "adidas running shoes"],
    "maxResults": 50,
    "country": "us",
    "sortBy": "LOWEST_PRICE",
})

for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item["product_title"], item["price"], item["store_name"])
```

**JavaScript** ([apify-client](https://docs.apify.com/api/client/js/)):

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

const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });

const run = await client.actor('parsebird/google-shopping-scraper').call({
    searchQueries: ['nike running shoes'],
    maxResults: 50,
    country: 'gb',
    onSale: true,
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => console.log(item.product_title, item.price, item.store_name));
```

### Use cases

- **Price monitoring:** track prices and discounts of your products or a competitor's on a daily schedule.
- **Competitor research:** see which stores sell a product, at what price, and how often it is discounted.
- **Market and assortment analysis:** compare brands, price ranges, ratings and review counts across a category.
- **Retail and marketplace analysis:** check how often Amazon, Walmart, Best Buy, eBay or other stores appear for your keywords.
- **Lead lists for e-commerce services:** collect store names selling in a niche.
- **Price comparison and deal sites:** feed fresh Google Shopping prices into your own app.

### How it works

1. For each search query, the Actor requests the Google Shopping results page for the selected country and language.
2. It reads every product card on the page, removes duplicates and converts prices, ratings and review counts to numbers.
3. Sort order is applied by Google. Google applies one filter per request, so the Actor sends free shipping, price range or on sale (in that order of priority) to Google and checks the other filters on each product card.
4. It moves to the next results page until it reaches `maxResults` or Google has no more products.
5. Each matching product is saved to the dataset and charged as one event.

### FAQ

**How many products can I get per search?**
It depends on the search. In our tests, broad searches such as `laptop` or `coffee maker` returned more than 150 products each, while narrow searches return fewer. Google shows about 40 products per results page, and the Actor stops when Google has no more new products.

**Can I get products from a specific store?**
Yes. Add store names to **Stores**, for example `Walmart` or `Best Buy`. Matching is partial and ignores case, so `eBay` also matches `eBay - seller`. Store filtering happens on the product cards, so the Actor may need to read several pages to find enough products from a small store. If no product matches your filters on 6 results pages in a row, the Actor stops that query.

**Why are some fields empty?**
The Actor only returns what Google shows on the product card. Not every card has shipping or returns text, a rating, or a store name. Products sold by many stores sometimes show only `& more`. In that case `store_name` is `null` and `more_stores_available` is `true`.

**How does the free shipping filter work?**
Free shipping is applied by Google itself. Many cards don't display delivery text, so the `shipping` field can still be empty for products returned with this filter.

**How does the free returns filter work?**
It keeps products whose returns text says the returns are free, for example `Free 30-day returns`. Products without returns text are skipped. Free shipping and free returns detection also works for common non-English wording, such as `Kostenlose Rücknahme`.

**Does it return product descriptions, specs or all offers for a product?**
No. Google Shopping Scraper returns the data shown in Google Shopping search results: one offer per product card, with its price, store, delivery and returns. It does not open each product's detail panel.

**Why do I get products that don't match my search exactly?**
Google Shopping shows its own closest matches, especially for very specific or misspelled searches. The Actor returns what Google shows for that query.

**Are prices in local currency?**
Yes. Prices are in the currency of the selected country, and `minPrice` / `maxPrice` use that currency too.

**Can I schedule recurring runs?**
Yes. Create a [schedule](https://docs.apify.com/platform/schedules) in Apify Console to run the Actor every hour, day or week, and connect [integrations](https://docs.apify.com/platform/integrations) to send new data where you need it.

**Can I use it through the API or with AI agents?**
Yes. Use the [API tab](https://apify.com/parsebird/google-shopping-scraper/api) for endpoints and code samples, or connect the Actor to AI agents with the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp).

**Something doesn't work. What should I do?**
Open an issue in the [Issues tab](https://apify.com/parsebird/google-shopping-scraper/issues) with your run link. We read every report.

### Is it legal to scrape Google Shopping?

Google Shopping Scraper collects only publicly available product listings: prices, store names, ratings and similar data that anyone can see on Google Shopping without logging in. It does not collect personal data. Scraping public data is generally legal, but you should check the laws that apply to you and how you use the data, and avoid collecting personal data without a legitimate reason. If in doubt, ask a lawyer. Read more in Apify's blog post on [whether web scraping is legal](https://blog.apify.com/is-web-scraping-legal/).

### Other e-commerce and Google scrapers

| Actor | What it scrapes |
|-------|-----------------|
| [Google Ads Transparency Center Scraper](https://apify.com/parsebird/google-ads-transparency-scraper) | Search, YouTube and Shopping ads by advertiser |
| [Google Play Store Scraper](https://apify.com/parsebird/google-play-scraper) | Android apps, ratings and reviews |
| [AliExpress Scraper](https://apify.com/parsebird/aliexpress-scraper) | AliExpress products and sellers |
| [MercadoLibre Search Scraper](https://apify.com/parsebird/mercadolibre-search-scraper) | MercadoLibre search results across Latin America |
| [Allegro.pl Product Scraper](https://apify.com/parsebird/allegro-scraper) | Allegro products and prices in Poland |
| [Coupang Search Scraper](https://apify.com/parsebird/coupang-search-scraper) | Coupang search results in South Korea |
| [Tesco UK & Ireland Scraper](https://apify.com/parsebird/tesco-scraper) | Tesco grocery products and prices |
| [B\&H Photo Scraper](https://apify.com/parsebird/bh-photo-scraper) | B\&H Photo electronics listings and prices |

# Changelog

This Actor's version history is a separate document: https://apify.com/parsebird/google-shopping-scraper/changelog.md

# Actor input Schema

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

Enter product names, brands or keywords exactly as you would type them into Google Shopping. Each query is scraped separately.

## `maxResults` (type: `integer`):

Maximum number of products to save for each search query. Google usually returns a few hundred products per query.

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

Google Shopping country. Controls the stores, prices and currency you get.

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

Interface language code (ISO 639-1), for example en, de, fr, es, ja. Affects labels such as shipping and returns text.

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

Order Google Shopping uses for the results.

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

Only keep products priced at or above this amount, in the country's currency.

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

Only keep products priced at or below this amount, in the country's currency.

## `productCondition` (type: `string`):

Keep only new, used (pre-owned) or refurbished products.

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

Keep only products sold by these stores, for example Amazon, Best Buy, Walmart. Matching is case-insensitive and partial, so 'eBay' also matches 'eBay - seller'.

## `onSale` (type: `boolean`):

Keep only discounted products that show a previous or usual price.

## `freeShipping` (type: `boolean`):

Keep only products with free delivery.

## `freeReturns` (type: `boolean`):

Keep only products that show free returns.

## Actor input object example

```json
{
  "searchQueries": [
    "nike running shoes"
  ],
  "maxResults": 20,
  "country": "us",
  "language": "en",
  "sortBy": "BEST_MATCH",
  "productCondition": "ANY",
  "stores": [],
  "onSale": false,
  "freeShipping": false,
  "freeReturns": false
}
```

# Actor output Schema

## `dataset` (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": [
        "nike running shoes"
    ],
    "maxResults": 20,
    "country": "us"
};

// Run the Actor and wait for it to finish
const run = await client.actor("parsebird/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 = {
    "searchQueries": ["nike running shoes"],
    "maxResults": 20,
    "country": "us",
}

# Run the Actor and wait for it to finish
run = client.actor("parsebird/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 '{
  "searchQueries": [
    "nike running shoes"
  ],
  "maxResults": 20,
  "country": "us"
}' |
apify call parsebird/google-shopping-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,parsebird/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/22ybsjeP7VINrrOOJ/builds/XrwW9PGeTb2Ba1E2p/openapi.json
