Google Shopping Scraper: prices per merchant, bulk queries
Pricing
from $2.76 / 1,000 product listeds
Google Shopping Scraper: prices per merchant, bulk queries
Product listings from Google Shopping per search query, so you can compare prices across merchants: title, current price, previous price, discount, merchant, delivery, returns, rating and review count, with the product id and URL. Up to 200 queries per run. Only delivered products are charged.
Pricing
from $2.76 / 1,000 product listeds
Rating
0.0
(0)
Developer
Steadydata Team
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
2
Monthly active users
2 days ago
Last modified
Categories
Share
Google Shopping Scraper (reliable, bulk)
Product listings from Google Shopping for up to 200 search queries per run: title, current price, previous price, discount, merchant, delivery, returns, rating and review count, with the product id and a link to the Google Shopping product page. You only pay for products that are actually delivered.
Why this scraper
- No browser, no bot wall. Google's shopping results are fetched as server-rendered HTML through a country-matched search proxy. Browser-based scrapers get sent to a CAPTCHA; this route does not, and it is a fraction of the cost.
- Parsed on the accessibility label, not on CSS classes. Google renames its classes constantly, which is why class-based scrapers break every few weeks. Every product card carries a screen-reader label with the full description, price, merchant and rating in one sentence. That is what this actor reads, and it is far more stable.
- Only delivered products are charged. A query without results, or a temporary block, comes back as a clear error record at no cost.
- A hard cost ceiling you control.
maxProductsPerQueryis the cap: one delivered product is one charged event. - Region aware.
countrysets both the proxy exit country and the Google region, so Dutch prices come from a Dutch exit node instead of a US one.
Who this is for
Price monitoring across a product list, competitor and assortment research, and anyone who needs "what does Google Shopping show for these 200 searches" as a table instead of 200 browser tabs.
Who this is not for
If you need the stock level or the exact checkout price at one specific shop, go to that shop's own page. This actor reports what Google Shopping shows, which is a snapshot of the offers Google knows about at that moment.
It returns public product and merchant data only. No buyer data, no reviewer names, no personal data.
Input fields
| Field | Type | Required or default | What it does |
|---|---|---|---|
queries | list of text | required | Product searches, e.g. 'wireless earbuds' or 'dyson v15'. Up to 200 per run. |
maxProductsPerQuery | number | 60 | Stop after this many products per query. This is your cost ceiling: one delivered product is one charged event. |
country | text | US | ISO country code, e.g. US, NL, DE. Sets both the proxy exit country and the Google region. Prices and merchants are region bound, so match this to the market you want. |
language | text | en | Interface language, e.g. en, nl, de. |
Input example
{"queries": ["wireless earbuds","dyson v15 detect","espresso machine"],"maxProductsPerQuery": 60,"country": "US","language": "en"}
Output example
| Field | Type | What it holds | Example |
|---|---|---|---|
query | text | The input this row was found with, so rows from several inputs can be told apart. | wireless earbuds |
country | text | The country the request was made from; Google answers differently per country. | US |
position | number | The place in Google's own order, counting from 1. | 1 |
productId | text | Google's id for the product listing, the key to join rows on. | 14736686963622067380 |
productUrl | text | The product page Google links to. | https://www.google.com/shopping/product/14736686963622067380 |
title | text | The title as Google shows it. | JLab Go Air Pop True Wireless Earbuds |
price | number | The price as a number, so you can sort and compare on it. | 19.88 |
priceText | text | The price exactly as the page prints it, symbol and separators included. | $19.88 |
currency | text | The currency that price is in. | USD |
previousPrice | number | The price this was struck through from; empty when nothing is struck through. | 25 |
discountPercent | number | How far the price is below that previous price, in percent. | 20 |
merchant | text | The shop offering the product. | Walmart |
delivery | text | What the listing says about delivery, for example free delivery or a price. | delivery $7 |
returns | text | What the listing says about returns, for example a free return window. | 90-day returns |
rating | number | The average star rating of the product. | 4.4 |
reviewCount | number | How many reviews that average rests on. | 6900 |
{"query": "wireless earbuds","country": "US","position": 1,"productId": "7310953537322941042","productUrl": "https://www.google.com/shopping/product/7310953537322941042","title": "JLab GO Air Pop True Wireless Earbuds","price": 19.99,"priceText": "$19.99","currency": "USD","previousPrice": 25.0,"discountPercent": 20,"merchant": "Target","delivery": "Free delivery on $35+","returns": "30-day returns","rating": 4.3,"reviewCount": 31000,"status": "ok"}
A query that cannot be delivered produces an error record instead, and is not charged:
{"input": "asdkjhasdkjh","status": "error","errorCode": "NO_RESULTS","error": "No products on the results page for 'asdkjhasdkjh'"}
Error codes: INVALID_QUERY, NO_RESULTS, BLOCKED. INPUT_TRUNCATED appears once when your input is longer than this actor accepts.
Related actors from steadydata
- shopify-store-report: the catalogue and prices of a Shopify store itself
- woocommerce-store-report: the same for WooCommerce stores
- google-images: product images for the same query
Pricing
Pay per event: one product-listed event per delivered product. No charge for queries
that fail or return nothing, no separate platform-usage surcharge.
Free Apify plan: this actor delivers up to 25 rows per run for accounts on the Apify free plan, and then stops with a message. That limit is set by us, not by Apify. It exists so the actor keeps paying for itself for the people who do pay. Any paid Apify plan runs it at full size, billed per delivered row, with failed rows never charged.
Reviews: if this actor saves you time, a short review on this page is the one thing that helps most. Ratings are what other buyers look at first, and we have no other way to ask.
FAQ
Why do some fields come back empty? Because Google did not show them for that product. A listing without a discount has no previous price, and a listing without reviews has no rating. Those fields are left empty rather than filled with a guess.
Do prices include tax and shipping?
They are the prices Google displays, which follow the merchant's own convention per
country. Delivery information is returned separately in the delivery field when Google
shows it.
Why does the same product appear more than once? Because several merchants offer it. Each row is one offer, with its own merchant and price, which is exactly what you want for price comparison.
Can I track prices over time? Yes, and that is the common pattern: run the same query list on a schedule and keep the rows with a timestamp. Prices move, so a run is a snapshot.
Is personal data collected? No. Public product and merchant data only.
What happens when Google changes something? Google changes its markup constantly; that is the nature of this work. Reading the accessibility label instead of the CSS classes makes this actor far less sensitive to those changes, and it is monitored daily and fixed fast. While it is broken you are not charged, because only delivered products cost anything.
Can I call it from my own code, like an API? Yes. Every run is available through the Apify API: start it with one HTTP request, then read the results as JSON, CSV or Excel from the dataset endpoint, or use the official Python and JavaScript clients. The input is the same JSON as in the input example above, so a scheduled script, a Make or Zapier step or an AI agent can call it without any changes.