Google Shopping Scraper
Pricing
from $2.50 / 1,000 shopping products
Google Shopping Scraper
Scrape Google Shopping products and sponsored PLA ads by keyword — titles, prices, merchants, ratings, delivery, and direct retailer URLs. Multi-country, multi-query. Organic listings + ads in one run. Flat JSON/CSV for price monitoring, PPC research, and ecommerce intelligence.
Pricing
from $2.50 / 1,000 shopping products
Rating
5.0
(1)
Developer
Muhamed Didovic
Maintained by CommunityActor stats
0
Bookmarked
15
Total users
2
Monthly active users
11 days ago
Last modified
Categories
Share
Google Shopping Scraper — Products, Prices & Sponsored Ads
Extract live Google Shopping results by keyword: organic product cards and sponsored PLA ads, with prices, merchants, ratings, delivery signals, and direct retailer URLs when Google exposes them.
Built for price monitoring, competitive research, and ecommerce intelligence — multi-query, multi-country, JSON or CSV out.
Why Use This Scraper?
- Organic + sponsored in one run — most Shopping scrapers skip PLAs; this one returns both
- Direct retailer URLs on sponsored ads — and, when a PLA matches an organic card, that URL is copied onto the organic row
- Sale / condition / typical price —
onSale,discountPercent,condition,typicalPrice,offerCountwhen the card shows them - Filters Google actually honors — price, sort, condition, on-sale, free shipping, free returns, store names
- Pagination, city location, desktop/mobile —
startpages,uulelocation, device UA - EAN / UPC / GTIN → seller cards — each code is searched; every merchant card is an
offerrow - Empty searches succeed — a real zero-result Shopping page is not reported as a failed run
Overview
This Actor scrapes Google Shopping search results (udm=28) for one or more buyer keywords. Each dataset item is a single product card — either an organic Shopping listing or a sponsored Product Listing Ad (PLA).
It does not scrape Google Ads Transparency Center, Merchant Center, CPC/spend, or organic web Search results.
Supported Inputs
| Input | Supported |
|---|---|
Keyword / product search (queries) | ✅ |
EAN-8 / UPC-A / EAN-13 / GTIN-14 (productCodes) | ✅ (offer-mode search of the code) |
Country market (countryCode) | ✅ |
Language (languageCode) | ✅ |
City / postal location (location → uule) | ✅ |
Device (desktop / mobile / both) | ✅ |
Pagination (startPage, maxPages) | ✅ |
| Price range, sort, condition, on-sale, free ship/returns | ✅ |
Store name filter (stores) | ✅ |
| Sponsored / organic toggles | ✅ |
| Google Shopping product detail URLs | ❌ (search mode only; /shopping/product/{id} is not available) |
| SKU / MPN lookup | ❌ (barcode-style codes only) |
Example keywords: wireless headphones, office chair, nike running shoes.
Use Cases
| Audience | What you get |
|---|---|
| Ecommerce sellers | Competitor prices, merchants, discount signals |
| PPC / PLA teams | Sponsored ad creative, ranks, retailer destinations |
| Market researchers | Category assortments across countries |
| Price-monitoring tools | Repeatable keyword → product rows |
| AI agents / MCP | Flat JSON for RAG, alerts, and enrichment |
How It Works

