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

\[from $2.625/1K products] Scrape Google Shopping search results: product title, price, old price, discount, currency, seller, rating, ratings count, delivery, image, product URL. Many search terms and 45 countries per run. Add-on: every seller offer with total price and store link. No run fee.

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

## Pricing

from $1.96 / 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

### What is Google Shopping Scraper?

**Google Shopping Scraper** is a **Google Shopping API** for product prices. Type one or more search terms, pick one or more countries, and get one row per product from Google Shopping with **title**, **price**, **old price** and **discount %**, **currency**, **seller**, **rating**, **ratings count**, **delivery** text, **badges**, **image**, **Google product ids** and the **Google Shopping product URL**. Every search term runs in every country you list, in that country's currency and language, in one run.

One row is one product. The data is read from Google Shopping result pages through a licensed data provider, so there are **no proxies, CAPTCHAs or browser sessions to manage** on your side and no Google account or API key is needed. The optional **🏪 Seller offers** add-on goes one step further for price comparison: for the top products of each search it lists **every store selling the product** — store name, domain, **direct product link**, base price, shipping, tax, **total price**, availability and store rating — plus the **lowest total price** and the store that has it.

- 💰 **$0.002625 per product on paid plans** (about $2.63 per 1,000; $3.50 per 1,000 on the Apify Free plan) — no start fee, no subscription
- 🌍 **45 countries** and any number of search terms in **one run** (terms × countries)
- ⭐ **Seller, rating and ratings count in the same row** — no second lookup
- 🏪 **Seller offers add-on**: up to 10 stores per product with total price and store link
- 🆓 **Error rows are free** — a search with no products or an unknown country costs nothing
- 🤖 Works from the **Apify API**, **MCP server** (Claude, ChatGPT, Cursor), n8n, Make and Zapier

### What data can Google Shopping Scraper extract?

| Field | Example | What it means |
|---|---|---|
| 🔍 `query` | `wireless earbuds` | Search term the product was found for |
| 📍 `country` | `United States` | Country of the search (`countryCode`: `US`) |
| `position` | `1` | Position in the Google Shopping results (1 = first) |
| 🛍️ `title` | `JBL Vibe Buds True Wireless Earbuds` | Product title |
| 💲 `price` | `54.95` | Current price in the country's currency |
| `oldPrice` | `50` | Crossed-out price when Google shows a discount |
| `discountPercent` | `34` | Computed from old price and price |
| `currency` | `USD` | ISO currency code (GBP, EUR, JPY…) |
| 🏬 `seller` | `Walmart - JBL Official Store` | Store on the product card |
| ⭐ `rating` | `4.2` | Average product rating, 0–5 |
| `ratingsCount` | `2000` | Number of ratings behind it |
| 🚚 `delivery` | `Free delivery` | Delivery text from the card (`freeDelivery`: `true`) |
| `deliveryPrice` | `5.99` | Delivery price, when the card shows one |
| `tags` | `["34% OFF"]` | Badges on the card: discounts, SALE, LOW PRICE |
| 🖼️ `imageUrl` | `https://encrypted-tbn2.gstatic.com/shopping?q=…` | Product image |
| `productId`, `gid`, `dataDocId` | `10513711293184938770` | Google Shopping product, global and offer ids |
| 🔗 `googleShoppingUrl` | `https://google.com/search?ibp=oshop&…` | The product's page on Google Shopping |
| `resultSection` | `search results` | Or `carousel: Deals on Wireless Earbuds` when carousel products are on |
| `language` | `English` | Interface language of the search |
| `searchUrl` | `https://www.google.com/search?q=wireless%20earbuds&…` | The Google Shopping search that was read |
| `scrapedAt` | `2026-10-01T14:22:24.400Z` | When the row was produced |

With the **🏪 Seller offers** add-on switched on, the top products of each search also carry:

