Shopify Store Products & Price Monitor avatar

Shopify Store Products & Price Monitor

Pricing

from $1.00 / 1,000 product scrapeds

Go to Apify Store
Shopify Store Products & Price Monitor

Shopify Store Products & Price Monitor

Export every product and variant from public Shopify stores: price, compare-at price, stock, SKU, images, tags. Optional price-change, out-of-stock and new-product flags between runs. No browser, no login.

Pricing

from $1.00 / 1,000 product scrapeds

Rating

0.0

(0)

Developer

Lemni Works

Lemni Works

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

21 hours ago

Last modified

Categories

Share

Shopify Store Products & Price Monitor exports every product and variant from any public Shopify store: price, compare-at (sale) price, stock status, SKU, images, tags and more. It reads each store's public product feed, so there's no browser, no login and no Shopify API key. Turn on Compare with the previous run, schedule it, and every row also tells you what changed since last time: price moves, variants that sold out or came back, and new products.

3 ways to use it

1. Track competitor prices and sales

Add 5–20 competitor stores, turn on Compare with the previous run and schedule a daily run. Open the Price & stock changes view and sort by priceChange to see who cut prices overnight. A filled compareAtPrice means the item is on sale. Send the results to Google Sheets or Slack with Apify integrations.

2. Get alerts when sizes sell out or come back

Every size and color is its own row, with wentOutOfStock and backInStock flags. Connect a webhook or the Slack integration and alert only on rows where backInStock is true. Useful for resellers, merchandisers and brand-protection teams.

3. Export a full catalog for research or migration

Download a store's whole catalog as CSV, Excel or JSON: vendor, product type, tags, prices, images and product URLs. Use it for product research, supplier vetting, price-distribution analysis, or as a starting point for a catalog migration. The newProduct flag shows launches as they happen.

Input

