ParseForge Scrapers

Google Shopping Scraper - Product Prices & Offers

parseforge/google-shopping-prices-scraper

E-commerceLead generation

Scrape Google Shopping offers: title, price, original price, discount, merchant, rating, reviews, delivery and return terms. Export to CSV, JSON, Excel or XML.

Run this scraper See the API call
Total runs
39
Bookmarked
0
Last modified
2 days ago

This scraper was last updated on .

What does the Google Shopping Scraper - Product Prices & Offers return?

ParseForge Banner

๐Ÿ›’ Google Shopping Prices Scraper

๐Ÿš€ Export Google Shopping offers in seconds. One search query returns up to 40 offers per page with the current price, the struck-through original price, the discount percent, the merchant, the star rating, the review count and the delivery and return terms. 100 offers for "4k monitor" took 31 seconds on a 1 GB run.

Give the Actor one or more search queries and a country, and it reads the server-rendered Google Shopping results through Apify's Google SERP proxy, the route built for Google search pages. Every product card becomes one flat row with 21 fields, including Google's own product, cluster and offer IDs, so the same product can be tracked run after run. Price range, condition and sort order are handed to Google before the page is read, so filters never cost you rows.

Coverage is whatever Google Shopping serves for your query in the selected market: 39 countries and 21 interface languages are available in the input, pagination runs 40 offers per page up to Google's depth ceiling of about 400 per query, and multiple queries stack in one run.

๐ŸŽฏ Target Audience ๐Ÿ’ก Primary Use Cases
Price intelligence and revenue teams Read the market price of a product across every merchant Google lists
Brands and manufacturers See who sells your product, at what price, and who is undercutting MAP
Retail and e-commerce operators Track competitor prices and promotion depth by category
Deal, coupon and affiliate sites Find discounted offers with the original price and discount percent

๐Ÿ“‹ What the Google Shopping Prices Scraper does

๐Ÿ’ก Why it matters: Google answers datacenter and residential exits, browsers included, with HTTP 429 and a captcha, and its newer shopping tab ships no prices in the HTML. This Actor reads the server-rendered tbm=shop surface through the Google SERP proxy group, finds cards by their stable data-pid attribute and reads the screen-reader text Google maintains for each card, so a redesign of the CSS class names does not silently empty your dataset.

  • ๐Ÿท๏ธ Price: current price and currency symbol, the original price where Google prints one struck through, the discount percent and a Yes/No isOnSale flag.
  • ๐Ÿฌ Merchant: the merchant named on the card plus a Yes/No flag saying whether Google aggregates more sellers behind it.
  • โญ Reviews: star rating and review count, with Google's 5.4K shorthand expanded to a number.
  • ๐Ÿšš Terms: the delivery line and the return window exactly as printed on the card.
  • ๐Ÿ†” Identifiers: Google's product, cluster and offer IDs, plus a Google Shopping product page URL for every row.
  • ๐Ÿ–ผ๏ธ Thumbnail: the encrypted-tbn image URL when Google links one (about 4 cards in 10; the rest are inlined as image bytes and reported as Not Disclosed).
  • ๐Ÿ” Filters that do not cost rows: price range, condition and sort order are sent to Google; the on-sale and merchant filters are applied to the cards after they are read.

๐ŸŽฌ Full Demo (๐Ÿšง Coming soon)

A short walkthrough video is in production.

๐Ÿ“Š Output

Each row is one Google Shopping offer. Fields, in dataset order:

Field Description
๐Ÿ–ผ imageUrl Thumbnail URL from Google's image cache, or Not Disclosed when Google inlines the image instead of linking it
๐Ÿ“Œ title Product title as shown on the card
๐Ÿ”— url Google Shopping product page for the offer's product ID
๐Ÿ†” productId Google product ID, stable across runs
๐Ÿงฉ clusterId Google product cluster ID
๐Ÿท offerId Google offer ID for this merchant listing
๐Ÿ’ต price Current price as a number
๐Ÿ’ฑ currency Currency symbol printed on the card ($, ยฃ, โ‚ฌ)
๐Ÿท originalPrice Struck-through original price, or N/A when the offer is not discounted
๐Ÿ“‰ discountPercent Discount percent printed by Google, 0 when there is none
๐Ÿ”ฅ isOnSale Yes when an original price higher than the current price is shown, else No
๐Ÿฌ merchant Merchant named on the card
๐Ÿช hasMultipleMerchants Yes when Google lists more sellers behind the card
โญ rating Star rating out of 5, or Not Disclosed
๐Ÿ—ฃ reviewCount Number of reviews, or Not Disclosed
๐Ÿšš delivery Delivery line as printed, or Not Disclosed
โ†ฉ๏ธ returnPolicy Return window as printed, or Not Disclosed
๐Ÿ”Ž query The search query that produced the row
๐ŸŒ country Market code used for the request
๐Ÿ•’ scrapedAt ISO timestamp of the collection
โŒ error null on success; error rows carry only this field and are never charged

