# Google Shopping Scraper - Products, Prices, Sellers & Ratings (`zaver.api/google-shopping-scraper`) Actor

Just $1.99 per 1,000 products. Scrape Google Shopping for any query - product title, price, seller, delivery, rating, reviews count, image and link - with country and language filters and pagination. No proxies, no CAPTCHAs. Export CSV, JSON, Excel.

- **URL**: https://apify.com/zaver.api/google-shopping-scraper.md
- **Developed by:** [Zaver](https://apify.com/zaver.api) (community)
- **Categories:** E-commerce
- **Stats:** 3 total users, 2 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.99 / 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.

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 - Products, Prices, Sellers & Ratings

**Track what every seller charges for a product, in one run.** Title, price, seller, delivery terms, rating and review count for each Google Shopping listing - up to 100 products per request, which makes daily price monitoring cheap.

> ⭐ up to 100 products per page · price, seller & delivery · ratings & reviews · country + language · pay per row delivered · CSV/JSON/Excel · API, MCP & schedules

### What data does it extract?

One row per product, with the `query`, `page` and `type` it came from so multi-query exports stay
separable. Fields Google does not return for an item are simply absent, and any new field Google
adds is passed through automatically.

| Field | Description |
|---|---|
| `title` | Product title |
| `source` | Seller or merchant name |
| `link` | Product listing URL |
| `price` | Price as shown, e.g. `$60.00` |
| `delivery` | Delivery or shipping note |
| `imageUrl` | Product image |
| `rating` | Average star rating |
| `ratingCount` | Number of reviews |
| `offers` | Number of competing offers, where shown |
| `productId` | Google product identifier |
| `position` | Rank within the page |
| `query` | The query this row came from |
| `page` | Which results page it came from |

#### Example output

```json
{
  "query": "coffee shops new york",
  "page": 1,
  "type": "product",
  "title": "Coffee Shops of New York — Devoción Tee - M",
  "source": "coffeeshopsnewyork.com",
  "link": "https://www.google.com/search?ibp=oshop&q=coffee+shops+new+york&prds=localAnnotatedOfferId:1,productid:26933569086790...",
  "price": "$60.00",
  "imageUrl": "https://encrypted-tbn2.gstatic.com/shopping?q=tbn:ANd9GcSDXV1woSJczEaTfjh6q5K4CcSvV0dyHtuHyNoQdeYe6Z5YqyVqEG_p8AAb4WJ...",
  "productId": "2693356908679011681",
  "position": 1
}
```

### How to use it

1. Paste your queries into **`queries`** - one per line.
2. Set the options you need from the table below.
3. Run it, then download the dataset as **CSV, Excel, JSON, JSONL or XML** - or read it straight from
   the Apify API.

#### Input example

```json
{
  "queries": [
    "coffee beans 1kg",
    "espresso machine"
  ],
  "gl": "us",
  "hl": "en",
  "num": 40,
  "maxPages": 3
}
```

| Option | Type | Description |
|---|---|---|
| `queries` | array | **Required.** Product queries, one per line. |
| `num` | integer | Products per page, up to 100. Default 40. |
| `gl` | string | Country code - `us`, `in`, `gb`, `de`... Prices follow the country. |
| `hl` | string | Language code - `en`, `hi`, `es`... |
| `maxPages` | integer | Pages per query, default 1. Each page is one request. |

### Pricing

| Event | Price |
|---|---|
| `product-result` | **$1.99 per 1,000 products** ($0.00199 per product) |

1,000 products → **$1.99** · 10,000 → **$19.90** · 100,000 → **$199.00**

You are billed per row delivered, as it is delivered. Queries that fail or return nothing cost you
nothing, and an interrupted run only ever bills the rows already in your dataset.

### Use cases

#### Monitor competitor pricing daily

Schedule your product queries and track `price` per `source` over time to see who discounts, when, and by how much.

#### Find every seller carrying a product

One query returns the merchants ranking for it, with delivery terms and ratings side by side.

#### Feed a repricing model

Clean price and seller columns give a repricing job the market context it needs each morning.

#### Research a category before launching

Compare price bands, review volumes and delivery promises across a keyword set to position a new product.

#### Spot new entrants in your category

Diff the `source` column between runs to catch merchants that just started ranking.

### Good to know

- `num` works here - up to 100 products per request.
- Prices are returned as displayed strings, including currency symbol.
- There is no working date filter for Shopping; schedule runs for a time series.

### Frequently asked questions

#### Do I need proxies, an API key or a Google account?

No. Requests run through hosted Google search infrastructure on our side - nothing to configure.

#### How many products can I get per query?

Up to 100 per page via `num`, with `maxPages` for depth. Each page is one request, so a 40-product page is the cheapest way to sample a category.

#### Are prices in my currency?

Prices follow the `gl` country you request, so set `gl` to the market you care about and read `price` as that market's currency.

#### Does it return product specifications or stock levels?

No. You get the listing as Google shows it - title, price, seller, delivery, rating and link. Follow `link` for full specifications on the merchant's page.

#### Can I filter to recent listings?

No - Google Shopping ignores the recency filter, so results are the current listings for your query. Schedule repeat runs if you need a time series.

#### How do I export Google Shopping prices to CSV or Excel?

Download the run's dataset as CSV, Excel, JSON, JSONL or XML, or read it via the Apify API.

#### Am I charged for queries that return no products?

No. Billing is per row delivered.

### Related Google scrapers

- [Google Search Results Scraper](https://apify.com/zaver.api/google-search-scraper) - organic rankings and People Also Ask
- [Google Images Scraper](https://apify.com/zaver.api/google-images-scraper) - image URLs, sizes and source pages
- [Google Videos Scraper](https://apify.com/zaver.api/google-videos-scraper) - video results across YouTube, TikTok and the web
- [Google Places Scraper](https://apify.com/zaver.api/google-places-scraper) - local business results with phone and website
- [Google Maps Scraper](https://apify.com/zaver.api/google-maps-scraper) - map places with GPS, hours and Place ID
- [Google Patents Scraper](https://apify.com/zaver.api/google-patents-scraper) - patents with inventors, assignees and dates

***

*Not affiliated with or endorsed by Google. Returns publicly available search results.*

# Actor input Schema

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

Search queries, one per line.

## `gl` (type: `string`):

Two-letter country code for localised results, e.g. <code>us</code>, <code>in</code>, <code>th</code>, <code>gb</code>. Leave empty for default.

## `hl` (type: `string`):

Interface language code, e.g. <code>en</code>, <code>hi</code>, <code>th</code>. Leave empty for default.

## `dateRange` (type: `string`):

Restrict results to a recent period.

## `maxPages` (type: `integer`):

How many result pages to fetch per query. You are billed only per row delivered.

## `num` (type: `integer`):

Results per page (max 100).

## Actor input object example

```json
{
  "queries": [
    "apple inc"
  ],
  "gl": "",
  "hl": "",
  "dateRange": "",
  "maxPages": 1,
  "num": 40
}
```

# Actor output Schema

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

One dataset item per result.

## `resultsCsv` (type: `string`):

CSV download.

## `runSummary` (type: `string`):

Counts for the run.

# 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": [
        "apple inc"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("zaver.api/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 = { "queries": ["apple inc"] }

# Run the Actor and wait for it to finish
run = client.actor("zaver.api/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 '{
  "queries": [
    "apple inc"
  ]
}' |
apify call zaver.api/google-shopping-scraper --silent --output-dataset

```

## MCP server setup

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