| Field | Example | What it means |
|---|---|---|
| `offersCount` | `10` | Number of store offers (up to 10) |
| `lowestTotalPrice` | `24.95` | Lowest total price across the offers |
| `lowestPriceSeller` | `TikTok Shop` | Store with the lowest total price |
| `productUrl` | `https://www.jbl.com/VIBE-BUDS.html` | Direct link to the product on the headline store's site |
| `offers` | `[{seller, domain, url, basePrice, shippingPrice, tax, totalPrice, currency, condition, availability, offerNote, sellerRating, sellerRatingsCount}]` | One object per store |
| `offersNote` | `Seller offers are fetched for the top 10 products…` | Why a product has no offers (it is then not charged for the add-on) |

Fields Google does not show for a product are `null` — for example `oldPrice` when there is no discount, or `rating` for a product without reviews.

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

Google Shopping Scraper uses **pay-per-event** pricing. You pay for product rows, and for the add-on only when you switch it on:

| Event | Free plan | Starter (Bronze) | Scale (Silver) | Business (Gold) | What you get |
|---|---|---|---|---|---|
| `product` | $0.0035 | **$0.002625** | $0.002625 | $0.002625 | One Google Shopping product row |
| `seller-offers` (add-on) | $0.01 | **$0.009** | $0.008 | $0.007 | Seller offers for one product: up to 10 stores with total price and link |

Platinum and Diamond plans pay the Business price.

- **No start fee** and no charge per run.
- **Paid plans: $1 = about 380 products. 1,000 products = $2.625.** On the Free plan 1,000 products cost $3.50.
- Apify's **free plan** includes $5 of monthly credit — about **1,400 products a month**.
- **Error rows are free**: a search that returns no products, an unknown country or language, an empty price range.
- **The add-on is charged only for products that actually have offers.** Products outside the *top N* and products for which Google lists no stores are free.
- The default run (one search term, United States, 40 products) costs **about $0.11** on paid plans ($0.14 on the Free plan) and finished in **17 seconds** in our test; an identical repeat within 24 hours came back in 3 seconds.

Example budgets:

| Job | Rows | Cost, Starter plan | Cost, Free plan |
|---|---|---|---|
| 1 search term × 1 country × 40 products | 40 | about $0.11 | $0.14 |
| 10 search terms × 3 countries × 40 products | 1,200 | $3.15 | $4.20 |
| 1 search term × 40 products + offers for the top 10 | 40 + 10 offers | about $0.20 | $0.24 |

### How to scrape Google Shopping with Google Shopping Scraper

1. Open the Actor and click **Try for free** (an Apify account is free).
2. In **🔍 Search terms**, type one product search per line — exactly what you would type into Google Shopping.
3. In **📍 Countries**, add one or more countries by name or two-letter code.
4. Set **💯 Max products per search** (40 is one Google Shopping page; up to 120).
5. Optionally choose a **sort order**, a **price range**, or switch on **🏪 Add seller offers ($)**.
6. Click **Start**. Rows appear in the **Products** table; download them as CSV, Excel, JSON or HTML, or read them through the API.

### ⬇️ Input

#### Search terms in several countries (default)

```json
{
    "queries": ["wireless earbuds"],
    "countries": ["United States"],
    "maxProductsPerQuery": 40
}
```

Every search term runs in every country: `["wireless earbuds", "iphone 16 case"]` × `["US", "GB", "DE"]` is six searches in one run. Countries accept a name or a two-letter code; 45 are supported: Argentina, Australia, Austria, Belgium, Brazil, Canada, Chile, Colombia, Czechia, Denmark, Finland, France, Germany, Greece, Hungary, India, Indonesia, Ireland, Israel, Italy, Japan, Malaysia, Mexico, Netherlands, New Zealand, Norway, Philippines, Poland, Portugal, Romania, Saudi Arabia, Singapore, Slovakia, South Africa, South Korea, Spain, Sweden, Switzerland, Thailand, Turkiye, Ukraine, United Arab Emirates, United Kingdom, United States, Vietnam.

**Language** is optional. Empty means each country's main language (Germany → German, Japan → Japanese); set `"language": "en"` to read every country in English.

#### Sort and price range

```json
{
    "queries": ["iphone 16 case"],
    "countries": ["GB", "Germany"],
    "maxProductsPerQuery": 10,
    "sortBy": "price_low_to_high",
    "minPrice": 5
}
```

