Shopify Scraper - Products & Price Change Monitor
Pricing
from $0.30 / 1,000 product scrapeds
Shopify Scraper - Products & Price Change Monitor
Scrape products, variants, prices, stock and images from any Shopify store via its public products.json. Monitor mode reports only price drops/rises, back-in-stock, out-of-stock and new/removed products. Built for schedules and webhooks.
Pricing
from $0.30 / 1,000 product scrapeds
Rating
0.0
(0)
Developer
Cemal Atakli
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
9 days ago
Last modified
Categories
Share
Shopify Scraper – Products & Price Change Monitor
Scrape every product from any Shopify store: titles, vendors, product types, tags, images, descriptions and all variants with SKU, price, compare-at price and stock availability. You can also switch to monitor mode, which compares each run with the previous one and returns only what changed: price drops and rises, back in stock, out of stock, and new or removed products. Schedule it, add a webhook, and you have a competitor price tracker.
- $0.30 per 1,000 products. That is 3.3× cheaper than the most popular Shopify scraper on the Store. Non-Shopify sites, errors and blocked stores are free.
- Monitor mode: pay only for changes. Each change costs $0.001, and unchanged products cost nothing. The first run saves a baseline for free.
- Many stores per run. Give it domains or collection URLs, and the stores are processed in parallel.
- Clean, flat rows. One row per product with derived fields:
minPrice,maxPrice,onSale,discountPct,available,inStockVariantsand the producturl. - Store summary. One row per store with product count, price range, median price, share of products on sale, average discount, top vendors, product types and tags.
- Fast, cheap and polite. It uses only plain HTTP requests to the public
/products.jsonfeed, with no browser and no proxy. Each store gets at most 1 request per second, and robots.txt is respected.
What can I use it for?
- Competitor price monitoring: get a Slack or email alert when a competitor drops a price or starts a sale
- Stock and restock alerts: see when a product sells out or comes back in stock
- New product tracking: spot competitors' new launches the day they go live, and see what was discontinued
- Market research and catalogue analysis: compare price ranges, discount depth, vendors and product types across many DTC brands
- Dropshipping and product research: export full catalogues with images, variants and SKUs
- Price comparison sites and feeds: keep product data fresh on a schedule
- AI agents: a "what does this Shopify store sell, and at what price?" tool (see below)
Need a list of Shopify stores first? Use our Wappalyzer Alternative – Bulk Tech Stack Detector to check which domains run Shopify.
Input
| Field | Description |
|---|---|
storeUrls | Store domains (allbirds.com) or collection URLs (https://store.com/collections/sale) |
mode | scrape (all products) or monitor (only changes since the last run) |
maxProductsPerStore | Product limit per store, 0 = whole catalogue (default 250). In monitor mode, set it above the catalogue size so that removed products can be detected |
includeVariants | Add the variants array (default on) |
includeDescription | Add the description as plain text (default on) |
includeStoreSummary | One summary row per store in scrape mode (default on, $0.002 per store) |
fetchStoreInfo | Read /meta.json for the store name and currency (default on) |
currency | Optional currency label override (informational) |
monitorKey | Name of the key-value store that keeps the monitor state. Use different names for separate monitors |
maxStores, respectRobotsTxt, maxConcurrency, requestTimeoutSecs, proxyConfiguration | Advanced |
Scrape example:
{"storeUrls": ["allbirds.com", "gymshark.com", "https://www.deathwishcoffee.com/collections/coffee"],"mode": "scrape","maxProductsPerStore": 250}
Monitor example (run it on a schedule):
{"storeUrls": ["allbirds.com", "colourpop.com"],"mode": "monitor","maxProductsPerStore": 0,"monitorKey": "competitors-shoes"}
Output
Every row has a type: product, summary, change, baseline or error. The Output tab has three tables: Products, Changes and Store summaries.
Product (scrape mode, shortened):
{"type": "product","store": "partakefoods.com","storeName": "Partake Foods","productId": 7783508934754,"title": "Mini Chocolate Chip & Grahams","url": "https://partakefoods.com/products/mini-chocolate-chip-grahams","vendor": "Partake Foods","productType": null,"tags": ["Snack Pack", "type_Snack Packs"],"minPrice": 54.99, "maxPrice": 109.98, "currency": "USD","onSale": false, "discountPct": 0,"available": true, "variantCount": 2, "inStockVariants": 2,"image": "https://cdn.shopify.com/s/files/1/0012/2296/7353/files/MiniCC_Grahams_12pack_transparent.png","createdAt": "2026-08-28T16:19:17-04:00","variants": [{"variantId": 43267709108322, "title": "6 Boxes", "sku": "52889-1", "price": 54.99,"compareAtPrice": null, "available": true, "option1": "6 Boxes", "grams": 0}]}
Change (monitor mode; from a test run where the saved state was edited):
{"type": "change","changeType": "PRICE_DOWN","store": "partakefoods.com","storeName": "Partake Foods","productId": 7783508934754,"title": "Mini Chocolate Chip & Grahams","variantId": 43267709108322,"variantTitle": "6 Boxes","sku": "52889-1","oldPrice": 59.99, "newPrice": 54.99, "priceDiff": -5.0, "priceDiffPct": -8.33,"oldCompareAtPrice": null, "newCompareAtPrice": null,"oldAvailable": true, "newAvailable": true,"currency": "USD","url": "https://partakefoods.com/products/mini-chocolate-chip-grahams","previousCheckAt": "2026-10-01T08:57:44+00:00","detectedAt": "2026-10-01T08:58:17+00:00"}
The change types are PRICE_DOWN, PRICE_UP, BACK_IN_STOCK, OUT_OF_STOCK, NEW_PRODUCT and REMOVED. Price and stock changes are tracked per variant, by size or colour. A variant can produce two rows, one for price and one for stock.
Store summary (scrape mode): productCount, catalogComplete, inStockProducts, minPrice/medianPrice/maxPrice, onSaleProducts, discountShare (% on sale), avgDiscountPct, topVendors, topProductTypes, topTags and newestProductAt.
Errors are free rows such as {"store": "example.com", "error": "NOT_SHOPIFY"}. The other codes are PRODUCTS_JSON_DISABLED, PASSWORD_PROTECTED, ROBOTS_DISALLOWED, RATE_LIMITED, BLOCKED and COLLECTION_NOT_FOUND. A per-store status report is saved in the run's key-value store as SUMMARY.
How monitor mode works
- First run: the Actor reads the catalogue and saves a compact snapshot (product, variant, price, compare-at price, availability) to a named key-value store in your account. The default name is
shopify-products-monitor-state, or you can setmonitorKey. You get one freebaselinerow per store. - Every later run: the Actor compares the new data with the snapshot and outputs only the differences, then saves the new snapshot. If nothing changed, the dataset is empty and you pay nothing per product.
REMOVEDis reported only when the whole catalogue was read, so a product limit never causes false "removed" alerts.- If your Maximum cost per run stops the run early, the changes that did not fit are kept and reported on the next run.
Recipe: Slack alerts on competitor price drops
- Create a task with
mode: "monitor"and your competitors' stores. - Schedule it, for example every 6 hours (Console → Schedules).
- Add a webhook on Run succeeded to Zapier or Make, or use the Apify Slack integration. Fetch the run's dataset items with
?view=changesand post everyPRICE_DOWNorBACK_IN_STOCKrow to Slack.
Pricing
| This Actor | trovevault/shopify-products-scraper | autofacts/shopify | webdatalabs | |
|---|---|---|---|---|
| Per 1,000 products | $0.30 | $1.00 | $1.20 | $10 |
| Change-only monitor mode | Yes, $1 per 1,000 changes; unchanged items free | No | No | No |
| Store summary row | Yes, $0.002 per store | No | No | No |
| Non-Shopify sites and errors | Free | – | – | – |
Competitor prices are from the Apify Store as of 2026-10-01. Example: 10 competitor stores × 500 products cost $1.50 to scrape. Monitoring them every day, with about 30 changes per day, costs about $0.03 per day.
FAQ
Which stores work? Most public Shopify stores, since Shopify exposes /products.json by default. Some stores turn it off (PRODUCTS_JSON_DISABLED), are password-protected, or throttle all automated traffic (RATE_LIMITED). Those rows are free.
Are inventory quantities included? No. Shopify's public feed shows whether a variant is available, not how many units are left. Barcodes and cost prices are not public either.
Why is a collection URL skipped with ROBOTS_DISALLOWED? Some stores' robots.txt disallows /collections/*/products*, and we respect it. Use the store domain instead, which reads the whole catalogue, and filter by productType or tags.
Are prices in my currency? No, prices are the store's own base prices. currency comes from the store's /meta.json.
How fast is it? About 250 products per second-long request. Each store is paced at 1 request per second, or slower when its robots.txt Crawl-delay asks for it. Several stores run in parallel.
Can I monitor several separate lists? Yes. Use a different monitorKey for each list or task.
Is this legal? The Actor reads only the public product feed that Shopify serves to every visitor and search engine. That feed contains product data and no personal data. It never touches cart, checkout or account pages, it honours robots.txt Disallow and Crawl-delay, and it rate-limits itself. Check that your use complies with the laws and terms that apply to you. Store owners who want to opt out can disallow /products.json in robots.txt or email iletisim.ortalamabiri@gmail.com.
Use with AI agents / Apify MCP
The input is small (a list of domains) and the rows are compact JSON, so the Actor works well as an agent tool. Through the Apify MCP server (https://mcp.apify.com?actors=gazidev/shopify-products-monitor), Claude, ChatGPT, Cursor and other MCP clients can call it directly. For example: "list the 20 cheapest in-stock products on gymshark.com" or "what changed in my competitors' stores since yesterday?". Over the API: POST https://api.apify.com/v2/acts/gazidev~shopify-products-monitor/run-sync-get-dataset-items with the input JSON.
Categories
E-commerce · Automation · Lead generation · Developer tools