Google Shopping Scraper
Under maintenancePricing
$1.50 / 1,000 products
Google Shopping Scraper
Under maintenanceScrape Google Shopping product results for any search query or pasted Google Shopping URL in any country and language. Get title, price, old price, discount, merchant, rating, review count and delivery info. No login, pay per result.
Pricing
$1.50 / 1,000 products
Rating
0.0
(0)
Developer
Heba Abdalaziz
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
a month ago
Last modified
Categories
Security
Limited permissionsShare
What does Google Shopping Scraper do?
Google Shopping Scraper collects the product results that Google Shopping shows for any search query, in any country and language. For every product card you get the title, current price (as a number plus its currency), old price and discount badge, the shop selling it, whether more shops sell it, delivery or returns notes, star rating, review count and Google's own product ids.
Enter keywords such as running shoes, or paste Google Shopping result URLs with filters already applied, and download the results as JSON, CSV, Excel or HTML, or use them through the Apify API.
Why use it?
- Price monitoring: track the prices and discounts for your products and your competitors' products.
- Market research: see which brands, shops and products Google Shopping ranks for a keyword in each country.
- Assortment and MAP checks: find who sells a product, at what price, and with which delivery terms.
- Any country, any language: prices are parsed per locale (
$1,299.00,1.299,00 €,₹2,499,¥30,999) into plain numbers with an ISO currency code. - Fast and light: no browser, just HTTP requests, so runs start quickly and stay cheap.
How to use it
- Click Try for free (or Start) on this page.
- In Search queries or Google Shopping URLs, enter one keyword or URL per line.
- Set Country and Language (for example
deanddefor Germany) and how many products you want per query. - Click Start and wait - a query with 100 products usually takes 15-40 seconds.
- Open the Output tab to preview the products and export them in the format you need.
Input
| Field | Type | Default | Description |
|---|---|---|---|
queries | array of strings | - (required) | Keywords, or Google Shopping URLs (google.*/search?...&udm=28 or tbm=shop). The q, gl, hl and filter parameters (tbs, shoprs, ...) of a URL are kept. |
country | string | us | Two-letter country code (Google gl). A gl inside a URL wins; a URL without gl uses the country of its Google domain (google.de = de). |
language | string | en | Interface language code (Google hl). An hl inside a URL wins. |
maxProductsPerQuery | integer | 100 | Unique products to collect per query (1-300). |
maxPagesPerQuery | integer | 10 | Result pages to request per query (1-10). About 3 pages give 100 products, 8-10 pages give 300. |
saveRawHtml | boolean | false | Debugging only: stores every fetched page in the key-value store. |
Example input:
{"queries": ["running shoes","https://www.google.com/search?q=kaffeemaschine&udm=28&gl=de&hl=de"],"country": "us","language": "en","maxProductsPerQuery": 100,"maxPagesPerQuery": 10}
Output
Each product is one row in the dataset. A real row from a cloud run:
{"position": 1,"page": 1,"query": "running shoes","country": "us","language": "en","productId": "4196561114474179181","offerId": "17147103039274595891","pid": "17366988515004433012","title": "Asics Gel-Kayano 14","price": 129.95,"currency": "USD","priceText": "$129.95","oldPrice": 150,"discountBadge": "13% OFF","merchant": "ASICS","moreMerchants": true,"delivery": "Free 90-day returns","rating": 4.8,"reviewCount": 2200,"searchUrl": "https://www.google.com/search?q=running+shoes&udm=28&gl=us&hl=en","input": "running shoes","scrapedAt": "2026-10-10T11:58:23+00:00"}
Inputs that could not be used or that failed (invalid URL, blocked after all retries), and queries that stopped early at a later page, are listed in the FAILED_INPUTS record of the run's key-value store as [{"input": ..., "reason": ...}]. Failed inputs cost nothing; a query that stopped early is charged only for the products it returned.
Data fields
| Field | Type | Description |
|---|---|---|
position | integer | Rank within the query (1 = first), across pages, duplicates removed |
page | integer | Result page the product was found on |
query | string | Search query |
country | string | Country code the search ran for (gl) |
language | string | Interface language (hl) |
productId | string or null | Google catalog product id (cid); null for single-shop offers Google has not grouped into a product |
offerId | string or null | Google offer id (oid) of the offer shown |
pid | string or null | Google product id (pid) of the card |
title | string | Product title |
price | number | Current price |
currency | string or null | ISO 4217 currency code |
priceText | string | Price as displayed, e.g. 59,99 €, or $19+ for a "from" price |
oldPrice | number or null | Previous / usual price when discounted |
discountBadge | string or null | Image badge such as 15% OFF, LOW PRICE, SALE |
merchant | string or null | Shop shown on the card (null when the card only says "& more") |
moreMerchants | boolean | true when more shops sell the product |
delivery | string or null | Delivery or returns note, e.g. Free delivery · 30-day returns |
rating | number or null | Average rating out of 5 |
reviewCount | integer or null | Number of reviews (Google rounds big numbers: 1.9K = 1900) |
searchUrl | string | Result page the row came from |
input | string | The query or URL from your input |
scrapedAt | string | ISO 8601 timestamp (UTC) |
How much does it cost?
The Actor uses pay-per-result pricing: you pay $1.50 per 1,000 products ($0.0015 per product) saved to the dataset. There is no start fee, and queries that return nothing or fail cost nothing. Proxy and compute costs are included.
| Products | Price |
|---|---|
| 100 | $0.15 |
| 1,000 | $1.50 |
| 10,000 | $15.00 |
You can cap the spend of a run with the Maximum cost per run setting; the Actor stops cleanly when it is reached.
Tips
- Filters: open Google Shopping in your browser, apply filters (price range, brand, on sale, free delivery, ...) and paste the resulting URL as a query - all filters are kept.
- Depth: Google Shopping shows up to about 8 pages (roughly 250-300 unique products) per query. Each page adds 25-40 new products.
- Local results: set
countryandlanguagetogether (e.g.fr/fr,in/en,jp/ja) to get local shops and prices in the local currency. - Many queries: put them all in one run; up to 3 queries are processed in parallel. Duplicate searches are skipped, so you never pay twice for the same query.
FAQ
Is it legal to scrape Google Shopping? The Actor only collects publicly visible product listings (titles, prices, shops, ratings). It does not log in and does not collect personal data. Still, you are responsible for how you use the data; check Google's terms and your local laws, and consult a lawyer if you are unsure.
Does it collect personal data? No. Product cards contain product and shop information only; review texts and reviewer names are not collected.
Why is productId sometimes null?
Google shows some single-shop offers that it has not grouped into a catalog product. Those rows still have offerId and pid, and duplicates are removed by those ids.
Why are there fewer products than I asked for? Google Shopping returns a limited number of products per query (about 300 at most). The Actor stops when a page brings no new products.
What happens with a misspelled or nonsense query? Google decides. If it replaces your query with a corrected one ("Showing results for ..."), the Actor returns those products and adds a note with the corrected query to the run's status message. For a nonsense query (random letters) Google usually still shows a generic feed of popular products: the Actor returns that feed as it is, and those rows are billed like any other, so check your queries before large runs. Only a query with no product cards at all returns nothing and costs nothing.
What if Google shows results for another country?
The proxy often answers from another location, especially for google.com. The Actor checks the price currencies (and, as a backup, shop domains) against the country you asked for and retries with a new IP, up to 6 times per page (within about 45 seconds). If a page still comes from another location, it is skipped and never billed: the query keeps the products already collected and is listed in FAILED_INPUTS with "stopped at page N: results kept coming from another location". Exception: for a country the Actor has no local Google domain or currency for (e.g. lu), once the same foreign currency keeps coming back for 2 different queries (or at the first failure when the Actor knows no currency for the country), the Actor accepts that location from then on and warns in the status message that prices may not be local.
Are the images included? No. Google embeds thumbnails inline as data, not as image links, so they are not part of the output.
Support
Found a bug or need another field? Open an issue in the Issues tab of this Actor and include the link to the run.