Shopify Scraper - Products & Price Change Monitor avatar

Shopify Scraper - Products & Price Change Monitor

Pricing

from $0.30 / 1,000 product scrapeds

Go to Apify Store
Shopify Scraper - Products & Price Change Monitor

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

Cemal Atakli

Maintained by Community

Actor 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, inStockVariants and the product url.
  • 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.json feed, 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

FieldDescription
storeUrlsStore domains (allbirds.com) or collection URLs (https://store.com/collections/sale)
modescrape (all products) or monitor (only changes since the last run)
maxProductsPerStoreProduct limit per store, 0 = whole catalogue (default 250). In monitor mode, set it above the catalogue size so that removed products can be detected
includeVariantsAdd the variants array (default on)
includeDescriptionAdd the description as plain text (default on)
includeStoreSummaryOne summary row per store in scrape mode (default on, $0.002 per store)
fetchStoreInfoRead /meta.json for the store name and currency (default on)
currencyOptional currency label override (informational)
monitorKeyName of the key-value store that keeps the monitor state. Use different names for separate monitors
maxStores, respectRobotsTxt, maxConcurrency, requestTimeoutSecs, proxyConfigurationAdvanced

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

  1. 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 set monitorKey. You get one free baseline row per store.
  2. 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.
  3. REMOVED is reported only when the whole catalogue was read, so a product limit never causes false "removed" alerts.
  4. 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

  1. Create a task with mode: "monitor" and your competitors' stores.
  2. Schedule it, for example every 6 hours (Console → Schedules).
  3. Add a webhook on Run succeeded to Zapier or Make, or use the Apify Slack integration. Fetch the run's dataset items with ?view=changes and post every PRICE_DOWN or BACK_IN_STOCK row to Slack.

Pricing

This Actortrovevault/shopify-products-scraperautofacts/shopifywebdatalabs
Per 1,000 products$0.30$1.00$1.20$10
Change-only monitor modeYes, $1 per 1,000 changes; unchanged items freeNoNoNo
Store summary rowYes, $0.002 per storeNoNoNo
Non-Shopify sites and errorsFree–––

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