- Submit keywords and/or EAN/UPC/GTIN codes, plus market, language, and optional location / device.
- The Actor builds Google Shopping URLs (
udm=28) with sort, price, condition, sale, shipping, and store filters. - Each search walks
maxPages(page N usesstart=(N-1)*10). Pages are fetched with anti-block defenses. - Organic cards and sponsored PLA units are parsed into flat rows. Matching PLA retailer URLs are copied onto organic rows when
resolveRetailerUrlsis on. - A genuine zero-result Shopping page is treated as a successful empty answer, not a failed run. Charge is per saved product.
Input Configuration
| Field | Type | Default | Description |
|---|---|---|---|
queries | string[] | — | Product / category keywords (and/or productCodes) |
productCodes | string[] | — | EAN-8 / UPC / EAN-13 / GTIN-14 codes → type=offer rows |
maxProductsPerQuery | integer | 40 | Cap per keyword or code (across pages + devices) |
maxTotalProducts | integer | — | Optional run-wide cap |
startPage | integer | 1 | First results page |
maxPages | integer | 1 | Pages per search (start=(page-1)*10) |
countryCode | string | US | ISO market (US, GB, DE, …) |
languageCode | string | en | UI language |
location | string | — | City or ZIP → Google uule |
device | enum | desktop | desktop / mobile / both |
includeSponsored | boolean | true | Collect PLA ads |
includeOrganic | boolean | true | Collect organic cards |
resolveRetailerUrls | boolean | true | Copy matching PLA retailerUrl onto organic rows |
sortBy | enum | relevance | relevance / price_low / price_high / rating |
minPrice / maxPrice | number | — | Price filters |
productCondition | enum | any | any / new / used / refurbished |
onSaleOnly | boolean | false | Sale-priced items only |
freeShipping | boolean | false | Free-shipping filter |
freeReturns | boolean | false | Free-returns filter |
stores | string[] | — | Merchant names to keep (also appended to the query) |
maxConcurrency | integer | 3 | Parallel keywords |
maxRequestRetries | integer | 3 | Retries per keyword |
saveHtml | boolean | false | Debug: store raw HTML |
proxy | object | — | Optional Apify/custom proxy |
Example — US headphones, 10 products
{"queries": ["wireless headphones"],"maxProductsPerQuery": 10,"countryCode": "US","languageCode": "en","includeSponsored": true,"includeOrganic": true}
Example — price band + sort
{"queries": ["office chair"],"countryCode": "US","languageCode": "en","sortBy": "price_low","minPrice": 50,"maxPrice": 250,"maxProductsPerQuery": 30}
Example — EAN offers + local market
{"productCodes": ["194253015518"],"countryCode": "US","languageCode": "en","location": "Austin, Texas, United States","maxPages": 2,"stores": ["Best Buy", "Amazon"]}
Example — used, on sale, free shipping
{"queries": ["office chair"],"productCondition": "used","onSaleOnly": true,"freeShipping": true,"device": "mobile","maxPages": 3}
Output Overview
Each row is one Shopping product (type is organic, sponsored, or offer for barcode lookups). Sponsored rows carry retailerUrl (direct merchant link) and googleAdUrl. Organic rows carry rating, reviewCount, delivery, sale/condition fields when shown, plus five of Google's own identifiers — productId (data-cid), googleGroupId, googleItemId, googleOfferId, googleProductId — which are the durable handles to join a listing across runs.
Organic cards have no
<a href>. The modern Shopping results page (udm=28) is JavaScript-driven, soproductUrlstaysnullon organic rows. Constructedgoogle.com/shopping/product/<id>forms return Not available. WhenresolveRetailerUrlsis on, a matching PLA on the same page can fillretailerUrl.imageUrlis populated when Google publishes the thumbnail as a URL (google.ldi→encrypted-tbn…); inlined base64 JPEGs are left out. Sponsored rows already have real links.
Output Samples
Sponsored PLA (with retailer URL)
{"type": "sponsored","position": 1,"page": 1,"searchQuery": "wireless headphones","productCode": null,"countryCode": "US","languageCode": "en","device": "desktop","location": null,"title": "JBL Tune 510BT Wireless On-Ear Headphones - White","brand": "JBL","onSale": true,"price": "$29.95","priceValue": 29.95,"currency": "$","originalPrice": "$50","originalPriceValue": 50,"merchant": "JBL","retailerUrl": "https://www.jbl.com/JBLT510BTWHTAM.html","googleAdUrl": "https://www.google.com/aclk?…","scrapedAt": "2026-07-22T22:41:00.000Z"}
Organic Shopping card
{"type": "organic","position": 7,"page": 1,"searchQuery": "wireless headphones","productCode": null,"countryCode": "US","languageCode": "en","device": "desktop","location": null,"productId": "5636327565946258541","title": "Sony WH-1000XM6 Wireless Noise Canceling Headphones","brand": "Sony","onSale": false,"price": "$458.00","priceValue": 458,"currency": "$","merchant": "Best Buy","offerCount": 12,"rating": 4.7,"reviewCount": "4.9K","reviewCountValue": 4900,"delivery": "Free delivery by Fri","retailerUrl": "https://www.bestbuy.com/site/sony-…","scrapedAt": "2026-07-22T22:41:00.000Z"}
Key Output Fields
| Group | Fields |
|---|---|
| Context | type, position, page, searchQuery, productCode, countryCode, languageCode, device, location, scrapedAt |
| Product | productId, googleGroupId, googleItemId, googleOfferId, googleProductId, title, brand, condition |
| Pricing | price, priceValue, currency, originalPrice, originalPriceValue, typicalPrice, typicalPriceValue, onSale, discountPercent |
| Merchant | merchant, offerCount, storeRating, rating, reviewCount, reviewCountValue, delivery |
| Links | productUrl, retailerUrl, googleAdUrl, imageUrl |
Optional values are null when Google does not display them.
FAQ
Does this scrape organic web Search or only Shopping?
Only Google Shopping (udm=28) — product cards and PLAs.
Why is retailerUrl null on some organic rows?
Organic cards have no product link on the page. Turn resolveRetailerUrls on (default) to copy a matching PLA’s destination when one exists on the same page.
Can I pass EAN / GTIN / UPC codes?
Yes — put them in productCodes. Each code is searched on Shopping; seller cards come back as type=offer with productCode set. Dedicated /shopping/product/{id} pages are not used (Google serves “Not available”).
What happens when a search has no products?
If Google returns a real Shopping page with zero cards, the run succeeds with an empty dataset. A block or markup miss still fails.
Do I need my own Google API key?
No. No Google login or Ads account is required.
Support
- Open an issue on the Actor’s Issues tab in Apify Console
- Website: apify.com/memo23
- Custom scrapers / exports: contact via Apify
Additional Services
Need scheduled price monitoring, a custom schema, or extra enrichment? Reach out for a tailored build.
Explore More Scrapers
Browse the full portfolio: apify.com/memo23
🤖 For AI Agents & LLM Apps
Purpose: Scrape Google Shopping product listings + sponsored PLA ads by keyword.
Minimal input:
{"queries": ["wireless headphones"],"maxProductsPerQuery": 10,"countryCode": "US","languageCode": "en"}
Output fields (flat): type, position, page, searchQuery, productCode, countryCode, languageCode, device, location, productId, googleGroupId, googleItemId, googleOfferId, googleProductId, title, brand, condition, onSale, discountPercent, price, priceValue, currency, originalPrice, originalPriceValue, typicalPrice, typicalPriceValue, merchant, offerCount, storeRating, rating, reviewCount, reviewCountValue, delivery, productUrl, retailerUrl, googleAdUrl, imageUrl, scrapedAt
Billing: Pay-per-event — charged per dataset item (apify-default-dataset-item) plus actor start. One row = one product card.
Agent notes: Prefer short keyword lists; set maxProductsPerQuery and maxPages explicitly; treat null retailerUrl as expected when no matching PLA exists; type is organic, sponsored, or offer; a zero-result Shopping page is a successful empty run.
⚠️ Disclaimer
This Actor is not affiliated with, endorsed by, or sponsored by Google LLC. Google Shopping™ and Google™ are trademarks of Google LLC. All trademarks remain the property of their respective owners.
This tool collects publicly available Shopping listing data for research and monitoring. You are responsible for complying with Google’s Terms of Service, applicable laws (including GDPR/CCPA where relevant), and your own use-case policies. Use responsibly and at your own risk.
SEO Keywords
google shopping scraper, google shopping api, scrape google shopping, google shopping products, google shopping prices, google shopping ean, google shopping gtin, PLA scraper, product listing ads scraper, google shopping merchant, price monitoring scraper, competitor price scraper, ecommerce intelligence, shopping results scraper, google udm=28 scraper, sponsored shopping ads, product price comparison scraper, google shopping dataset, apify google shopping, shopping keyword scraper, retailer url extractor, multi country shopping scrape
