Google Shopping Scraper - Prices, Stores & Offers, No Login avatar

Google Shopping Scraper - Prices, Stores & Offers, No Login

Pricing

from $0.95 / 1,000 products

Go to Apify Store
Google Shopping Scraper - Prices, Stores & Offers, No Login

Google Shopping Scraper - Prices, Stores & Offers, No Login

Scrape Google Shopping for your search phrases: product title, price as a number with currency, store, rating, reviews and product link. Turn on offers to get every store's price for each product. Pick a country, up to 60 products per search. No login.

Pricing

from $0.95 / 1,000 products

Rating

0.0

(0)

Developer

Cliqto Media

Cliqto Media

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

3 days ago

Last modified

Categories

Share

Add product searches, pick a country, and get Google Shopping results as one row per product: title, price as a number with currency, store, rating, reviews and the Google product link. Turn on offers to get the price of every store that sells the product. No Google login, no API key; the prefilled search with 10 products costs about $0.033.

Use it for price monitoring, competitor and store research, and product catalog checks. The prefilled search wireless earbuds (10 products, US) finishes in about 10 seconds.

Google Shopping Scraper: searches in, Google Shopping products with price, currency, store and rating out, one row per product

Table of contents

What it does

For each search phrase, the Actor opens the public Google Shopping results page in the country you choose and reads the products in page order (up to 60). It saves:

  • product card: position, title, price (number), price text, old price, currency (ISO code), store, "& more stores" flag, rating, number of reviews, delivery and returns notes, condition, Google product IDs and the Google product page link;
  • offers (optional): for each product, the list of stores from the Google product page, with price, currency, availability, store rating, delivery, returns and a link.

Every row has the search phrase and a status, so you can filter and sort in the Dataset, in a spreadsheet or by API.

Good fit

  • Check prices of your products and competitors in one country.
  • See which stores sell a product and for how much.
  • Collect product lists for a category or keyword with ratings and reviews.
  • Watch price changes with a daily or weekly schedule.

Not a fit / limits

  • One Google Shopping page per search: up to 60 products. Google does not give more pages in this format.
  • No sorting or price filters: Google ignores them for this kind of request.
  • No product images: Google puts small images inside the page code, not as links.
  • Rating and reviews are as shown on the Google product card. For some products Google shows the rating of one store listing, so it can differ from other sites.
  • The local-currency check covers 61 countries. In other countries results are saved as Google shows them.
  • Store links in offers are Google redirect links (google.com/goto?...), not direct store URLs.
  • In the EU (for example France), Google often does not open the product page. Products are still saved, but their offers are null and the row status is partial (see Troubleshooting).

Quick start

  1. Open the Input tab.
  2. In Product searches (queries), keep the prefilled wireless earbuds or add your own phrases, one per line.
  3. Keep Country us (default) or choose another country.
  4. Keep Products per search (maxItems) at 10 (prefill), or set up to 60.
  5. Click Start.
  6. Open the Output tab and check title, price, currency, merchant and rating.

Expected result: 10 product rows in USD in about 10 seconds.

Use cases

Buyer jobInput pathOutput entityKey fieldsNext integration
Price monitoringqueries (product names or models), countryCodeproduct rowprice, currency, merchant, oldPriceSchedule + Google Sheets or API
Store comparisonqueries, includeOffers: trueproduct row with offersoffers[].merchant, offers[].price, offers[].availabilityExport JSON / Excel
Category researchqueries (category words), maxItems: 60product rowtitle, rating, reviewsCount, positionExport CSV
Country checksame queries, different countryCodeproduct rowprice, currency, countryCodeCompare in a spreadsheet

Input

Input fields