Three real records from the cloud verification run (query "laptop", United States, Max Items 5):

[
  {
    "imageUrl": "Not Disclosed",
    "title": "HP OmniBook X Flip 2-in-1 16\" 2K OLED Touchscreen Laptop",
    "url": "https://www.google.com/shopping/product/1381297317110928014?gl=us&hl=en",
    "productId": "1381297317110928014",
    "clusterId": "12265389182617013139",
    "offerId": "4553594992797254453",
    "price": 999.99,
    "currency": "$",
    "originalPrice": 1350,
    "discountPercent": 25,
    "isOnSale": "Yes",
    "merchant": "Best Buy",
    "hasMultipleMerchants": "Yes",
    "rating": 4.7,
    "reviewCount": 384,
    "delivery": "Free delivery by Wed",
    "returnPolicy": "15-day returns",
    "query": "laptop",
    "country": "us",
    "scrapedAt": "2026-09-08T04:54:00.649Z",
    "error": null
  },
  {
    "imageUrl": "Not Disclosed",
    "title": "Lenovo Yoga 7a 2-in-1 AI PC Laptop | 14 inch Wuxga Oled Touch (100% Dci-p3) | AMD Ryzen AI 5 340 (Up to 50 Tops) | 16gb Ddr5 1TB SSD | for Creator",
    "url": "https://www.google.com/shopping/product/14145348008510860685?gl=us&hl=en",
    "productId": "14145348008510860685",
    "clusterId": "16924392382734695053",
    "offerId": "12978534686114576382",
    "price": 1139.99,
    "currency": "$",
    "originalPrice": "N/A",
    "discountPercent": 0,
    "isOnSale": "No",
    "merchant": "Walmart - Happy Ranger",
    "hasMultipleMerchants": "No",
    "rating": "Not Disclosed",
    "reviewCount": "Not Disclosed",
    "delivery": "Free delivery",
    "returnPolicy": "Not Disclosed",
    "query": "laptop",
    "country": "us",
    "scrapedAt": "2026-09-08T04:54:00.650Z",
    "error": null
  },
  {
    "imageUrl": "Not Disclosed",
    "title": "HP OmniBook X Flip 2-in-1 14\" 2K OLED Touchscreen Laptop",
    "url": "https://www.google.com/shopping/product/2187320107212753054?gl=us&hl=en",
    "productId": "2187320107212753054",
    "clusterId": "16793559515556330662",
    "offerId": "17355904709601380764",
    "price": 1649.99,
    "currency": "$",
    "originalPrice": "N/A",
    "discountPercent": 0,
    "isOnSale": "No",
    "merchant": "Best Buy",
    "hasMultipleMerchants": "Yes",
    "rating": 4.7,
    "reviewCount": 384,
    "delivery": "Free delivery by Wed",
    "returnPolicy": "15-day returns",
    "query": "laptop",
    "country": "us",
    "scrapedAt": "2026-09-08T04:54:00.651Z",
    "error": null
  }
]

โœจ Why choose this Actor

What you get
It gets through Google answers residential and datacenter exits with a 429 captcha, browser included. This Actor uses Apify's Google SERP proxy group, the route built for Google search pages, and it is the default.
The server-rendered surface The newer udm=28 shopping tab is a client-rendered shell with zero prices in the HTML. This Actor reads tbm=shop, which ships every price server side: 68 cards in one response against none from the new tab.
Parsed off stable hooks Cards are found by data-pid and read from the aria-label text Google maintains for screen readers. The CSS class names are per-deploy hashes and are never used.
Server-side filters Price range, condition and sort order are handed to Google, so you are not paying for rows you then throw away.
Explicit market country and language are set on every request. Without them Google prices in whatever market the exit node sits in.
Honest blanks N/A and Not Disclosed instead of empty cells, so filters in Excel behave.
You pay for what you keep Rows are billed as they are written and capped at Max Items; error rows are never billed.

๐Ÿ“ˆ How it compares to alternatives

Most Google Shopping scrapers on the Store render the page in a browser at 2 to 4 GB per run or rely on a third-party SERP API. This Actor reads the server-rendered page at 1 GB and states its ceilings up front.

Feature This Actor Browser-based scrapers Third-party SERP APIs
Memory per run 1 GB 2 to 4 GB Not applicable
Original price, discount percent, on-sale flag Yes Varies Varies
Delivery line and return window Yes Rare Rare
Google product, cluster and offer IDs Yes Rare Varies
Server-side price, condition and sort filters Yes Varies Varies
Merchant destination URL No, Google builds it in the browser Sometimes Sometimes
Thumbnail URL About 4 cards in 10 Varies Varies
Depth per query About 400 offers, Google's own ceiling Same ceiling Same ceiling
Extra API key No No Yes

