Google Shopping Scraper: Prices, Stores & Discounts avatar

Google Shopping Scraper: Prices, Stores & Discounts

Pricing

from $2.00 / 1,000 products

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

Google Shopping Scraper: Prices, Stores & Discounts

Product prices from Google Shopping in 30 countries: price, was-price and discount, condition, store, delivery, returns, rating and reviews, one flat row per offer. Several countries per run; filter and sort by price, condition and store. $0.002 per product + $0.003 per Google page.

Pricing

from $2.00 / 1,000 products

Rating

0.0

(0)

Developer

Naveen Raja

Naveen Raja

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

8 days ago

Last modified

Categories

Security

Limited permissions

Share

Get product prices from Google Shopping for any search in 30 countries: one flat row per offer with the price as a number and its currency, the was-price and discount, condition (new, refurbished, used), store, an "& more stores" flag, delivery and returns, rating and review count, Google's product IDs and a link to the product in Google Shopping. Search product names, model numbers or categories, run them in several countries at once, and filter and sort the rows.

Price: $0.002 per product + $0.003 per Google results page (a page brings up to 40 products), about $2.10 per 1,000 products, plus $0.0005 per run. No subscription and no extra usage fees: platform and proxy costs are included. Error rows, pages that only repeat products, blocked or retried requests and the run summary are free.

You wantProductsGoogle pagesYou pay
10 products for one search (the example input)101$0.023 + $0.0005
The first page of one search401$0.083 + $0.0005
100 products for each of 10 searches1,000about 30$2.09 + $0.0005
3 searches in the US and the UK, up to 3 pages each (our test run)49414$1.03 + $0.0005
Daily check of 20 offers for a month60030$1.29 + $0.015

Unofficial. This Actor is not affiliated with, endorsed by or sponsored by Google. Google Shopping is a trademark of Google LLC. See Legal before you use the data.

What you get

  • One row per product offer, the same fields every time: title, price, currency, priceText, originalPrice, discountPercent, typicalPrice, badge, condition, merchant, hasMoreSellers, delivery, returns, rating, reviewCount, productId, offerId, googleShoppingUrl, position, page and more (all fields).
  • Prices you can compute with: price is a number and currency an ISO code, read from the price as Google writes it in each country ($1,299.99, 1.299,99 €, 1 599,00 kr, ¥12,800, R$ 319,00). Cross-border offers come converted into the country's currency, with the seller's own price in foreignPriceText ("AED 899").
  • Was-price, discount and Google's badges: the struck-through price, the discount in %, Google's "Usually $400" price and its badges ("35% OFF", "SALE", "LOW PRICE").
  • Condition on every row: new, refurbished or used, plus Google's own label ("Pre-owned", "Gebraucht", "Reconditionné").
  • 30 countries, several in one run: each query runs in every country you pick, located with Google's own location parameter and Apify's Google SERP proxy for that country, so prices come in the country's currency and Google places the search in that country (checked in all 30 countries on 28 Oct 2026).
  • Deep, clean lists: Google's result pages one after another (in practice up to about 300-350 products per query, 10 pages), repeats across pages removed, positions kept in Google's order.
  • Filters and sorting: price range, condition, only or except certain stores, words the title must include, and sorting by price, rating, reviews or discount. Google ignores its own price and sort parameters on these pages, so the Actor applies them itself: the sort covers every product on the pages it reads for a query, then keeps the best "Max products per query".
  • Changes since the last run (optional, best effort): changeType (new, price_down, price_up, unchanged), previousPrice and priceChangePct for offers that the last run also returned. Not a monitoring tool: see Changes since the last run.
  • Clear errors: an invalid entry or a search without products gets a free error row with the reason; the other searches still run.

Use cases

  • Price snapshots: schedule searches for your products (model names) and keep each day's prices, stores and discounts as Google shows them.
  • MAP and reseller checks: see which stores, and which sellers on business marketplaces such as Walmart or Amazon, sell a brand's products, at what price and in what condition.
  • Competitor and assortment research: who sells a product category in a country, at which price points, with which delivery and returns.
  • Deal finding: sort by discount, or filter refurbished and used offers within a price range.
  • Cross-country price comparison: the same queries in the US, UK, Germany, Japan and more in one run, each in its own currency.
  • Data for automations: a predictable JSON schema, one row per offer, callable from the API, Make, Zapier or n8n.

