Shopify Catalogue & Price Change Monitor avatar

Shopify Catalogue & Price Change Monitor

Pricing

from $10.00 / 1,000 product change detecteds

Go to Apify Store
Shopify Catalogue & Price Change Monitor

Shopify Catalogue & Price Change Monitor

Track any Shopify store's full catalogue and get only what changed since the last run: price drops, price rises, new products, stock-outs, restocks and removals.

Pricing

from $10.00 / 1,000 product change detecteds

Rating

0.0

(0)

Developer

Mohanad Alshaka

Mohanad Alshaka

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

Categories

Share

Watch any Shopify store and get only what changed since your last run: price drops, price rises, new products, stock-outs, restocks and removals.

Point it at your competitors, schedule it daily, and each run returns a short list of what moved instead of a fresh dump of the whole catalogue.

Why this one is reliable

Every Shopify store serves its catalogue at /products.json without authentication. That endpoint is part of the Shopify platform, not a page template, so it does not break when a store restyles its theme or swaps its front end. No browser, no proxies, no login.

Verified against live storefronts on 13 September 2026: page size is capped at 250 regardless of what is requested, page paginates cleanly with no overlap, and storefronts answer bursts with HTTP 429. This Actor paginates correctly, backs off on 429 honouring Retry-After, and refuses to mistake an HTML challenge page for an empty catalogue.

What a change row looks like

{
"domain": "gymshark.com",
"changeType": "price_drop",
"reasons": ["price_drop"],
"title": "Gymshark Diffuse Sweat Headwrap - Black",
"previousMinPrice": 51,
"minPrice": 26,
"maxPrice": 28,
"previousInStock": true,
"inStock": true,
"onSale": true,
"vendor": "Gymshark",
"variantCount": 2,
"availableVariantCount": 1,
"url": "https://gymshark.com/products/diffuse-sweat-headwrap-black",
"detectedAt": "2026-09-13T12:31:00.000Z"
}

Change types: price_drop, price_rise, price_change, back_in_stock, out_of_stock, variant_availability_change, title_change, new_product, removed_product, first_seen.

Two details that matter in practice:

  • The first run reports first_seen, not a flood of new_product. A store's entire catalogue appearing at once is a baseline, not news. Real additions after that are new_product.
  • Every row has the same fields, including removed_product rows for items pulled from the storefront. Exports to CSV stay rectangular instead of going ragged.

Input

FieldWhat it does
domainsStorefronts to read. Full URLs, bare domains and www. all work.
modechanges returns only what moved since last run. catalog returns everything each time.
stateKeyNames the saved baseline. Use one key per watchlist so separate schedules don't overwrite each other.
inStockOnlySkip products with no available variant.
onSaleOnlyKeep only products discounted below their compare-at price.
maxProductsPerStoreHow deep to read each catalogue.

Daily competitor price watch

{
"domains": ["gymshark.com", "allbirds.com"],
"mode": "changes",
"stateKey": "competitors",
"maxProductsPerStore": 2000
}

Schedule that daily. The first run records the baseline; every run after returns just the moves.

Full catalogue export

{
"domains": ["gymshark.com"],
"mode": "catalog",
"maxProductsPerStore": 5000
}

Notes and limits

  • Public storefront data only. No customer data, no orders, no accounts, nothing behind a login.
  • Prices are returned in the store's own currency as the storefront publishes them. No conversion is applied.
  • A domain that is not a Shopify store returns a clear per-store error and the run continues with the rest.
  • changes mode needs somewhere to keep the baseline between runs, so it writes to a named key-value store. Deleting that store resets the baseline and the next run reports first_seen again.

Development

npm install
npm test
node src/main.js