FieldRequiredWhat it does
storesyesStore URLs or domains, one per line (allbirds.com, https://www.brooklinen.com). Paste a collection URL (…/collections/mens) to scrape only that collection.
collectionnoCollection handle (or URL) applied to every store above.
compareToPreviousnoAdds priceChange, previousPrice, wentOutOfStock, backInStock and newProduct to each row. Default false.
maxProductsPerStorenoStop after this many products per store. 0 (default) = everything.
snapshotStoreNamenoWhere snapshots are kept between runs (a named key-value store in your account).
proxyConfigurationnoOff by default. Turn on Apify Proxy only if a store refuses requests.

Example input:

{
"stores": ["https://www.allbirds.com", "brooklinen.com"],
"compareToPrevious": true
}

Output example

One row per variant (each size/color). You can download the dataset as JSON, CSV, Excel or HTML, or read it through the API. This is a real row from allbirds.com, from a run with Compare with the previous run turned on, three minutes after the previous one, so nothing had changed (tags shortened):

{
"store": "allbirds.com",
"storeName": "Allbirds",
"collection": null,
"productId": 6858599596112,
"title": "Women's Tree Dasher Relay - Blizzard/Hazy Cobalt (Clarity Blue Sole)",
"vendor": "Allbirds",
"productType": "Shoes",
"tags": ["allbirds::carbon-score => 5.47", "allbirds::cfId => color-womens-tree-dasher-relay-blzz-hzy-cblt-clrty-bl"],
"variantId": 40234510123088,
"variantTitle": "5",
"sku": "A10692W050",
"price": 67,
"compareAtPrice": 135,
"currency": "USD",
"available": false,
"createdAt": "2023-07-15T21:42:13-07:00",
"updatedAt": "2026-10-31T07:23:24-07:00",
"publishedAt": "2026-09-25T16:49:33-07:00",
"imageUrl": "https://cdn.shopify.com/s/files/1/1104/4168/files/A10691_24Q1_Tree-Dasher-Relay-Blizzard-Hazy-Cobalt-Clarity-Blue_PDP_LEFT.png?v=1776183508",
"productUrl": "https://www.allbirds.com/products/womens-tree-dasher-relay-blizzard-hazy-cobalt",
"scrapedAt": "2026-10-31T14:23:24.094Z",
"previousSnapshotAt": "2026-10-31T14:19:56.156Z",
"newProduct": false,
"previousPrice": 67,
"priceChange": 0,
"wentOutOfStock": false,
"backInStock": false
}

If the price had dropped from $67 to $55, the row would show "previousPrice": 67, "priceChange": -12. On the first monitored run there is nothing to compare yet, so the comparison fields are null. Without compareToPrevious they're left out.

Stores that can't be read produce an error row instead of stopping the run:

{
"store": "example.com",
"storeUrl": "https://example.com/products.json?limit=250&page=1",
"collection": null,
"page": 1,
"errorCode": "NOT_FOUND",
"error": "No /products.json here. The site may not run on Shopify, or uses a headless storefront; try its .myshopify.com domain.",
"scrapedAt": "2026-10-31T14:19:43.468Z"
}

Pricing

Pay per event. You pay only for products you receive.

EventPriceCharged when
Actor start$0.00005Once per run (Apify's standard start fee)
Product scraped$1.00 per 1,000 productsOnce per product saved, however many variants it has

Error rows are free. Example: all of allbirds.com is 356 products and 4,168 variant rows, so a full export costs about $0.36. Set a maximum cost per run in Apify Console; the Actor saves and charges only what fits, then stops.

How it works and what to expect

  • Which stores work? Any Shopify store that serves its public /products.json, which is most of them. Headless storefronts (custom frontends on top of Shopify) often don't serve it on their main domain. Try the store's .myshopify.com domain instead.
  • 25,000-product ceiling. Shopify lists at most 25,000 products per store or collection through this feed. Bigger catalogs are cut there, and the log says so. Scrape them collection by collection to get past it.
  • Prices are the store's default-market prices in the store currency (currency, read from the store's /meta.json). International prices from Shopify Markets aren't included.
  • Comparison snapshots are kept in a named key-value store in your account (default shopify-price-monitor-snapshots), one record per store or collection, saved as soon as each store finishes. A run that doesn't see the whole catalog (product cap, error, spending limit) merges what it saw into the old snapshot instead of replacing it, so nothing is falsely reported as new next time. Products you didn't receive keep their old values, so their changes still show up when you do get them.
  • newProduct needs a full catalog read. It's exact when the previous run read the whole store or collection. If the store is always cut short (a product cap, or over 25,000 products), it's true only for products created after the last snapshot and null (unknown) for the rest.
  • No double charges: a product that shifts between pages while the store is being read (the catalog changed mid-run) is saved and charged once. If Apify moves the run to another server, product caps and duplicate checks carry over.
  • Polite by default: a store's pages are fetched one after another, with at most 4 requests in flight and about 120 new page requests a minute. Rate limits (including Shopify's HTTP 430) and server errors are retried with exponential backoff, honoring Retry-After.

Error codes

errorCodeMeaning
INVALID_INPUTThe store URL couldn't be parsed.
NOT_FOUNDNo /products.json at that domain (not Shopify, or headless).
NOT_SHOPIFYThe response wasn't a Shopify product feed.
PASSWORD_PROTECTEDThe store is behind a password page.
BOT_CHALLENGEA CDN bot challenge answered instead of the store.
NO_PRODUCTSThe store or collection returned no products. Shopify returns an empty list for collections that don't exist, so check the handle.
RATE_LIMITED, BLOCKED, SERVER_ERROR, NETWORK_ERROR, BAD_JSONStill failing after 6 attempts with backoff.
HTTP_<code>Any other HTTP error (no retry).
UNEXPECTED_ERRORSomething else went wrong for this store; the rest of the run continues.

This Actor reads only public product information that stores publish in their own product feed. It doesn't log in, check out, or collect customer data. You should still make sure your use of the data complies with the stores' terms and with the laws that apply to you. If you're unsure, consult your lawyers.

Questions, bugs or a store that doesn't work? Open an issue on the Issues tab.