FieldPlain nameTypeRequiredDefault / prefillAllowed valuesEffectExample
queriesProduct searchesarray of textyesprefill ["wireless earbuds"]1–200 phrases, up to 256 characters eachOne Google Shopping page per phrase. Duplicates (ignoring case and extra spaces) and empty lines are removed.["iphone 16 case", "dyson v15"]
countryCodeCountrytextnodefault us2-letter Google country codes from the list, e.g. us, gb, de, ca, au, fr (uk means gb)Google country, store list and currency. In 61 countries the Actor checks that prices are in the local currency."de"
languageCodeLanguagetextnodefault enGoogle language codes from the list, e.g. en, de, fr, pt-BRLanguage of the Google page"de"
maxItemsProducts per searchintegernodefault 20, prefill 101–60How many products to save per phrase, in page order. Google may show fewer.40
includeOffersInclude offers from other storestrue/falsenodefault falsetrue, falseOpens the Google product page of each product and saves all stores. Slower: about 5 seconds per product.true

Tip: use the language of the country (de for Germany, fr for France) for the best match. An empty queries list, a maxItems outside 1–60 or an unknown country stops the run before it starts, with no charge. A list with only empty lines fails at once; only the start fee can be charged.

Interacting settings

WhenInput AInput BEffective behaviorCost effect
Google shows fewer productsmaxItemsthe phraseFewer rows than maxItemsOnly saved products are charged
Offers onincludeOffers: truemaxItemsOne extra Google page per productproduct-offers per product with at least one store
Product page not availableincludeOffers: truecountry (often EU)Row status partial, offers: nullNo product-offers charge for that product
Many phrasesqueries (over 30)run timeout300 seconds fits about 30 phrases without offersSet a longer timeout; price does not change

Input examples

Prices for 3 products in Germany

{
"queries": ["kopfhörer bluetooth", "kaffeemaschine", "staubsauger roboter"],
"countryCode": "de",
"languageCode": "de",
"maxItems": 20
}

Expected behavior: 3 Google Shopping pages, up to 20 products each, prices in EUR. Expected output: query, position, title, price, currency, merchant. Cost note: 3 searches + 60 products + 1 start = $0.12 on the Free plan.

All stores for 5 products

{
"queries": ["robot vacuum"],
"countryCode": "us",
"maxItems": 5,
"includeOffers": true
}

Expected behavior: 5 products, then each Google product page with its stores. Expected output: offers list (store, price, availability), offersCount. Cost note: 1 search + 5 products + 5 offers + 1 start = $0.077 on the Free plan.

Output

One Dataset row per product. A phrase with no products gets one not_found row; a phrase that could not be loaded gets one error row.

Output fields

FieldMeaningTypeCan be empty?Example / enum
queryYour search phrasetextno"wireless earbuds"
positionPlace on the Google Shopping page (1 = first)numbernull on not_found/error rows1
titleProduct nametextyes"JLab Go Air Pop True Wireless Earbuds"
pricePrice as a numbernumberyes, when Google shows no price17.99
priceTextPrice as showntextyes"$17.99"
oldPricePrice before discountnumberyes27
currencyISO currency codetextyes"USD"
conditionCondition, when not newtextyes"Refurbished"
merchantStore on the product cardtextyes"Best Buy"
moreMerchantsGoogle shows "& more" storestrue/falseyestrue
ratingRating 0–5, as on the cardnumberyes4.3
reviewsCountNumber of reviewsnumberyes33000
deliveryDelivery notetextyes"Free delivery"
returnsReturns notetextyes"30-day returns"
productUrlGoogle product page with all storestextyes"https://www.google.com/search?...&udm=28&ibp=oshop&prds=..."
offersStores for this product: [{merchant, merchantId, price, priceText, oldPrice, currency, title, availability, merchantRating, delivery, returns, url}]arraynull without includeOffers or when the product page was not available; [] when the page had no storessee example
offersCountNumber of offersnumbernull when offers is null5
idsGoogle IDs: catalogId, gpcId, offerDocId, productDocIdobjecteach ID can be null
countryCode, languageCodeCountry and language usedtextno"us", "en"
searchUrlGoogle page that was readtextno
statuscomplete, partial, not_found or errortextnocomplete
statusReason, errorCodeReason for partial/not_found/error rowstextyesPRODUCT_PAGE_UNAVAILABLE
fetchedAtWhen the page was read (ISO 8601)textno

null means Google did not show this value. It is not zero and not an error.

Output entities and surfaces

