Google Shopping Scraper: Prices, Stores, Ratings, Discounts avatar

Google Shopping Scraper: Prices, Stores, Ratings, Discounts

Pricing

from $1.79 / 1,000 products

Go to Apify Store
Google Shopping Scraper: Prices, Stores, Ratings, Discounts

Google Shopping Scraper: Prices, Stores, Ratings, Discounts

Scrape Google Shopping for any product search: price and currency, old price and discount, store name, rating and review count, delivery and returns text, condition, thumbnail, Google product page and product ids. Pick country and language. Repeats are dropped and never charged. No login.

Pricing

from $1.79 / 1,000 products

Rating

0.0

(0)

Developer

The Mine Works

The Mine Works

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

15 days ago

Last modified

Share

120 Google Shopping products in 22 seconds

From The Mine Works, makers of Threads Scraper and B2B Leads Finder, with over 140,000 runs across 170+ public actors.

Why choose this actor?

  • Price, store and discount on every row. Each product comes with its price as a number and as shown, the currency, the old price and discount badge when Google shows a deal, the store, whether other stores sell it too, rating, review count, delivery and returns text, condition, a thumbnail, a link to Google's product page and Google's product ids. In our test on 5 October 2026, two searches returned 120 products in 22 seconds; all 120 had a price, currency, store, thumbnail and product link, and 108 had a rating. No Google account, no API key, no browser.
  • Any country, in its own currency. Set a two letter country and a language and Google shows that market's stores and prices. A German run returned 40 products, all in euros, with German returns and condition text, and prices written as 177,14 € were read as 177.14. Ratings are the exact value Google stores (4.24 where the card rounds to 4.2) and review counts are exact (10,202 where the card says 10K).
  • You never pay for filler or repeats. When Google cannot match a search it shows popular products instead of an empty page. The actor checks every page, and a page where not one title holds a word of your search is not delivered and not charged: our nonsense search "qzxvblorft wwkpjjq" cost nothing, while Google had served 40 unrelated products for it. Later Google pages repeat some earlier products; repeats are dropped and never charged.

Run it on Apify

Part of The Mine Works E-commerce and marketplaces family: Ozon.ru Scraper, ⭐ Amazon Reviews Scraper, Amazon Product Scraper, Etsy Listings Scraper, AliExpress Scraper, Kleinanzeigen.de Scraper.

Try it in one minute

Paste this into the JSON tab of the input page and press Start. It returns 20 products for each of two searches in well under a minute.

{
"queries": ["wireless earbuds", "air fryer"],
"maxResultsPerQuery": 20
}

Give the input as product searches only, one per line in the "Search terms" box (or as a JSON array in queries), typed the way you would type them into Google Shopping: a product type, a brand, or a brand and model. Each search gets its own rows in Google's order. Country and language apply to every search in the run; to compare markets, start one run per country.

Apify's free plan includes $5 of credit every month, which covers about 1,600 products at this actor's price.

Copy to your AI assistant

themineworks/google-shopping-scraper on Apify. Scrapes Google Shopping results for product searches and returns one row per product with title, price, currency, price as shown, old price, discount badge, store name, whether more stores sell it, rating, review count, delivery text, returns text, condition, thumbnail URL, Google product page link, catalog id, offer id, group id and rank. Call ApifyClient("TOKEN").actor("themineworks/google-shopping-scraper").call(run_input={...}), then client.dataset(run["defaultDatasetId"]).list_items().items. Required: queries (array of product searches). Optional: maxResultsPerQuery (default 60, 20 to 500), country (default "us", two letter code), language (default "en"). Skip rows with _type "info"; the per search run summary is the key-value store record OUTPUT. Full spec: GET https://api.apify.com/v2/acts/themineworks~google-shopping-scraper/builds/default (Bearer TOKEN), which returns inputSchema and readme. Token: https://console.apify.com/account/integrations?fpr=ymnoit&utm_source=apify-readme&utm_medium=referral