๐Ÿš€ How to use

  1. Create a free Apify account with $5 in credit.
  2. Open the Google Shopping Prices Scraper.
  3. Type your search queries, pick the country, set Max Items and any price, condition or sort filter, then click Start.
  4. Download the dataset as CSV, Excel, JSON or XML from the Storage tab, or read it through the API.

A first run:

{
  "queries": ["laptop"],
  "maxItems": 10,
  "country": "us",
  "language": "en",
  "sortBy": "price-low",
  "minPrice": 300,
  "maxPrice": 900
}

Free-plan runs return up to 10 offers as a preview. Upgrade your Apify plan to collect up to 1,000,000 offers per run.

๐Ÿ’ผ Business use cases

๐Ÿ“‰ Price history without a data vendor. A price intelligence team schedules the same 50 queries daily, keeps productId, merchant and price, and diffs the runs. The product ID is stable, so the diff is the price history.

๐Ÿ”Ž MAP and undercutting alerts. A brand searches its own product names, sorts by price low to high and reads the merchant column. Any row under the minimum advertised price is a violation with the seller's name attached.

๐ŸŒ Cross-market comparison. Run the same query with country set to us, gb and de. Google prices in the local currency and the currency symbol is on every row.

๐Ÿ”ฅ Deal discovery. A coupon site runs a category query with onlyOnSale on, then ranks rows by discountPercent to publish the day's deepest cuts with the original price beside them.

๐Ÿ”Œ Automating Google Shopping Prices Scraper

  • Make and Zapier: run the Actor on a schedule and append new rows to Google Sheets or Airtable.
  • Slack: post a message when a run returns a row whose price drops under a threshold or whose merchant is not on your approved list.
  • Airbyte: sync the dataset into BigQuery, Snowflake or Postgres for price dashboards.
  • GitHub Actions: refresh a public price index on every deployment of your app.
  • Google Drive: save each run as CSV or Excel for a shared folder.

Every integration starts from the Apify API or the ApifyClient for JavaScript and Python.

๐ŸŒŸ Beyond business use cases

  • Research: collect discount depth across categories for a study on promotional prices.
  • Personal: watch one product across merchants and buy on the day it drops.
  • Non-profit: compare the price of essential goods across markets for a consumer report.
  • Experimentation: feed titles and prices to an LLM to prototype a product-matching model.

๐Ÿค– Ask an AI assistant about this scraper

Give an AI agent live access to Google Shopping offers through the Model Context Protocol:

claude mcp add --transport http apify "https://mcp.apify.com?tools=parseforge/google-shopping-prices-scraper"

Then ask in plain language, for example "What does a Milwaukee M18 drill cost across merchants right now?" or "Find discounted laptops under $900 with a rating above 4.5".

โ“ Frequently Asked Questions

๐Ÿ›ก๏ธ Why must I use the Google SERP proxy?

Because nothing else works. A stealth browser on an Apify residential exit got HTTP 429 with a captcha on the shopping tab, and plain HTTP over datacenter and residential got the same. Apify's Google SERP group returns 200 with a full page. It is the default and there is no reason to change it.

๐Ÿ”— Does it return the merchant's product URL?

No. Google routes its card links through a click tracker built in the browser, so there is no destination URL in the server-rendered HTML. You get the merchant name, Google's product, cluster and offer IDs, and a Google Shopping product page URL instead.

๐Ÿ–ผ๏ธ Why is imageUrl often Not Disclosed?

Google links about 4 thumbnails in 10 through its image cache and inlines the rest into the page as 20 to 30 KB of image bytes. Only the linked ones are reported; a 30 KB blob per row is not something you want in a CSV.

๐Ÿ†” Is the product ID stable between runs?

Yes, which is what makes price tracking possible: keep productId and price from each run and diff them.

๐ŸŒ Which countries and languages work?

39 markets and 21 interface languages are listed in the input. Set country and language together; English labels are what the parser reads best, so keep language at en unless you need local titles.

๐Ÿ’ฑ Why are my prices in the wrong currency?

Set country. Without it Google prices in the market the exit node sits in.

๐Ÿท๏ธ Why is originalPrice N/A on most rows?

Because most offers are not discounted. Google only prints a struck-through price when there is one, and roughly one row in two carries it in a typical search. onlyOnSale keeps just those.

๐Ÿฌ Why is merchant sometimes a phrase like "Also nearby"?

Google reuses the card layout for local inventory results, where that slot holds a proximity note rather than a seller. Those rows still carry a valid price and product ID.

๐Ÿ“ฆ How many offers can I collect?