SituationWhereShapeWhat to do
Normal productDatasetone row per product, status: completeUse price, currency, merchant
No products for a phraseDatasetone not_found rowCheck the spelling or try other words
Offers not loadedDatasetproduct row, status: partial, offers: nullRun the phrase again later or in another country
Some phrases failedDataset + RUN_SUMMARYerror rows, run status PARTIALRun the failed phrases again
Run stopped by time or charge limitRUN_SUMMARYstatus CAPPED, rows so far are kept; not processed phrases get error rowsRaise the limit or split the phrases

The Products view in the Output tab shows the main columns. RUN_SUMMARY in the Key-value store has the run status (COMPLETE, PARTIAL, NO_RESULTS, CAPPED, ERROR), the stop reason, totals (searches, products, charged events, not found, errors, offers not loaded, requests) and, per phrase, its status (results, not_found, error, not_processed) and product counts.

The Apify run itself shows SUCCEEDED for COMPLETE, PARTIAL, NO_RESULTS and CAPPED. It shows FAILED for invalid input and when Google refused all phrases; rows already saved stay in the Dataset.

Output example

First row of the prefill run (wireless earbuds, US, 10 products):

{
"query": "wireless earbuds",
"position": 1,
"title": "JLab Go Air Pop True Wireless Earbuds",
"price": 17.99,
"priceText": "$17.99",
"oldPrice": 27,
"currency": "USD",
"condition": null,
"merchant": "Best Buy",
"moreMerchants": true,
"rating": 4.3,
"reviewsCount": 33000,
"delivery": "Free delivery",
"returns": null,
"productUrl": "https://www.google.com/search?q=JLab+Go+Air+Pop+True+Wireless+Earbuds&udm=28&ibp=oshop&prds=catalogid%3A8372463217625314514%2Cgpcid%3A9146411353573113826%2CheadlineOfferDocid%3A452194635528668653%2CproductDocid%3A10114522055954158630&gl=us&hl=en&uule=w+CAIQICINVW5pdGVkIFN0YXRlcw",
"offers": null,
"offersCount": null,
"ids": {
"catalogId": "8372463217625314514",
"gpcId": "9146411353573113826",
"offerDocId": "452194635528668653",
"productDocId": "10114522055954158630"
},
"countryCode": "us",
"languageCode": "en",
"searchUrl": "https://www.google.com/search?q=wireless+earbuds&tbm=shop&hl=en&gl=us&uule=w+CAIQICINVW5pdGVkIFN0YXRlcw",
"status": "complete",
"statusReason": null,
"errorCode": null,
"fetchedAt": "2026-10-15T05:53:19.024Z"
}

With includeOffers: true, offers holds the stores (trimmed, robot vacuum, US):

{
"title": "Dyson Spot+Scrub Ai Wet and Dry Robot Vacuum",
"price": 849.95,
"currency": "USD",
"merchant": "Home Depot",
"offersCount": 5,
"offers": [
{
"merchant": "Home Depot",
"merchantId": "8740",
"price": 849.95,
"priceText": "$849.95",
"oldPrice": null,
"currency": "USD",
"title": "Dyson Spot+Scrub Ai 10.63 in. Robot Vacuum with smart navigation ...",
"availability": "In stock online",
"merchantRating": 4.6,
"delivery": "Free delivery",
"returns": "90-day returns",
"url": "https://www.google.com/goto?url=..."
}
]
}

Field names in other Google Shopping tools

Some tools use other names. Here is the mapping:

Other nameThis Actor
price as text ("$19.89")priceText; the number is price, the currency is currency
sourcemerchant
linkproductUrl
productIdids.catalogId (can be null)
ratingCountreviewsCount
imageUrlnot available

Pricing and limits

Pricing unit

You pay per Google Shopping page loaded for a phrase (search), per product row saved (product), and, only with offers on, per product with loaded stores (product-offers). There is also a small start fee per run. Platform usage (proxy, compute) is included in the price.