How to use

  1. Add one or more search queries (one per line): product names or models (sony wh-1000xm5) or categories (air fryer). Barcodes (GTIN / EAN / UPC) work only loosely, see the FAQ.
  2. Pick the countries (default: United States) and, if you like, the language of Google's labels (default en).
  3. Set Max products per query (default 40, one Google page) and Max Google pages per query (default 3).
  4. Optional: a price range, condition, stores to keep or exclude, words the title must include, a sort order, and Mark changes since the last run.
  5. Run, then download the results as JSON, CSV or Excel, or use the API. A run summary is saved as the SUMMARY record.

Input example

{
"queries": ["sony wh-1000xm5", "air fryer", "lego millennium falcon 75375"],
"countries": ["US", "GB"],
"maxProductsPerQuery": 120,
"maxPagesPerQuery": 3
}

Refurbished and used offers under $250, cheapest first, without marketplace listings from eBay:

{
"queries": ["sony wh-1000xm5"],
"countries": ["US"],
"condition": ["refurbished", "used"],
"maxPrice": 250,
"excludeMerchants": ["eBay"],
"sortBy": "price_low_to_high",
"maxPagesPerQuery": 3,
"maxProductsPerQuery": 100
}

Daily snapshots of two products at chosen stores (save it as a task and schedule it):

{
"queries": ["sony wh-1000xm5", "dyson v15 detect"],
"countries": ["US"],
"merchants": ["Best Buy", "Walmart", "Target"],
"trackChanges": true,
"trackingId": "my-snapshots"
}

Output example

A row from a cloud run on 28 Oct 2026 (shortened IDs):

{
"status": "ok",
"query": "sony wh-1000xm5",
"position": 1,
"page": 1,
"title": "Sony WH-1000XM5 Wireless Noise Canceling Headphones",
"price": 254.99,
"currency": "USD",
"priceText": "$254.99",
"isFromPrice": false,
"originalPrice": 398,
"discountPercent": 35,
"typicalPrice": null,
"badge": "35% OFF",
"condition": "new",
"conditionText": null,
"merchant": "Best Buy",
"hasMoreSellers": true,
"delivery": "Free delivery",
"returns": null,
"rating": 4.6,
"reviewCount": 14000,
"unitPriceText": null,
"foreignPriceText": null,
"productId": "8123523306754565002",
"offerId": "163140494159410681",
"catalogId": "17755277695162489284",
"googleShoppingUrl": "https://www.google.com/search?ibp=oshop&q=sony+wh-1000xm5&prds=catalogid:17755277695162489284,gpcid:11726664398501807381,headlineOfferDocid:163140494159410681,imageDocid:6358316805486853251,productDocid:8123523306754565002&hl=en&gl=us&udm=28",
"imageUrl": null,
"changeType": null,
"previousPrice": null,
"priceChangePct": null,
"firstSeenAt": null,
"country": "US",
"language": "en",
"scrapedAt": "2026-10-28T07:28:30Z",
"error": null,
"errorKind": null
}

Output fields