Key features

  • 27 fields per product: the search, rank, page, title, price, currency, price as shown, old price and as shown, discount badge, store, more stores flag, rating, review count, delivery, returns, condition, thumbnail, Google product page link, catalog id, offer id, group id, listing id, country, language, search link and collection time.
  • Up to 500 products per search, up to 500 searches per run. Google shows 40 to 50 products a page; the actor reads page after page and drops repeats until it has your number or Google has nothing new. Three searches run at a time.
  • Every market. Pass any two letter country code (us, gb, ca, au, in, de, fr, es, it, br, jp...) and a language code. Currency is read from the price itself and the country: $ means USD in the US, CAD in Canada and AUD in Australia; CA$, R$, ₹, €, £, kr, zł and others are recognised.
  • Exact ratings and review counts from Google's own card data rather than the rounded text.
  • A link to Google's product page for every row, which lists every store's offer for that product. We opened links for a product sold by many stores and for a single store listing; both opened the right product.
  • Plain HTTP and small memory. No browser: Google's results page already holds every card, so a run uses 256 MB and peaked at 109 MB in our tests.

How to use it

{
"queries": ["air fryer"],
"maxResultsPerQuery": 60
}

About one and a half Google pages, ranked as Google shows them.

Several searches at once

{
"queries": ["wireless earbuds", "robot vacuum", "standing desk"],
"maxResultsPerQuery": 100
}

Each search is read on its own, three at a time. A search with fewer products than you asked for returns what Google has, and its status in the run summary says why it stopped.

Daily price watch for your products

{
"queries": ["sony wf-1000xm5", "bose quietcomfort ultra earbuds", "apple airpods pro 3"],
"maxResultsPerQuery": 40,
"country": "us"
}

Schedule it daily in Apify Console (Schedules, Add schedule). Compare price, old_price and merchant by product_id from one day to the next to see who cut the price, and discount_text to catch deals.

Who sells my category, and at what price

{
"queries": ["espresso machine", "burr coffee grinder"],
"maxResultsPerQuery": 200
}

Group by merchant to see which stores Google shows most, and by currency and price for the price spread of a category. more_stores: true means Google knows other stores selling the same product; product_link opens Google's page with all of their offers.

Market comparison across countries

{
"queries": ["kopfhörer", "kaffeemaschine"],
"maxResultsPerQuery": 60,
"country": "de",
"language": "de"
}

Run the same searches with country set to each market (de, fr, gb, us...) and compare prices in each local currency. Delivery, returns and condition text come in the language you choose.

Rating and review research

{
"queries": ["electric toothbrush", "water flosser"],
"maxResultsPerQuery": 100
}

Sort by review_count and rating to see which products Google's shoppers review most, and which ones rate low despite a high rank.

Input parameters

ParameterTypeDefaultWhat it does
queriesarray of strings["wireless earbuds", "air fryer"]Product searches, one per item, up to 500. Required. Repeats are removed.
maxResultsPerQueryinteger60Most products per search, 20 to 500.
countrystringusTwo letter country code of the shop market (gl). Stores, prices and currency follow it.
languagestringenGoogle interface language (hl), such as en, de, fr. Sets the language of delivery, returns and condition text.

What data do you get?

One row per product, in Google's order for each search.

