Google Shopping products by keyword or product ID: price, store, rating, and per product the store offers Google shows (direct links, stock, delivery, returns) with each store's daily price history (up to 12 months in the US, DE, FR) and Google's typical price range.
Olculen kusur: bir sonuc sayfasi tek SERP vekil istegi ($0,0025) ve bir kosunun en buyuk
tek maliyeti; gelir ise urun basina. Gercekten ucretlenen olaylardan olculdu: 2-3 urun teslim
eden aramalar Op5M9ms62y74ixBeZ %18, 2aWCQv3OS1k87SNW7 %10, hGZQf4xerzoaGLj3s %8 marj
birakti, magaza teklifi tasimayan satirlarda ODZAwgeykn6udgGXS-%19; 10-199 urunluk
kosularda marj %57-89. Yani kusur ince kosulara ozgu.
Yeni search olayi $0,008: yalniz urun TESLIM EDEN aramanin gercekten okunan sonuc
sayfalari icin. Yuklenemeyen sayfa ve bos arama ucretsiz. Arama basina 1-2 sayfa okunuyor,
istek maliyeti $0,0025 -> Apify payindan sonra basa-bas $0,0031. Yeni marjlar: ayni ince
kosular %33-67.
product $0,002 ve product-details $0,01 DEGISMEDI. Rapora chargedSearches eklendi
(arama basina ve toplamda); kosu gunlugu ucretlenen sayfa sayisini yaziyor.
README SIAN standardina cikarildi: emoji basliklar, "What is it / when should you use it",
"Use with AI agents" (MCP istemi + x402/Skyfire), kardes aktor baglantili "Integration",
"Trademark", fiyat tablosu ve yeni FAQ maddesi.
0.1.8 — 2026-10-08 — README: the Python example works with the current Apify client
The README's Python example read the results with run['defaultDatasetId']. With the current Apify client for Python (version 3) call() returns a run object, not a dict, and that line raised TypeError: 'Run' object is not subscriptable — after the run itself had finished. The example now reads run.default_dataset_id; with client version 1 or 2, keep run['defaultDatasetId']. Checked with apify-client 3.2.1, 2.5.1 and 1.12.2.
No code, output field or pricing change.
0.1.7 — 2026-09-30
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.
0.1.6 — 2026-09-30
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).
0.1.5 — 2026-09-30
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.
0.1.4 — 2026-09-30
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).
0.1.3 — 2026-09-30
Store links: Google's tracking parameters are also removed when a store puts them after "#" (seen on next.co.uk).
0.1.2 — 2026-09-30
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.
0.1 — 2026-09-30
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.