Free users get 10 offers as a preview. Paid Apify users can set Max Items up to 1,000,000 per run across as many queries as they supply. Google stops serving new results past about 400 offers per query, so add queries to go wider rather than deeper.

๐Ÿ” Why fewer offers than Max Items?

Either Google ran out of results for the query, or the on-sale and merchant filters removed cards after they were read. The run log shows how many cards each page had and how many were kept.

๐Ÿงพ What do N/A and Not Disclosed mean?

N/A means the field does not apply to that row (no original price on an offer that is not discounted). Not Disclosed means Google's card has the slot but this offer left it empty (no rating, no delivery line).

โŒ What happens if Google does not answer?

The Actor retries each page up to 5 times with a growing pause. If a page still fails, one row containing only an error field is written, which is never charged, and the run status message says so.

โฐ Can I run this on a schedule?

Yes. Create an Apify schedule to run the Actor hourly, daily or weekly and connect the dataset to your pipeline.

๐Ÿ“„ What output formats are supported?

CSV, JSON, Excel and XML from the Apify Console or API.

๐Ÿ”Œ Integrate with any app

The dataset is available through the Apify API the moment the run finishes. Use the run-sync-get-dataset-items endpoint for one-shot calls, webhooks to trigger downstream jobs, or the Make, Zapier, Airbyte and LangChain integrations listed on the Actor page.

๐Ÿ”— Recommended Actors


๐Ÿ’ก Pro Tip: browse the complete ParseForge collection.

๐Ÿ†˜ Need Help? Open our contact form with your run ID, your input and what you expected.

โš ๏ธ Disclaimer: This Actor is an independent tool and is not affiliated with, endorsed by, or sponsored by Google. It collects only publicly available search results. You are responsible for using the data in compliance with Google's terms of service and applicable laws.

What input does the Google Shopping Scraper - Product Prices & Offers accept?

FieldTypeWhat it doesDefault
queries array What to search for on Google Shopping, one query per line. Each query is paginated independently, so three queries can return up to three times the offers. ["laptop"]
maxItems integer Free users: Limited to 10 items (preview). Paid users: Optional, max 1,000,000 10
country string (39 options) Two-letter market code. Sets the currency and the merchants Google shows. Without it Google prices in whatever market the exit node sits in. us
language string (21 options) Interface language for the result page. English keeps the price, delivery and review labels in the form the parser reads best. en
minPrice integer Ask Google for offers at or above this price, in the country's currency. not set
maxPrice integer Ask Google for offers at or below this price, in the country's currency. not set
condition string (3 options) Restrict to new or used items. any
sortBy string (4 options) How Google should order the offers before they are read. relevance
onlyOnSale boolean Keep only offers where Google shows a struck-through original price. false
merchantContains string Keep only offers whose merchant name contains this text, for example Walmart or Best Buy. not set
proxyConfiguration object Keep the Google SERP group. Every other route measured (datacenter, residential, a stealth browser on residential) returns HTTP 429 with a captcha. {"useApifyProxy":true,"apifyProxyGroups"

How much does the Google Shopping Scraper - Product Prices & Offers cost?

from $0.20 per 1,000 results

Charged forWhat it isPrice each
Actor Start Charged when the Actor starts running. Number of events charged depends on Actor memory (one event per GB, minimum one event). $0.0002 to $0.002
Product offer One Google Shopping offer: title, current price and currency, original price, discount percent, merchant, star rating, review count, delivery terms, return window and Google's product, cluster and offer IDs. $0.00126 to $0.003

Tiered: the lower figure is the price on a higher Apify plan. Billing and the free credit live on Apify.

How do I call the Google Shopping Scraper - Product Prices & Offers API?

One POST returns the dataset directly. Same shape for every scraper in the library, so swapping the slug is the only change.

POST ยท run and get results
curl -X POST "https://api.apify.com/v2/acts/parseforge~google-shopping-prices-scraper/run-sync-get-dataset-items?token=$APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "queries": [
      "laptop"
    ],
    "maxItems": 10,
    "country": "us",
    "language": "en",
    "condition": "any"
  }'

What example inputs can I use?

Use these inputs to see how a run is configured.

input.json
{
  "queries": [
    "laptop"
  ],
  "maxItems": 10,
  "country": "us",
  "language": "en",
  "condition": "any"
}

What do users say about the Google Shopping Scraper - Product Prices & Offers?

No reviews yet. Be the first.

How do I report an issue with the Google Shopping Scraper - Product Prices & Offers?

We build and maintain this scraper, so a problem with it comes to us. Report it on the Apify listing and the thread stays attached to the scraper where the next person can find it: open an issue.

Broken and urgent, or you would rather not post in public? Write to parseforge@protonmail.com and it reaches the people who wrote it.

What related scrapers can I use?

Run Google Shopping Scraper - Product Prices & Offers on Apify All scrapers