Shopify online store collection and product data extractor. Supports realtime price/stock monitor. Crawl product list or single product in a structured form, including title,description,price,sku, etc.
Changed: Actor moved from rental to the pay-per-event pricing model. Four events are charged: product and collection (one per saved record, via Actor.pushData(item, eventName)), recommends (one per nested recommendation, which no per-item event would otherwise see), and real-inventory (one per product returning a real stock count). The platform's synthetic apify-default-dataset-item event must stay removed in the Apify Console — enabled alongside these, it would bill every item twice.
Fixed: Duplicate results are no longer stored or billed. A request failing mid-pagination is reclaimed and re-parsed from its first page, which previously re-pushed every product it had already delivered; the same guard also collapses a product reached through several start URLs or overlapping collections.
Fixed: A run that reaches its Max total charge limit now stops cleanly and finishes SUCCEEDED. Previously the SDK silently trimmed the writes away while the crawler kept fetching, until the platform aborted the run.
Changed: HTTP client swapped from got-scraping to impit, Apify's Rust client. It impersonates Chrome down to the TLS/HTTP2 fingerprint instead of only generating headers, and the hard-coded User-Agent is gone — it would have overridden the impersonated one and contradicted the fingerprint. impit has no built-in retry, so parseSite now owns its single retry explicitly, and every request carries a timeout (30s; 20s for parseSite).
Fixed: Transient failures are retried again. got retried a GET twice by default and impit does not, which cost products outright — storefronts hand out 503s often enough that one hit a live test run. Retries now cover 5xx, 429 and transport faults (never a 4xx), with backoff.
Fixed: A failed LD+JSON availability lookup no longer aborts the product. It only supplements the JSON API's stock flag, so it now degrades to that flag — previously a 503 on this secondary page killed the product and, in search mode, the whole run.
Fixed: maxRequestsPerCrawl is now exact in search mode. Its inner loop broke on the limit but the outer loop moved on to the next start URL, storing and billing one record over the cap per extra start URL.
Changed: Crawl errors now carry the upstream HTTP status directly, so Scraper Insight reports the real status code instead of guessing it from the message text. A 200 carrying an anti-bot challenge page is named as such rather than surfacing as a bare SyntaxError.
Changed: Every JSON endpoint now goes through one _fetchJson primitive, so all five harvest the cart_currency cookie — previously searchSuggest and getRecommendations did not, and skipped the last link of the currency-detection cascade.
Changed: Dependencies — TypeScript 4.9 → 5.9, @apify/tsconfig 0.1 → 0.2, ESLint 7 → 9 (flat config, @apify/eslint-config/ts), cheerio 1.0 → 1.2, lodash 4.17 → 4.18. Dropped the direct @apify/log dependency, which pinned v1 while the SDK used v2 — LogLevel now comes from apify. The apify SDK itself was already on the newest stable (3.7.2).
Fixed: Dockerfile no longer passes --omit=optional, and a .dockerignore keeps the host's node_modules out of the image. impit ships per-platform native binaries as optional dependencies; either omission left the actor unable to make a single request.
09/07/2026
New: Added grabRealInventory — reads real per-variant inventory (quantityAvailable, inventoryTracked, inventoryPolicy) from Shopify's single-product JSON for stores that expose it. Free on product URLs; adds one detail fetch per product on collection crawls (capped by maxInventoryFetches). A live count of 0 (or <= 5) overrides stockStatus to OutOfStock (or LowInStock). Wired as a separate, PPE-dormant real-inventory charge event.
Changed: Bumped apify SDK to ^3.7.0 (ChargingManager null-safety, required before re-introducing any Actor.charge).
05/06/2026
Changed: Actor is now compatible with limited permissions — removed ad-hoc Feishu run-status webhooks (Actor.addWebhook); run monitoring is handled by Scraper Insight instead.
29/12/2025
New: Added maxRecommendationsPerProduct to fetch product recommendations.
New: Implement searchSuggest for keyword-based product discovery.
10/12/2025
New: improved currency detection.
Fix: Updated User-Agent to Chrome 143.0.0.0.
Fix: Corrected some domain mappings.
Fix: Resolved build error regarding implicit 'any' type in crawler.
02/03/2025
New: Strategy to bypass advanced gateway restrictions.