Shopify Store Intel — products, prices & change monitor avatar

Shopify Store Intel — products, prices & change monitor

Pricing

Pay per event

Go to Apify Store
Shopify Store Intel — products, prices & change monitor

Shopify Store Intel — products, prices & change monitor

Scrape the full product catalog of any Shopify store (prices, variants, stock, images) and monitor competitors for new products, removals, price and stock changes.

Pricing

Pay per event

Rating

0.0

(0)

Developer

Istmobot

Istmobot

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

Share

Scrape the complete product catalog of any Shopify store — prices, compare-at prices, variants, SKUs, stock, images, tags — and monitor competitors for new products, removed products, price changes and stock changes. No browser, no login, no API key: it reads the public JSON endpoints every Shopify storefront exposes, so runs are fast and cheap.

What it does

  • Full catalog export from /products.json with automatic pagination (250 products per page).
  • One store or hundreds: paste URLs or bare domains (gymshark.com). Stores are processed 3 at a time.
  • Collection scope: limit to one collection (e.g. mens, sale, new-arrivals).
  • Two output shapes: one item per product (variants nested) or one row per variant (spreadsheet-friendly).
  • Change monitor: remembers each store between runs and outputs NEW_PRODUCT, REMOVED_PRODUCT, PRICE_CHANGE and STOCK_CHANGE records.
  • Shopify detection: non-Shopify sites (or stores that block products.json) get a clear error item instead of crashing the run.
  • Store currency from /meta.json (fallback /cart.js).

Use cases

  • Dropshippers — find winning products, track supplier prices and stock-outs.
  • E-commerce brands — daily competitor price & assortment monitoring, launch alerts.
  • Agencies & analysts — catalog audits, pricing research, discount tracking (onSale, compareAtPriceMax).
  • Data teams — feed product data into BI dashboards, Google Sheets, or your own database via the Apify API.

Input

FieldTypeDefaultDescription
startUrlslist of strings— (required)Store URLs or bare domains, e.g. https://www.allbirds.com, gymshark.com
maxProductsPerStoreinteger0Max products per store, 0 = everything
collectionHandlestringemptyOnly scrape /collections/{handle}
outputModeproducts | variantsproductsOne item per product, or one row per variant
includeDescriptionbooleanfalseAdd plain-text description (HTML stripped)
monitorChangesbooleanfalseCompare with the previous run and output change records
onlyChangesbooleanfalseWith monitoring on, output only change records
{
"startUrls": ["https://www.allbirds.com", "gymshark.com"],
"maxProductsPerStore": 0,
"outputMode": "products",
"monitorChanges": true,
"onlyChanges": false
}

Tip: use the host that actually serves the store. Some brands only expose the storefront API on one host (e.g. gymshark.com works, www.gymshark.com does not).

Output

Product item (outputMode: "products")

{
"store": "Allbirds",
"storeUrl": "https://www.allbirds.com",
"productId": 7340901859408,
"title": "Women's Allbirds Flip Flop - Dusty Pink",
"handle": "womens-allbirds-flip-flop-dusty-pink",
"url": "https://www.allbirds.com/products/womens-allbirds-flip-flop-dusty-pink",
"vendor": "Allbirds",
"productType": "Shoes",
"tags": ["allbirds::gender => womens", "allbirds::material => sugar"],
"createdAt": "2026-03-27T14:03:50-07:00",
"publishedAt": "2026-09-25T16:58:13-07:00",
"updatedAt": "2026-09-30T18:16:55-07:00",
"priceMin": 25,
"priceMax": 25,
"compareAtPriceMax": 50,
"onSale": true,
"currency": "USD",
"available": true,
"variantsCount": 7,
"variants": [
{ "id": 42146889039952, "title": "5", "sku": "A12513W050", "price": 25, "compareAtPrice": 50, "available": false, "option1": "5", "option2": null, "option3": null }
],
"images": ["https://cdn.shopify.com/s/files/1/1104/4168/files/...PDP_LEFT.png"],
"mainImage": "https://cdn.shopify.com/s/files/1/1104/4168/files/...PDP_LEFT.png",
"scrapedAt": "2026-10-01T01:17:09.804Z"
}

With outputMode: "variants" each row contains the product fields (without the variants array) plus variantId, variantTitle, sku, price, compareAtPrice, available (of that variant), option1–option3.

Change record

{
"changeType": "PRICE_CHANGE",
"store": "Allbirds",
"storeUrl": "https://www.allbirds.com",
"productId": "7340901859408",
"title": "Women's Allbirds Flip Flop - Dusty Pink",
"url": "https://www.allbirds.com/products/womens-allbirds-flip-flop-dusty-pink",
"oldPrice": 31.25,
"newPrice": 25,
"priceDiffPercent": -20,
"oldPriceMax": 31.25,
"newPriceMax": 25,
"currency": "USD",
"detectedAt": "2026-10-01T01:17:09.804Z"
}

Error item

{ "storeUrl": "https://www.python.org", "errorType": "NOT_SHOPIFY", "error": "No Shopify products.json at https://www.python.org/products.json (HTTP 404)" }

errorType is NOT_SHOPIFY, FETCH_FAILED or INVALID_URL. Error items are never charged.

How change monitoring works

  1. Turn on Monitor changes. The first run for a store saves a baseline snapshot (the log says so) and reports no changes.
  2. Every following run compares the live catalog with the saved snapshot and outputs:
    • NEW_PRODUCT — product not seen before
    • REMOVED_PRODUCT — product gone from the catalog (only reported on uncapped runs, maxProductsPerStore: 0)
    • PRICE_CHANGE — product min or max price changed (oldPrice, newPrice, priceDiffPercent, plus max prices)
    • STOCK_CHANGE — product went in or out of stock (any variant available)
  3. The snapshot is then updated.

Snapshots live in the named key-value store shopify-store-intel-snapshots in your Apify account (one key per store domain, plus collection handle when used), so they persist across runs and are shared by all runs of this Actor under your account.

Schedule it daily (Apify Console → Schedules) with monitorChanges: true and onlyChanges: true to get a cheap daily feed of competitor changes. Add a webhook or the Slack/Email integration to get alerted.

Pricing

Pay-per-event:

  • Actor start — small fixed fee per run.
  • product-result — per product (or per variant row in variants mode) in the output.
  • change-result — per change record.

Use onlyChanges for monitoring runs to pay only for what changed. Set a maximum cost per run and the Actor stops cleanly once it is reached.

FAQ

Does it work on every Shopify store? On the vast majority. A few stores disable or block /products.json (or run a headless storefront on their main domain); those return a NOT_SHOPIFY error item. Try the store's *.myshopify.com or alternate domain.

Is stock quantity available? No. Shopify's public endpoint exposes only whether a variant is available, not the exact inventory count.

Why is currency null? The store blocked /meta.json and /cart.js. Prices are still in the store's default currency.

How many products can it scrape? Whole catalogs — tens of thousands of products. Pages are fetched politely with delays and automatic retry/backoff on rate limits (HTTP 429) and server errors.

Do I need proxies? Usually not. The Actor makes few, lightweight JSON requests per store.

This Actor only reads publicly available product data that Shopify storefronts publish for anyone to see. It does not log in, bypass protections or collect personal data. You are responsible for using the data in line with applicable laws and the target sites' terms.