Dates are UTC (every build so far was made on 2026-09-30 UTC).
Fixes found by the independent README review (KDS-v3 Q15) on the platform data of builds 0.1.1–0.1.6:
- Offers: Google puts some promotions where it shows an offer's condition ("Save $15.00", "5% off Summer sale", "$400 off"; 10 of 641 platform offers). They were stored as
condition, so the offer was left out of the deal signals: in 4 of 185 rows lowestPrice skipped a cheaper new offer (VEVOR espresso machine: 440.86 instead of 215.27). Only used / refurbished / pre-owned words are a condition now; a promotion goes to the new field offers[].promotionText. No field was removed.
- Search rows: a foreign store's price in its own currency ("(₹98,990)" under "$1,031.64") was read as
oldPrice (22 US rows). It now goes to priceNote; oldPrice is only an amount in the row's own currency.
- Delivery: "Bezpłatna dostawa" (Polish), "Fri frakt" (Swedish) and "送料無料" (Japanese) now give
deliveryCost 0 and a totalPrice (16 platform offers had none).
- Review counts: Swedish "2,6 tn" is expanded to 2600 (was null).
- An offer Google lists twice on a product page (same store, price and link; 4 of 185 pages) is kept once, so
offersCount counts different offers.
historyLowestPriceDate / historyLowestPriceMerchant: when several days or stores share the lowest price, the most recent day is given (before: the first store in page order).
priceHistoryNote for the UK, Turkey and Brazil says "product pages" (UK: 9 checked).
- Proxy error message no longer says what Apify plans include; it asks for an issue with the run ID.
- Input descriptions: about 40–50 different products per results page; "Price changes" keeps the first and the last day too; Google's price order does not always follow the listed price.
- README: every number re-measured on 57 platform runs of builds 0.1.1–0.1.6; wording corrected where the review found it wrong or overstated.
- Store links: a product page where an offer came without a store link is read once more, and the answer with more store links (and the price history) is kept. On the platform, build 0.1.5 had 3 offers without a link on 1 of 51 product pages; a later read of that page had all 4 links.
SOURCE_REPORT counts these reads (marketCheck.linkRetries, linkRecovered).
isAtHistoryLow now agrees with pctAboveHistoryLow: a price that rounds to 0% above the history low counts as at the low. Before, one platform row had pctAboveHistoryLow: 0 with isAtHistoryLow: false.
- README: performance and data-quality numbers now come from Apify platform runs (run IDs in the text).
- Every row now has the
error field: the reason on status rows, null on product rows (before, product rows had no error key). No field was removed.
- Poland: store offer prices written as "154,99 zł" are now read. Before, Polish offers came back without a price (found in a platform test run). Czech "1 299,00 Kč" prices follow the same rule (string test only; no Czech page tested yet).
- Store links: when Google's page gives no direct link for an offer, the link is taken from the offer's hidden "Report a violation" link (seen on German and Spanish pages; a Spanish test run had 5 offers without a store link).
- Store links: Google's tracking parameters are also removed when a store puts them after "#" (seen on next.co.uk).
- Price history coverage measured in 15 countries on the Apify platform. Brazil joins the United Kingdom and Turkey as a country where Google shows no price history:
priceHistoryNote now says so (no product in 8 tested had it).
- A product page without the price-history block is read once more in every country where Google was seen showing history (before: only the US, Germany and France). On the platform, 4 of 47 product pages came without the block and all 4 had it on the second read.
First version.
- Google Shopping search by keyword in 26 countries: title, price, store, rating, review count, discount badges, condition, delivery and returns labels, Google's product ID.
- More than one results page: the Actor also reads Google's own sort orders and price bands for the same search and removes duplicates (Google has no second results page on the addresses the SERP proxy serves).
- Per product (on by default): the store offers Google lists on the product page (typically 3–5) with direct store links, price, old price, discount, delivery cost, total price, returns, stock, condition and store rating; each store's daily price history (up to about 12 months) as price changes or every day; Google's typical price range; specifications, description and variants.
- Deal signals: lowest price, position against Google's typical range, lowest price in the history window, whether today's price is at that low. Used, refurbished and pre-owned offers are left out of these unless every offer is one.
- Product ID mode: re-check known products by their Google product ID or a Google Shopping product link.
- Markets without price history (United Kingdom, Turkey in tests) say so in
priceHistoryNote.
- Pages that Google answers as another country are retried and never delivered; a product page without the price-history block is read once more where Google shows history.
- Store links are cleaned of Google's tracking parameters (
srsltid, every utm_*, gclid); other parameters are kept because some stores need them to open the product.
- Pay per event:
product for every product row, product-details when the row carries store offers. Status rows are free.
- Batch and Standby (HTTP API) code paths; published as a batch Actor.