`sortBy` takes `relevance` (Google's default), `price_low_to_high`, `price_high_to_low` or `review_score`. Google Shopping no longer applies the sort order reliably (checked October 2026: "price: low to high" came back unsorted), so **the Actor sorts the products itself**: it collects the `maxProductsPerQuery` most relevant products for your term and puts them in strict price order (products without a price go last) or by rating. To find the cheapest offers across a wider range, raise `maxProductsPerQuery`. `minPrice` and `maxPrice` are whole numbers in the country's currency; they are sent to Google Shopping and also re-checked on every row, so nothing outside the range is returned.

#### 🏪 Seller offers add-on

```json
{
    "queries": ["wireless earbuds"],
    "countries": ["United States"],
    "includeSellerOffers": true,
    "maxProductsWithOffers": 10
}
```

For the first `maxProductsWithOffers` products of each search, the Actor opens the product's store list and adds up to 10 offers. Use it for price comparison and to get a **direct link to the product on a store's website** — the main search only gives the Google Shopping link.

#### Carousel products

`"includeCarouselProducts": true` adds the products from Google Shopping's themed carousels ("Deals on…", "Budget…", "…for Working Out") after the main results, without duplicates. Each row says which carousel it came from in `resultSection`. In our test the default search returned 40 results plus 20 carousel products.

### ⬆️ Output

One row per product. A real row from the default search with the seller offers add-on (offers shortened to two):

```json
{
    "type": "product",
    "query": "wireless earbuds",
    "country": "United States",
    "position": 1,
    "title": "JBL Vibe Buds True Wireless Earbuds",
    "price": 54.95,
    "oldPrice": null,
    "discountPercent": null,
    "currency": "USD",
    "seller": "Walmart - JBL Official Store",
    "rating": 4.2,
    "ratingsCount": 2000,
    "delivery": "Free delivery",
    "freeDelivery": true,
    "deliveryPrice": null,
    "tags": null,
    "imageUrl": "https://encrypted-tbn2.gstatic.com/shopping?q=tbn:ANd9GcSfc2X4kjLIaHT-30oZ3zzE7…",
    "productId": "10513711293184938770",
    "gid": "13321592222471100410",
    "dataDocId": "679834219260504639",
    "googleShoppingUrl": "https://google.com/search?ibp=oshop&q=wireless+earbuds+sale&prds=…",
    "resultSection": "search results",
    "countryCode": "US",
    "language": "English",
    "searchUrl": "https://www.google.com/search?q=wireless%20earbuds&hl=en&gl=US&udm=28…",
    "offersCount": 10,
    "lowestTotalPrice": 24.95,
    "lowestPriceSeller": "TikTok Shop",
    "productUrl": "https://www.jbl.com/VIBE-BUDS.html",
    "offers": [
        { "position": 1, "seller": "Walmart", "domain": "www.walmart.com", "url": "https://www.walmart.com/ip/…", "offerTitle": "Jbl Vibe Buds - True wireless earbuds - White", "basePrice": 29, "shippingPrice": null, "tax": null, "totalPrice": 29, "currency": "USD", "condition": null, "availability": "in_stock", "offerNote": "47% off $55", "sellerRating": null, "sellerRatingsCount": null },
        { "position": 2, "seller": "JBL", "domain": "www.jbl.com", "url": "https://www.jbl.com/JBLVBUDSBLKAM.html", "offerTitle": "JBL Vibe Buds True Wireless Earbuds - Black", "basePrice": 54.95, "shippingPrice": null, "tax": null, "totalPrice": 54.95, "currency": "USD", "condition": null, "availability": "in_stock", "offerNote": null, "sellerRating": 4.523, "sellerRatingsCount": 228 }
    ],
    "offersNote": null,
    "scrapedAt": "2026-10-01T14:22:24.400Z"
}
```

The dataset has four table views: **Products** (the main table), **Seller offers ($)** (one line per store, unwound from `offers`), **Price comparison** (card price next to the lowest total price) and **All fields**.

#### What the offers list contains

Google groups close variants of a product (colours, bundles, the same model from several marketplaces) under one product page, and the store list follows that grouping. Read `offerTitle` next to `totalPrice`: in the example above, the $29 Walmart offer is the white colour of a related JBL model. That is what Google Shopping shows, not a parsing error.

### Use cases for Google Shopping data

#### Price monitoring and repricing

Schedule a daily run with your product names and the countries you sell in. Compare your price with `price`, `lowestTotalPrice` and `lowestPriceSeller` to see who undercuts you.

#### Competitor and assortment research

See which stores dominate a search (`seller`), which products carry discount badges (`tags`, `discountPercent`) and which have the most ratings (`ratingsCount`). Sorting by review score shows the best-rated products in a category.

#### Price comparison across countries

Run the same search terms in several countries at once and compare prices in local currency — useful for cross-border sellers, importers and travel shoppers.

#### Market and product research

Pull 120 products per search for a category, then group by seller, price band and rating to size a niche before launching a product.

#### AI agents and LLM workflows

An agent can answer "where is this cheapest?" or "what are the best-rated standing desks under $400?" with one call: flat rows, numeric prices, and a direct store link with the add-on.

### Integrations

#### Apify API (JavaScript)

```javascript
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_APIFY_TOKEN' });
const run = await client.actor('lergassy/google-shopping-scraper').call({
    queries: ['wireless earbuds', 'iphone 16 case'],
    countries: ['US', 'GB'],
    maxProductsPerQuery: 40,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items.map((r) => [r.country, r.title, r.price, r.currency, r.seller]));
```

#### Apify API (Python)

```python
from apify_client import ApifyClient
client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("lergassy/google-shopping-scraper").call(run_input={
    "queries": ["standing desk"],
    "countries": ["United States"],
    "sortBy": "review_score",
    "includeSellerOffers": True,
    "maxProductsWithOffers": 5,
})
for row in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(row["title"], row["price"], row.get("lowestTotalPrice"), row.get("lowestPriceSeller"))
```

#### One HTTP call

`POST https://api.apify.com/v2/acts/lergassy~google-shopping-scraper/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN` with the input JSON as the body returns the rows directly.

#### No-code tools

Use the Apify integrations for **n8n**, **Make**, **Zapier**, **Google Sheets**, **Airtable**, **Slack** or a **webhook** after each run. A scheduled task with your product list becomes a daily price tracker.

#### MCP server

Connect `https://mcp.apify.com` to Claude, ChatGPT, Cursor or any MCP client and ask for `lergassy/google-shopping-scraper`. The agent sees the input fields and gets one flat row per product back.

### 🤖 For AI Agents & LLM Apps

Compact reference for agents calling `lergassy/google-shopping-scraper` through the Apify MCP server or API.

**Purpose:** one row per product on Google Shopping for a search term in a country: what is sold, at what price, by which store, how well rated, with a discount or not; optionally every store's offer with total price and link.

**Minimal input:**

```json
{ "queries": ["product search"], "countries": ["US"] }
```

**Output:** type, query, country, position, title, price, oldPrice, discountPercent, currency, seller, rating, ratingsCount, delivery, freeDelivery, deliveryPrice, tags, imageUrl, productId, gid, dataDocId, googleShoppingUrl, resultSection, countryCode, language, searchUrl, scrapedAt. With `includeSellerOffers`: offersCount, lowestTotalPrice, lowestPriceSeller, productUrl, offers (array of position, seller, domain, url, offerTitle, basePrice, shippingPrice, tax, totalPrice, currency, condition, availability, offerNote, sellerRating, sellerRatingsCount), offersNote. Error rows: type = error, input, error.

**Behaviors an agent should know:**

- Searches = search terms × countries; `maxProductsPerQuery` (default 40, max 120) applies to each.
- Prices are in the country's currency (`currency`); there is no conversion.
- `price` is the headline offer on the product card; the cheapest store is `lowestTotalPrice` and needs the add-on.
- `sortBy` is applied by the Actor to the collected products (strict order); `minPrice` / `maxPrice` are applied by Google and re-checked per row.
- A nonsense or misspelled English term that Google answers with unrelated popular products returns one free error row instead of charged junk rows.
- Offer `url` is the store's own link when Google's redirect can be followed, otherwise an absolute `https://www.google.com/goto?url=…` link that opens the store.
- Billing: `product` per product row; `seller-offers` per product that received offers. Error rows and no-result searches are free. No start fee.
- Identical searches repeated within 24 hours return the same snapshot (see FAQ).

### Error items / Troubleshooting

Error rows look like `{ "type": "error", "input": "Narnia", "error": "Unknown or unsupported country \"Narnia\". … Not charged.", "scrapedAt": "…" }` and are always free. They appear when:

- a country is not one of the 45 supported (the message lists them all) — the other countries still run;
- the language is not recognised;
- a search term has no letters or digits, or is longer than 700 characters;
- `minPrice` is higher than `maxPrice`;
- Google Shopping returns no products for a search, or the results were not ready within 4 minutes.
- an English search term matches nothing and Google fills the page with unrelated popular products (for example a typo-only or random-letters term) — these are not saved or charged.

If many searches return nothing, the Actor stops early: every product already found stays in the dataset, and each remaining search gets a free error row saying it was skipped. Check the spelling of the search terms and that the product is sold in the chosen country.

### ❓ FAQ

#### Is it legal to scrape Google Shopping?

Google Shopping pages are public: anyone can see these products and prices without logging in, and the Actor only returns what such a visitor sees. It collects no personal data. How you use the data is your responsibility — check Google's terms and the laws of your country, and ask a lawyer if you plan to republish the data.

#### How fresh are the prices?

Each search reads Google Shopping at the time of the run. To keep repeated runs cheap, an identical search (same term, country, language, sort, price range and size) is reused for up to **24 hours**: the Actor keeps a small key-value store named `dfs-cache-google-shopping-scraper` in your Apify account for this. Change any input value, or wait a day, to get a new reading. `scrapedAt` shows when the row was produced.

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

Up to 120 per search term per country. Google Shopping shows about 40 products per page; in our test a 120-product request returned 119 products (one duplicate removed). Carousel products, when switched on, come on top.

#### Does it work without proxies?

Yes. You do not need proxies, cookies or a Google account; nothing runs a browser in your account. The Actor runs on the smallest memory size.

#### Why is a product's rating empty?

Google shows ratings only for products with reviews. When there is no rating on the card, `rating` and `ratingsCount` are `null`.

#### Why does a product have no `productId`?

Some Google Shopping cards (often marketplace listings) carry only an offer id. Those rows still have `dataDocId` and `googleShoppingUrl`; the seller offers add-on requests their store list with that id, and if Google returns none the product is not charged for the add-on.

#### How much does it cost to scrape 1,000 Google Shopping products?

$2.625 on paid plans, $3.50 on the Free plan. Seller offers add $0.009 on Starter ($0.01 on the Free plan) per product that receives them.

#### Can I use Google Shopping Scraper with the Apify API?

Yes. Every run can be started, scheduled and read through the Apify API or the official JavaScript and Python clients — see Integrations above.

#### Can I use it through an MCP server?

Yes. Add `https://mcp.apify.com` to your MCP client (Claude Desktop, Claude Code, ChatGPT, Cursor) and the agent can call `lergassy/google-shopping-scraper` directly with search terms and countries.

#### Can I integrate it with other apps?

Yes — n8n, Make, Zapier, Google Sheets, Airtable, Slack and webhooks are available from the Integrations tab of the Actor.

#### Do I get one row per product?

Yes. One row per product per search, with the seller offers nested in the same row. The **Seller offers ($)** table view unwinds them into one line per store.

### Your feedback

Found a product field that is wrong, a country that is missing, or a feature you need? Open an issue in the **Issues** tab — we read every one and reply quickly. If the Actor saves you time, a review on the Store page helps other buyers find it.

### You might also like

| Actor | What it does |
|---|---|
| [Amazon Search Scraper](https://apify.com/lergassy/amazon-search-scraper) | Amazon search results on 21 marketplaces: ASIN, price, list price, rating, ratings count, bought last month, position |
| [AliExpress Products Scraper](https://apify.com/lergassy/aliexpress-products-scraper) | AliExpress products for any keyword: sale and original price, discount, rating, exact orders, ships-from, delivery |
| [Shopee Scraper](https://apify.com/lergassy/shopee-scraper) | Shopee products, prices, discounts, brands, sellers and shops across 11 marketplaces |
| [Lazada Scraper](https://apify.com/lergassy/lazada-scraper) | Lazada products, prices, discounts, sellers, variants and reviews across six Southeast Asian marketplaces |

# Actor input Schema

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

Enter one product search per line, exactly as you would type it into Google Shopping (e.g. <code>wireless earbuds</code>, <code>iphone 16 case</code>, <code>nike air max 90</code>). Every search term runs in every country below.

## `countries` (type: `array`):

Enter one country per line, by name or two-letter code (United States, US, United Kingdom, GB, Germany, DE…). 45 Google Shopping countries are supported: Argentina, Australia, Austria, Belgium, Brazil, Canada, Chile, Colombia, Czechia, Denmark, Finland, France, Germany, Greece, Hungary, India, Indonesia, Ireland, Israel, Italy, Japan, Malaysia, Mexico, Netherlands, New Zealand, Norway, Philippines, Poland, Portugal, Romania, Saudi Arabia, Singapore, Slovakia, South Africa, South Korea, Spain, Sweden, Switzerland, Thailand, Turkiye, Ukraine, United Arab Emirates, United Kingdom, United States, Vietnam. Prices come in that country's currency.

## `maxProductsPerQuery` (type: `integer`):

Set how many products to return for each search term in each country (1–120). Google Shopping shows about 40 products per page; 40 is the natural size of one search.

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

Optional: interface language for every country, by name or code (English, en, German, de, Spanish, es…). Leave empty to use each country's main language (United States → English, Germany → German, Japan → Japanese).

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

Order of the products of each search. Google Shopping no longer applies sorting reliably, so the Actor sorts the products it collected itself (the top N most relevant for your term): by price (products without a price last) or by rating. Position in the output follows this order.

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

Optional: only products priced at or above this amount, in the country's currency (whole number). Applied by Google Shopping itself.

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

Optional: only products priced at or below this amount, in the country's currency (whole number). Applied by Google Shopping itself.

## `includeSellerOffers` (type: `boolean`):

Switch on to add every store selling each product: store name, domain, direct product link, base price, shipping, tax, total price, condition, availability and store rating, plus the lowest total price. Up to 10 offers per product. Charged per product that has offers (see Pricing); products without offers are free.

## `maxProductsWithOffers` (type: `integer`):

With seller offers on: fetch offers for the first N products of each search (1–120). Products below this position get no offers and no add-on charge.

## `includeCarouselProducts` (type: `boolean`):

Switch on to also return products from Google Shopping's themed carousels (e.g. 'Deals on wireless earbuds', 'Budget picks'). Duplicates of products already in the results are removed; each row says which section it came from.

## Actor input object example

```json
{
  "queries": [
    "wireless earbuds"
  ],
  "countries": [
    "United States"
  ],
  "maxProductsPerQuery": 40,
  "sortBy": "relevance",
  "includeSellerOffers": false,
  "maxProductsWithOffers": 10,
  "includeCarouselProducts": false
}
```

# Actor output Schema

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

One row per Google Shopping product: title, price, old price, discount, currency, seller, rating, ratings count, delivery, image, product ids and Google Shopping URL; with the add-on also seller offers.

# 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": [
        "wireless earbuds"
    ],
    "countries": [
        "United States"
    ],
    "maxProductsPerQuery": 40
};

// Run the Actor and wait for it to finish
const run = await client.actor("blueskyscraper/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": ["wireless earbuds"],
    "countries": ["United States"],
    "maxProductsPerQuery": 40,
}

# Run the Actor and wait for it to finish
run = client.actor("blueskyscraper/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": [
    "wireless earbuds"
  ],
  "countries": [
    "United States"
  ],
  "maxProductsPerQuery": 40
}' |
apify call blueskyscraper/google-shopping-scraper --silent --output-dataset

```

## MCP server setup

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