To scrape Google Shopping, send a product search or a Shopping results URL to a scraper that reads Google's public Shopping results and saves each product with its title, price, seller, rating, review count and position. On Scrape.ly that is one ready-made Actor: you type "wireless mouse", pick a country, and get rows back in a few seconds at $4.17 per 1,000 products, with no Google account, Merchant Center or proxy of your own.
This guide covers the fields you get, the no-code steps, the same job in curl, Python, Node.js and through an AI agent, then a real run from 26 October 2026 with its log and exact cost. It closes with the pitfalls and the legal picture. More Google how-tos: Google Flights and Google Scholar.
What data you can scrape from Google Shopping
The Google Shopping Scraper saves one row per product card. These are the fields you'll use most:
| Field | What it holds |
|---|---|
productName | Product title as Google shows it |
price | Price text with the currency symbol, such as $12.99 |
merchantName | The store on the card: Target, Walmart, Best Buy … |
reviewsScore, reviewsCount | Average rating out of 5 and number of reviews, when shown |
positionOnSearchPage | Rank in the results for that search, starting at 1 |
searchKeyword | The query the row came from |
shoppingId | Google Shopping catalog ID, stable across runs |
productLink, productImage | Link to the product on Google Shopping and the image URL |
sponsored | True for sponsored listings, when you ask for them |
withoutDiscountPrice | The crossed-out previous price, in browser mode |
productDetails, merchantLink | Longer description and the first store offer, when requested |
offerTitle, deliveryInfo, returnInfo | The store's own title, delivery and returns text, on comparison-price rows |
Rating, review count and image are left out of a row when Google doesn't show them for that product. The shoppingId is the field to key on if you track the same products over time, because titles can change between runs.
How to scrape Google Shopping without code
- Open the Actor's page in the Scrape.ly Store.
- Pick the preset Wireless mice in the US, 10 products. "Try this input" loads it in the console. This is the exact input of our run:
{
"queries": ["wireless mouse"],
"maxItems": 10,
"countryCode": "us",
"maxItemsPerQuery": 5,
"includeSponsoredResults": false,
"includeComparisonPrices": false,
"includeExtraProductDetails": false
}- Change the query and country to yours, and click Start.
- Open the Products view and export JSON, CSV, Excel or HTML.
The fields that matter most:
queries: product searches, one per line. Each one is searched once, so duplicates cost nothing extra.startUrls: Shopping results URLs copied from your browser, used whenqueriesis empty. A normal website URL stops the run with a clear message.countryCodeandlocation: the country sets the Google Shopping site and the proxy exit;locationnarrows it to a city such as "Austin, Texas, United States".maxItemsandmaxItemsPerQuery: the cap for the whole run and for each search. The preset caps each search at 5, which is why our run saved 5 products, not 10.includeComparisonPrices,includeSponsoredResults,includeExtraProductDetails: optional extras that switch the run to browser mode (see the pitfalls below).
Want the same search from Germany? The Wireless mice in Germany preset changes only countryCode, so you can compare markets row by row.
Scrape Google Shopping with the API
Create an API token under Settings → API & Integrations in the dashboard and export it as SCRAPELY_TOKEN. Our run finished in 8 seconds, so the synchronous endpoint can start it and return the products in one call:
curl -X POST "https://api.scrape.ly/v2/actors/shelfbright~google-shopping-scraper/run-sync-get-dataset-items" \
-H "Authorization: Bearer $SCRAPELY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"queries": ["wireless mouse"], "maxItems": 10, "countryCode": "us", "maxItemsPerQuery": 5}'The call waits up to 45 seconds and returns a JSON array; add ?format=csv for CSV. Runs with comparison prices or many searches can take longer, and then the call answers 408 while the run keeps going. For those, start the run with POST /v2/actors/shelfbright~google-shopping-scraper/runs, poll /v2/actor-runs/RUN_ID?waitForFinish=60 until the status is SUCCEEDED, and read /v2/actor-runs/RUN_ID/dataset/items. The Actors API docs show the full flow.
Python (pip install scrapely-client-python). call() waits for the run however long it takes. This script turns the price text into a number and prints the cheapest offer per store:
import os
from scrapely_client import ScrapelyClient
client = ScrapelyClient(os.environ["SCRAPELY_TOKEN"], api_url="https://api.scrape.ly")
run = client.actor("shelfbright/google-shopping-scraper").call(
run_input={"queries": ["wireless mouse"], "maxItems": 10, "countryCode": "us", "maxItemsPerQuery": 5}
)
print(run.status) # SUCCEEDED, FAILED, ABORTED or TIMED-OUT
cheapest = {}
for item in client.dataset(run.default_dataset_id).iterate_items():
price = float(item["price"].lstrip("$").replace(",", ""))
store = item["merchantName"]
if store not in cheapest or price < cheapest[store][0]:
cheapest[store] = (price, item["productName"])
for store, (price, name) in sorted(cheapest.items(), key=lambda kv: kv[1][0]):
print(f"{store:10} ${price:6.2f} {name}")Node.js (npm install scrapely-client):
import { ScrapelyClient } from 'scrapely-client';
const client = new ScrapelyClient({ token: process.env.SCRAPELY_TOKEN, baseUrl: 'https://api.scrape.ly' });
const run = await client.actor('shelfbright/google-shopping-scraper').call({
queries: ['wireless mouse'],
maxItems: 10,
countryCode: 'us',
maxItemsPerQuery: 5,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items.map((i) => [i.positionOnSearchPage, i.price, i.merchantName, i.productName]));The Python client docs cover paging through large datasets; the JavaScript client works the same way. If you'd rather think of this as an endpoint than an Actor, the Google Shopping API page describes the same data as an API product.
With an AI agent (MCP)
Scrape.ly runs a hosted MCP server at https://mcp.scrape.ly. In Cursor, add it to ~/.cursor/mcp.json:
{
"mcpServers": {
"scrapely": {
"url": "https://mcp.scrape.ly",
"headers": { "Authorization": "Bearer YOUR_TOKEN" }
}
}
}In Claude Code, run claude mcp add --transport http scrapely https://mcp.scrape.ly and sign in with /mcp. To give the agent only this Actor, use https://mcp.scrape.ly?actors=shelfbright/google-shopping-scraper. Then ask: "Use scrapely to run shelfbright/google-shopping-scraper for 'wireless mouse' in the US, 5 products, and give me a table of price, store, rating and review count." The agent calls call-actor, then get-actor-output. Our run in this article was started exactly that way. The MCP docs list the other clients.
A real run: wireless mice in the US
We ran the preset on 26 October 2026. It saved 5 products in 8 seconds, and its list price was $0.0209. All five came from Google's US Shopping results for "wireless mouse":
| # | Product | Price | Store | Rating | Reviews |
|---|---|---|---|---|---|
| 1 | Logitech M196 Bluetooth Wireless Mouse | $12.99 | Target | 4.8 | 5,200 |
| 2 | Logitech M220 Silent Wireless Mouse | $13.83 | Walmart | 4.7 | 41,000 |
| 3 | LOGITECH SIGNATURE M650 WIRELESS MOUSE | $33.99 | Best Buy | 4.8 | 21,000 |
| 4 | Logitech G305 Lightspeed Wireless Gaming Mouse | $29.49 | Target | 4.6 | 6,400 |
| 5 | Logitech Silent Wireless Mouse | $13.83 | Walmart | 4.1 | 269 |
The sellers here are retailers, so nothing needed masking. The log, without the platform's start-up lines:
2026-10-26T14:25:25.173Z [Scrapely] Container started (setup 5.8 s)
2026-10-26T14:25:26.542Z [scrapely.actor] INFO [Scrapely] Initializing API storage for run b8cb3e0732dd4932b
2026-10-26T14:25:26.668Z [scrapely.actor] INFO Using fast mode. A search switches to browser mode only if fast mode fails.
2026-10-26T14:25:27.078Z [scrapely.actor] INFO Saved 5 products: 5 in fast mode (1 result pages), 0 in browser mode; 0 searches switched to browser mode. Search API calls: 1 (1 sent at start-up, 0 resent, slowest 1304 ms).
2026-10-26T14:25:27.078Z [scrapely.actor] INFO [Status message]: Saved 5 products from 1 searches.
2026-10-26T14:25:27.609Z [Scrapely] Container state: status=exited exitCode=0 oomKilled=falseWhat the five rows show:
- One brand owns the top of the page. Every product was a Logitech mouse, from a $12.99 Bluetooth model to the $33.99 Signature M650. If you research a category, run several queries, or you'll only see who wins the generic term.
- Three stores split the page. Target had two of the five cards, Walmart two and Best Buy one. Both Walmart cards showed $13.83, so a price tracker that keys on the store alone would mix two different mice.
- Reviews tell you about demand. The M220 carried 41,000 reviews against 269 for the plain "Silent Wireless Mouse" at the same price. Review counts above a thousand come rounded, the way Google shows them.
- Fast mode did the work. One search call, zero browser sessions and zero retries. Most of the 8 seconds was the container starting.
What it costs
The Actor has two charge events: $0.00417 per product saved ($4.17 per 1,000) and $0.00005 per run for the Actor start. Platform usage (compute, proxy, browser) is included in those prices. A search that matches nothing saves no rows and pays no product fee. Prices checked on 26 October 2026.
- Our run: 5 × $0.00417 + $0.00005 = $0.0209 at list price. The account was billed $0.0167, because its plan has a 20% Store discount.
- A daily price check: 20 queries × 25 products = 500 products, so 500 × $0.00417 + $0.00005 = $2.09 per run, about $63 for a month of daily runs.
- 1,000 products: about $4.17, start fee included.
The Free plan's $5 of monthly credit covers close to 1,200 products. Set a maximum charge per run and the run stops when it reaches it, so a typo in maxItems can't turn into a large bill. See pricing for plans.
What to watch out for
- Prices are text.
pricekeeps the currency symbol ($12.99,12,99 €). Strip it before you sort or average, as the Python example does, and keepcountryCodein your rows if you compare markets. - About 250 to 300 products per search. That's how many Google lists for a broad query. For a full category, split it into several narrower queries; the per-query and per-run limits keep the run predictable.
- Extras are slower. Sponsored listings, comparison prices and longer descriptions need browser mode: 30 to 60 seconds for 10 products, at most about 100 products per search, and sometimes rate-limited by Google outside the US. If Google blocks its Shopping page for a run, the Actor still saves the regular products and says so in the status message.
- Location works in fast mode only. City-level results apply to normal searches, not to browser-mode extras.
- Results move. Prices, sellers and ranking change through the day and by location. Save the run date with each row and schedule the same search to build a history keyed on
shoppingId. - Layouts change; fields don't. DIY guides break when Google renames classes: MrScraper's guide (18 August 2026) parses
div.sh-dgr__contentcards with Playwright. With the Actor you readpriceandmerchantName, and the publisher keeps the parser current.
Is it legal to scrape Google Shopping?
The Actor reads the same public Shopping results any logged-out visitor sees, without signing in or buying anything, and the rows hold product and business facts: titles, prices, stores and ratings. Google's rules on automated access are specific, though. Its Terms of Service (effective July 30, 2026) list "using automated means to access content from any of our services in violation of the machine-readable instructions on our web pages (for example, robots.txt files that disallow crawling, training, or other activities)" as abuse, and Google's robots.txt disallows /search for all crawlers. Shopping results live under /search (the product links in our run carry udm=28), so read both before you build a product on this data.
Shopping data rarely includes personal data. Product images and titles belong to the stores and brands, so use the data for analysis and price monitoring rather than republishing Google's pages. Our guide on whether web scraping is legal covers the general rules. This is general information, not legal advice: for commercial use, get advice for your case.
Why Scrape.ly for Google Shopping data
- No official route exists for this data. Google's Content API for Shopping, which manages a merchant's own product feed, was sunset on August 18, 2026 in favor of the Merchant API, and neither searches other sellers' listings. The Actor reads the public results for any query and country.
- Fast mode instead of a browser fleet. Hand-built scrapers run headless Chromium, match proxy country to locale and wait for JavaScript. Our run used one search call and no browser at all.
- Cost you can predict to the cent. $4.17 per 1,000 products, platform usage included, plus a hard cap per run.
- Built for monitoring. Schedule the same queries daily, send rows to Google Sheets or a webhook, and compare them with Amazon, Walmart or AliExpress prices, as in our price scraping and e-commerce scraping guides.
FAQ
Does Google Shopping have an API?
Not for search results. Google's Merchant API serves merchants managing their own Merchant Center products, and the older Content API for Shopping was sunset on August 18, 2026. To read public Shopping results for any query, use a scraper such as the Google Shopping Scraper, which you can call over REST like any API.
Can you scrape Google Shopping with Python?
Yes. Install scrapely-client-python, call shelfbright/google-shopping-scraper with your queries and iterate over the dataset, as in the example above. The scraping runs in the cloud, so your script needs no browser, parser or proxy.
How do I scrape other sellers' prices for one product?
Turn on includeComparisonPrices, or start from the Wireless mouse prices by store preset. The Actor opens each product and saves one row per store with its price, delivery and returns text. It runs in browser mode, so expect 30 to 60 seconds for 10 products.
Can I scrape Google Shopping for other countries?
Yes. Set countryCode (for example de, gb or in) and, optionally, a city in location. Pasted Shopping URLs keep the country already in the URL. Review counts outside English-speaking countries can come rounded, as Google shows them.
How many products can I get from one search?
As many as Google lists, which is about 250 to 300 for a broad search. Use several related queries for more, and set maxItemsPerQuery so one broad term doesn't use up the whole run.
How much does it cost to scrape Google Shopping?
$0.00417 per product plus $0.00005 per run, platform usage included, so about $4.17 per 1,000 products. Our 5-product run cost $0.0209 at list price.