EventFreeBronzeSilverGold+
Run start (apify-actor-start)$0.006$0.006$0.006$0.006
Search page (search)$0.016$0.016$0.016$0.016
Product (product)$0.0011$0.00105$0.001$0.00095
Product offers (product-offers)$0.01$0.01$0.01$0.01
  • A phrase with no products costs one search page: Google was asked and answered.
  • error rows are free. Products with partial status (offers not loaded) are charged as a product, not as offers.
  • If you set a maximum charge for the run, the Actor stops before it, keeps the rows and ends with status CAPPED.

Cost examples (Free plan)

ScenarioInput scopeProductsCharge
Prefill1 phrase, 10 products10$0.033
About 100 products2 phrases, 50 products100$0.148
About 1,000 products20 phrases, 50 products1,000$1.43
With offers1 phrase, 5 products, offers on5$0.077
Phrase without products1 phrase0$0.022

Google decides how many products a page has; the charge follows the real number of saved products.

Limits

  • Up to 200 phrases and 60 products per phrase in one run. A test with 200 phrases and 60 products each (about 10,000 rows) took about 14 minutes.
  • The default timeout is 300 seconds: enough for about 30 phrases without offers (in tests, 10 US phrases took about 60 seconds and 50 German phrases about 160 seconds), or about 50 products with offers. For bigger runs set a longer timeout (for 200 phrases, 1,200 seconds). At the time limit the run stops with status CAPPED and keeps all rows.
  • With offers on, each product needs one more Google page, about 5 seconds per product.

API, export and integrations

  • API: start the Actor with the same JSON input and read the Dataset items. See the API tab for ready code.
  • Export: download the Dataset as JSON, CSV, Excel or HTML from the Output tab.
  • Scheduling: create a Schedule with your product list to check prices every day or week.

Use with AI agents (MCP)

  • MCP server with only this Actor: https://mcp.apify.com?tools=cliqtomedia/google-shopping-scraper
  • Smallest input:
{ "queries": ["wireless earbuds"], "maxItems": 10 }
  • Key output fields: title, price, currency, merchant, rating, reviewsCount, productUrl.
  • One phrase takes about 10 seconds and costs $0.033 with 10 products. Keep includeOffers off for quick answers.

Troubleshooting

Rows have status partial and offers: null

Symptom: includeOffers is on, but some products have no offers. Likely reason: Google did not open the product page (PRODUCT_PAGE_UNAVAILABLE). This happens often in EU countries. After several such pages the Actor stops asking for offers in this run. Action: the product rows are fine and offers are not charged. Try again later or in another country.

Some phrases have error rows

Symptom: the run is PARTIAL, some phrases have one error row (SOURCE_BLOCKED, SOURCE_WRONG_REGION, SOURCE_TIMEOUT). Likely reason: Google refused the page or answered for another country several times. Action: run only the failed phrases again later. Error rows are not charged.

Fewer products than maxItems

Symptom: you asked for 60, got 35. Likely reason: Google showed fewer products for this phrase or country. Action: nothing to fix; only saved products are charged.

The run stopped with CAPPED

Symptom: RUN_SUMMARY has CAPPED and some phrases have error rows "Not processed". Likely reason: the run timeout or your maximum charge was reached. Action: set a longer timeout or a higher charge limit, or split the phrases into several runs.

Results look different from my browser

Likely reason: your browser shows results for your location and account. The Actor gets results for the chosen country without an account, and Google changes the list often.

FAQ

Do I need a Google account or API key?

No. The Actor reads public Google Shopping pages without login or cookies of any account.

Which countries work?

You can choose any country from the list, but Google Shopping does not work in every country. Tests used the US, UK, Germany, Canada, France and Australia. In 61 countries (for example the US, UK, Canada, Australia, the euro area, Japan, India and Brazil) the Actor checks that prices are in the local currency; if Google answers for another country, it tries again from a new IP address. In other countries it saves the results as Google shows them and writes COUNTRY_NOT_CHECKED in the RUN_SUMMARY warnings.

Why is price a number?

So you can sort and compare. The price as shown is in priceText, and the currency code is in currency.

What does null mean?

Google did not show that value, for example no rating or no old price. It is not zero and not an error.

Support

For bugs, questions or feature requests, open the Issues tab of this Actor. Add the run ID, your input (phrases can be shortened) and the statusReason text. Never send tokens, cookies or passwords.