# Changelog of Shopify Scraper - Products, Collections, Analysis (`prodiger/shopify-scraper`) Actor

- **URL**: https://apify.com/prodiger/shopify-scraper/changelog.md
- **Full Actor documentation**: https://apify.com/prodiger/shopify-scraper.md

## Changelog

All notable changes to this project are documented here. Format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).

### \[0.1] — 2026-04-29

#### Added

- Initial release. Pay-per-event Shopify product and collection scraper.
- Source classification: homepage, collection, single-product, and search URLs are routed to the appropriate Shopify storefront JSON endpoint (`/products.json`, `/collections/<handle>.json`, `/collections/<handle>/products.json`, `/products/<handle>.json`, `/search/suggest.json`).
- Pure HTTP via Crawlee `HttpCrawler` (no headless browser).
- Optional related-product recommendations per scraped product via `/recommendations/products.json`. Bounded by `maxRecommendationsPerProduct` (max 20).
- Currency override via 3-letter ISO code, propagated to all scraped URLs as `?currency=`.
- Price normalization: all monetary values stored as integer cents (×100) regardless of whether the source endpoint returned a decimal string or integer cents.
- Pay-per-event charging: `product-scraped`, `collection-scraped`, `recommendation-scraped`. Each event fires only after a successful `pushData`. The synthetic `apify-actor-start` event is configured on the platform side (Console → Settings → Monetization).
- RESIDENTIAL proxy default — Cloudflare-fronted Shopify stores routinely 403 datacenter IPs.
- Reactive 429 backoff honoring `Retry-After`; session retirement on persistent blocks.
- Hard cap `maxRecommendationsPerProduct ≤ 20` to bound runaway recommendation traffic.
- Graceful abort handler (`Actor.on('aborting', ...)`) so user-set cost ceilings terminate the run quickly.