The product: title, thumbnail_url, rating (out of 5, two decimals), review_count, condition (only when not new, such as Refurbished or Pre-owned, in the page's language).

The offer shown on the card: price (a number), currency (ISO code), price_text (as shown), old_price and old_price_text (when Google shows an earlier or usual price), discount_text (such as 25% OFF), merchant (the store), more_stores (true when Google says other stores sell it too), delivery (such as Free delivery by Thu), returns (such as 30-day returns).

Google's ids and link: product_link (Google's product page with every store's offer), product_id (the catalog id, missing for some single store listings), offer_id, group_id (the colours or sizes of one product), listing_id.

The search: query, position (1 is the first product Google shows, after repeats are removed), page, country, language, search_url (the same search on Google Shopping), scraped_at.

Stable fields for automations

These fields were present in all 120 rows of our test run and will keep these names:

FieldWhat it holds
queryThe search the row belongs to
positionRank within that search, from 1
titleProduct title
pricePrice as a number
currencyISO currency code
price_textPrice exactly as shown
merchantStore at the shown price
more_storesTrue when other stores sell it too
thumbnail_urlProduct image
product_linkGoogle product page with every store's offer
offer_idGoogle's id of the shown offer
listing_idGoogle's id of the card's listing
search_urlThe Google Shopping search
scraped_atCollection time, ISO 8601 UTC

We will not rename these fields. New fields may be added. product_id (the catalog id) was in 117 of 120 rows: single store listings without a Google catalog entry have none.

Output examples

Real rows from our runs on 5 October 2026: the first in full, the others trimmed for length.

A deal with an old price and a discount badge, rank 7 for "wireless earbuds":

{
"query": "wireless earbuds",
"position": 7,
"page": 1,
"title": "JBL Vibe Buds 2 Noise Cancelling True Wireless Earbuds",
"price": 39.99,
"currency": "USD",
"price_text": "$39.99",
"old_price": 65,
"old_price_text": "$65",
"discount_text": "38% OFF",
"merchant": "Target",
"more_stores": true,
"rating": 3.56,
"review_count": 471,
"delivery": "Free delivery",
"returns": "30-day returns",
"thumbnail_url": "https://encrypted-tbn1.gstatic.com/shopping?q=tbn:ANd9GcS7md3SWuMoZo0jAtaTr-82jQ3zbZ0aWD3Qlzro5w5bBuZlSUxRpALTH60Fi5cP5FXTRbUvtuG07iiGiNBsNngJU0juzPjA",
"product_link": "https://www.google.com/search?ibp=oshop&q=JBL+Vibe+Buds+2+Noise+Cancelling+True+Wireless+Earbuds&prds=catalogid%3A15008238774157370735%2CheadlineOfferDocid%3A4307473848934577272%2CimageDocid%3A7730178198611898085%2Cgpcid%3A18415526280809133228%2Cpvt%3Ahg&hl=en&gl=us",
"product_id": "15008238774157370735",
"offer_id": "4307473848934577272",
"group_id": "18415526280809133228",
"listing_id": "10064219538562134692",
"country": "us",
"language": "en",
"search_url": "https://www.google.com/search?q=wireless+earbuds&udm=28&hl=en&gl=us",
"scraped_at": "2026-10-05T17:38:20.107Z"
}

The first product for "air fryer":

{
"query": "air fryer",
"position": 1,
"page": 1,
"title": "COSORI 9-in-1 TurboBlaze Air Fryer 6 Qt",
"price": 89.99,
"currency": "USD",
"price_text": "$89.99",
"old_price": 120,
"old_price_text": "$120",
"discount_text": "25% OFF",
"merchant": "Cosori",
"more_stores": true,
"rating": 3.9,
"review_count": 145,
"delivery": "Free delivery",
"returns": "30-day returns",
"product_id": "15949526360554442507",
"offer_id": "6409429243624176268"
}

A pre-owned listing, with its condition, rank 40 for "air fryer":

{
"query": "air fryer",
"position": 40,
"title": "Instant Pot 5.3qt Air Fryer with Odor Erase + Clearcook",
"price": 30.99,
"currency": "USD",
"discount_text": "69% OFF",
"merchant": "Rebel",
"more_stores": false,
"rating": 3.47,
"review_count": 46,
"returns": "14-day returns",
"condition": "Pre-owned",
"product_id": "17687139548760332334"
}

A German search (country de, language de), a refurbished offer at rank 1 for "sony wf-1000xm5":

{
"query": "sony wf-1000xm5",
"position": 1,
"page": 1,
"title": "Kopfhörer Sony WF-1000XM5",
"price": 150,
"currency": "EUR",
"price_text": "150,00 €",
"merchant": "Mediamarkt Marketplace DE",
"more_stores": true,
"rating": 4.04,
"review_count": 3235,
"returns": "Rücknahme innerhalb von 30 Tagen",
"condition": "Erneuert",
"product_id": "13754034627404443635",
"offer_id": "16551240416395345901",
"country": "de",
"language": "de"
}

When a run delivers nothing, the dataset holds one row with _type: "info" and a message saying why (for example, Google showed only unrelated products). That row is never charged.

Pricing

You pay per product delivered to your dataset (event product-scraped), plus a flat $0.005 per run, whatever memory you choose (event run-start).

Apify planPer 1,000 products
Free$2.99
Starter (Bronze)$2.59
Scale (Silver)$2.19
Business (Gold) and above$1.79

Never charged:

  • a product Google repeats on a later page of the same search;
  • pages Google refused, and searches Google has no products for;
  • pages where not one product title holds a word of your search (the popular products Google shows when it cannot match a search);
  • the info row written when a run delivers nothing, and the OUTPUT run summary.

To cap what a run can cost, set a maximum total charge in the run options. The actor stops before a product the budget cannot pay for.

FAQ

What is Google Shopping?

Google's product search: the Shopping tab of a Google search, at google.com/shopping. For a product search it shows cards from many online stores with price, store, rating and delivery. This actor reads those cards and returns each one as a row.

Up to 500 per search. Google shows 40 to 50 products a page and repeats a few on later pages; in our test the second page of "wireless earbuds" added 34 new products to the 48 of the first. The actor stops a search when it has your number, when Google has nothing new, or when Google answers an empty page.

Is the price the lowest price?

It is the price on the card Google shows: one store's offer, usually the one Google picks for the card. When more_stores is true, other stores sell the same product, possibly cheaper; open product_link to see every offer on Google's product page.

Not in this version. Every row has product_link, Google's page for the product, which lists each store with a link to its offer. Google does not put store links on the results page itself.

Which countries and currencies work?

Any country Google Shopping serves; we tested the United States and Germany before release. Set country to its two letter code and the cards come from that market, priced in its currency. currency is read from the price and the country, so a plain $ becomes USD, CAD or AUD depending on the country. If a price uses a symbol the actor does not know, currency stays empty and price_text keeps the original.

How fresh is the data?

Every run reads Google live, so prices, deals and stores are as Google shows them at that moment. Schedule the actor to track changes.

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

No. The actor reads Google's public Shopping page, signed out.

Do I need to set up a proxy?

No. The actor always uses Apify's Google search proxy, which is included in the price. You cannot point it at another proxy.

Why did a search return no products?

Open the run's OUTPUT record in the key-value store: it lists every search with a status. no_match means Google showed only unrelated popular products (no title held a word of your search), so nothing was delivered or charged. no_results means Google had nothing. blocked means Google refused the page three times; nothing was charged for it, and a later run usually works.

Which formats can I export?

JSON, CSV, Excel, XML, HTML table and RSS from the dataset page in Apify Console, or through the Apify API.

Can I run it on a schedule?

Yes. In Apify Console open the actor, then Schedules, Add schedule, and pick how often. Each run reads Google fresh with the same input, which suits daily price and deal tracking by product_id.

Can I use it from Claude, ChatGPT or another AI agent?

Yes, through Apify's MCP server. Connector URL: https://mcp.apify.com/?tools=themineworks/google-shopping-scraper

  • Claude: Settings > Connectors > Add custom connector, paste the URL, sign in with Apify.
  • ChatGPT: turn on developer mode, add an MCP connector with the URL, sign in with Apify.
  • Cursor or VS Code: add it as an HTTP MCP server with that URL.
  • Claude Code: claude mcp add -t http google-shopping-scraper "https://mcp.apify.com/?tools=themineworks/google-shopping-scraper"

The actor collects only what Google shows any signed out visitor: product titles, prices, stores and ratings that stores publish to sell their products. It holds no personal data. You are responsible for how you use the data, including Google's terms and data protection laws such as GDPR and CCPA.

Integrations

  • Google Sheets: send each run's dataset to a sheet with Apify's Google Sheets integration, for example a daily price table.
  • Make, Zapier and n8n: start runs and receive products in your workflows, for example to alert on a price drop.
  • Webhooks: get a call when a run finishes and fetch the dataset.
  • API: start runs and read datasets from any language with the Apify API or the Python and JavaScript clients.
  • MCP clients: Claude, ChatGPT, Cursor and other agents through Apify's MCP server.

More from The Mine Works

E-commerce and marketplaces

Social media and video

Leads and business directories

Marketing, SEO and reviews

LinkedIn

Real estate

Science, health and government data

Jobs and hiring

Company and business data

Food and local services

Developer and AI tools

More tools

Support

Found a problem or need a field? Open an issue on the actor's Issues tab and we will answer there. For a new source or a custom build, email dmineworks@gmail.com.

Google Shopping Scraper turns any product search into rows of prices, stores, discounts, ratings and Google product links, in any country's currency, with no charge for repeats or filler.