FieldMeaning
statusok for a product row (charged), error for a free error row
query, country, languageThe search the row comes from
position, pagePosition in Google's list for this query and country (1 = first, repeats removed; kept when you sort) and the Google page it was on
titleProduct title as the store lists it, without seller names (Poshmark's "closet" is cut)
price, currency, priceTextPrice as a number, its ISO currency code, and the price as Google shows it
isFromPricetrue for a "from" price ("$180+"): Google shows the lowest of several stores or variants and names no store
originalPrice, discountPercentThe struck-through was-price (in India the list price / MRP) and the reduction in % (rounded down, as Google does)
typicalPriceGoogle's "Usually ..." price
badgeGoogle's badge as shown: "35% OFF", "SALE", "LOW PRICE", "PREISNACHLASS" ...
condition, conditionTextnew, refurbished or used, and Google's label. Google labels only refurbished and used offers, so an offer without a label is new
merchantStore as Google names it ("Best Buy", "Walmart - Focus Camera"). On marketplaces where private people sell (eBay, Mercari, Poshmark, Etsy ...) only the marketplace name is kept
hasMoreSellersGoogle adds "& more": other stores sell this product too
delivery, returnsDelivery and returns text as shown ("Free delivery by Tue", "30-day returns")
rating, reviewCountAverage rating out of 5 and the number of reviews (Google rounds large counts: 14K = 14000)
unitPriceText, foreignPriceTextUnit price ("$144/ct") and, for cross-border offers, the seller's own price
productId, offerId, catalogIdGoogle's IDs for the product, this store's offer and the product cluster
googleShoppingUrlThis offer in Google Shopping's product viewer (where shoppers see all stores)
imageUrlThumbnail URL, where Google's page has one (about a third of the rows)
changeType, previousPrice, priceChangePct, firstSeenAtWith Mark changes since the last run (best effort): new, price_down, price_up or unchanged against the last run that returned the offer, the earlier price, the change in % and when the offer was first returned
scrapedAtStart of the run (UTC)
error, errorKindError rows only: the reason, and invalid_input, no_results, blocked, wrong_country, network, source_error or internal_error

Pricing

Pay per event: you pay for the products in your dataset and for the Google pages that brought them.

EventPriceWhen
Product$0.002One product row in the dataset
Google results page$0.003One Google Shopping results page read that brought at least one new product (up to 40)
Actor start$0.0005Once per run

Free: error rows, a page that only repeats products already returned (the query stops there), the empty page at the end of Google's list, blocked, failed, retried or abandoned requests, offers removed by your filters or without a price, and the SUMMARY record. A page whose new products are all removed by your filters is still charged as a page: the Actor had to read it. Rows are pushed page by page; with a sort order they are pushed when the query's pages have all been read, and the page fees are charged at that moment, together with the rows, so a run that stops before (time limit, abort) charges nothing for those pages. Set a maximum cost per run in Apify Console: the Actor reserves the cost of a page and its products before it reads the page, never goes over the limit and never fetches what it can't charge for. A search waits for budget that other running searches will hand back, so a limit above the run's full cost delivers everything. When the limit is reached, a search that can't pay for its next page stops there and pushes what it has (with a sort order, the best of what it has read), and its note in the run summary says so; products it read but couldn't pay for are not charged and are counted in that note. "Stopped early: maximum charge reached" appears only when a search was actually stopped or cut that way.

Changes since the last run

This is a best-effort comparison, not a monitoring tool. Turn on Mark changes since the last run and run the same input again later. Each row is compared with the last run that returned the same offer (same query, country and language, and the same Tracking ID):

  • new: not returned before by this tracker;
  • price_down / price_up: cheaper or dearer, with previousPrice and priceChangePct;
  • unchanged: same price.

Measured match rate: Google returns a different mix of offers on almost every request. In our tests two runs a few minutes apart had only 11 and 26 of 80 offers in common ("sony wh-1000xm5" and "dyson v15 detect", 40 each); everything else came back as new. So a new row often means "Google didn't show it last time", and an offer that drops out of the list is not reported at all. Don't rely on it to catch every price change. It works better with Only these stores set to a few stores, because a store's own listing is matched again whenever Google shows it.

Cross-border offers are compared on the seller's own price, so exchange-rate moves don't count as changes. The state is a key-value store named google-shopping-price-tracking in your account; it holds only hashed offer keys, prices and dates of offers you have already received (no titles, stores or links). Offers not seen for 90 days are forgotten.

Use it from the API

curl -X POST "https://api.apify.com/v2/acts/fairfetch~google-shopping-scraper/run-sync-get-dataset-items?token=<YOUR_API_TOKEN>" \
-H "Content-Type: application/json" \
-d '{"queries": ["sony wh-1000xm5"], "countries": ["US"], "maxProductsPerQuery": 40}'

Python:

from apify_client import ApifyClient
client = ApifyClient("<YOUR_API_TOKEN>")
run = client.actor("fairfetch~google-shopping-scraper").call(
run_input={"queries": ["air fryer", "dyson v15 detect"], "countries": ["US", "GB"], "maxProductsPerQuery": 80}
)
for offer in client.dataset(run["defaultDatasetId"]).iterate_items():
print(offer["country"], offer["title"], offer["price"], offer["currency"], offer["merchant"])

Performance and limits

  • Speed: Google's pages come through Apify's Google SERP proxy, which answers most requests in 2-10 seconds and some in 60-90 seconds; a request still open after 20 seconds is sent a second time and the first answer wins. Near the run's time limit, requests still open are abandoned (not charged) so the rows already read can be saved. Queries run 5 at a time and each query's pages one after another. 450-523 products from 6 searches (3 queries in the US and the UK, up to 3 pages each) took 66-133 seconds in our test runs.
  • How many products: Google shows up to 40 products a page. Later pages add about 30-38 new products each (Google repeats some, which are removed) and fewer as the list goes on, and a query's list usually ends after 2-8 pages; the run summary then says "Google's list ended after N result pages". With the 10-page limit a query gives at most about 300-350 products.
  • Google's own variety: Google ranks Shopping results differently from one request to the next, so the same query can return a different mix of offers in two runs. For popular products the difference can be large: in our tests about 3 in 10 US requests for "sony wh-1000xm5" came back as a list made mostly of eBay, Mercari and Poshmark listings instead of the usual stores (Best Buy, Target, Walmart). When a first page comes back like that (half or more of its offers from used-goods marketplaces), the Actor asks Google once more, free for you, and keeps the answer with fewer such listings; if both answers look the same, the page is kept as it is. Later pages are taken as Google sends them.
  • What the results page doesn't have: links to the stores' own product pages and the full list of stores for each product load later in Google's page with JavaScript, so they are not in the rows. googleShoppingUrl opens the product in Google Shopping, where all stores are listed. Sponsored listings were not in the result pages in our tests (US, UK, Germany, France, Japan, Brazil, Australia, India), so the rows have no sponsored flag. Google's themed carousels on page 1 ("Best overall ...") are not included.
  • Store names: as Google shows them. On marketplaces where private people sell (eBay, Mercari, Poshmark, Depop, Vinted, Etsy, Kleinanzeigen, Kijiji, Trade Me, Shopee, Mercado Libre, OLX, Facebook Marketplace ...) the seller's user name is dropped and the row says only "eBay"; filters by store use that name. Seller names in titles are removed too (Poshmark adds the seller's "closet" to its titles).
  • Images: Google's results page carries thumbnail URLs for about a third of the products; the others are embedded in the page and not returned.
  • Filters and sorting apply to the products on the pages the Actor reads: it reads pages until it has Max products per query matching products (or reaches Max Google pages per query), and a sort then picks the best of all of them. They don't make Google return other products. With strict filters raise the page limit (every page read is charged).
  • Answers from another country's shops: now and then Google answers a search with another country's shops even though the request is located in your country (in our tests about 1 request in 10; for example Turkish shops priced in TRY for a US search, with "United States" in Google's footer). When the prices come in another currency, or Google's footer names another country, the Actor asks again, up to 2 extra times for this reason alone (free for you); if every answer is like that, the search ends with a free error row of kind wrong_country naming the currency seen. An answer from another country that uses the same currency (another dollar, euro or krone market) can't be told apart and is returned as it is.
  • Currency: almost always the country's own; Google now and then shows a "from" price in another currency (one row in 494 in our test), so use currency per row.
  • Blocking and wrong answers: requests that come back blocked, as Google's "JavaScript required" page or in a format the Actor can't read are retried (nothing is solved or bypassed); the run summary counts them. A first page with signs of products but no product the Actor can read counts as a failure on our side, not as "no results". If every search fails on our side, the run fails and only the Actor start is charged.

FAQ

Which countries? United States, United Kingdom, Canada, Australia, New Zealand, Ireland, Germany, Austria, Switzerland, France, Belgium, Netherlands, Spain, Italy, Portugal, Poland, Sweden, Denmark, Norway, Finland, Czechia, India, Japan, Singapore, Malaysia, Brazil, Mexico, South Africa, United Arab Emirates and Turkey.

Can I search by GTIN, EAN or UPC? Only loosely. Google treats a barcode as plain text and often returns unrelated products, which are charged like any row: in our tests the EAN of a Sony headphone returned 10 unrelated products out of 10 in Japan and 3 out of 10 in the US. Search by model name instead, or add Title must include (for example the model number), which drops non-matching offers for free.

Why are my prices different from what I see on Google? Google shows prices for your own location and changes them often. The Actor searches as a shopper in the chosen country.

Does it return reviews? No. It returns the average rating and the number of reviews, never review texts or reviewer names.

Why does a row have no store? Google shows some products with a "from" price ("$180+") that several stores share; isFromPrice is true and merchant is empty. Exclude them with Only these stores or by filtering on merchant.

Can I get every store's price for a product? Not from the results page: Google loads that list with JavaScript in its product viewer. hasMoreSellers tells you when other stores sell it.

This Actor reads what Google Shopping shows to any visitor without signing in: product titles, prices, stores, conditions, delivery and returns texts, average ratings and review counts. It does not log in, solve CAPTCHAs or collect personal data: no reviews or reviewer names, and on marketplaces where private people sell, no seller user names, neither in the store field nor in titles (Poshmark's "closet" names, @handles); titles are also scrubbed of e-mail addresses and phone numbers. Recognition is automatic, so an unusual format can slip through.

Google's terms of service restrict automated access to its services. Google's robots.txt (checked 28 Oct 2026) disallows crawlers from /search, which includes the Shopping results page this Actor reads (/search?udm=28), and from /shopping/product/. The Actor fetches the results pages through Apify's Google SERP proxy, Apify's own product for loading Google search pages, and its product links use the same /search address. You are responsible for using the Actor and the data lawfully and in line with the terms that apply to you, including the stores' rights in their listings. This is not legal advice.

Google and Google Shopping are trademarks of Google LLC; store names are trademarks of their owners. This Actor is not affiliated with, endorsed by or sponsored by Google or any store.