Shopify Store Products & Price Monitor
Pricing
from $1.00 / 1,000 product scrapeds
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
Maintained by CommunityActor 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
| Field | Required | What it does |
|---|---|---|
stores | yes | Store URLs or domains, one per line (allbirds.com, https://www.brooklinen.com). Paste a collection URL (…/collections/mens) to scrape only that collection. |
collection | no | Collection handle (or URL) applied to every store above. |
compareToPrevious | no | Adds priceChange, previousPrice, wentOutOfStock, backInStock and newProduct to each row. Default false. |
maxProductsPerStore | no | Stop after this many products per store. 0 (default) = everything. |
snapshotStoreName | no | Where snapshots are kept between runs (a named key-value store in your account). |
proxyConfiguration | no | Off 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.
| Event | Price | Charged when |
|---|---|---|
| Actor start | $0.00005 | Once per run (Apify's standard start fee) |
| Product scraped | $1.00 per 1,000 products | Once 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.comdomain 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. newProductneeds 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'strueonly for products created after the last snapshot andnull(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
errorCode | Meaning |
|---|---|
INVALID_INPUT | The store URL couldn't be parsed. |
NOT_FOUND | No /products.json at that domain (not Shopify, or headless). |
NOT_SHOPIFY | The response wasn't a Shopify product feed. |
PASSWORD_PROTECTED | The store is behind a password page. |
BOT_CHALLENGE | A CDN bot challenge answered instead of the store. |
NO_PRODUCTS | The 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_JSON | Still failing after 6 attempts with backoff. |
HTTP_<code> | Any other HTTP error (no retry). |
UNEXPECTED_ERROR | Something else went wrong for this store; the rest of the run continues. |
Is it legal to scrape Shopify stores?
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.