Shopify Products Scraper: prices, stock, variants, changes avatar

Shopify Products Scraper: prices, stock, variants, changes

Pricing

from $0.90 / 1,000 result rows

Go to Apify Store
Shopify Products Scraper: prices, stock, variants, changes

Shopify Products Scraper: prices, stock, variants, changes

Scrape any Shopify store, collection or product URL: products, variants, prices, sales and stock. Track price drops, new and removed products daily, with alerts. Works on headless stores and past 25,000 products.

Pricing

from $0.90 / 1,000 result rows

Rating

0.0

(0)

Developer

Useful API

Useful API

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

8 days ago

Last modified

Share

Shopify Products Scraper: prices, stock, variants and changes

Get every product from any Shopify store: titles, prices, compare-at prices, discounts, stock status, variants, SKUs, images, tags, vendors and dates. Give it a store, a collection or a product URL. No login, no API key, no browser.

It reads the product feed that every Shopify store publishes, so runs are fast (a 25,000-product store in about 90 seconds) and the data is exactly what the store shows its shoppers.

Why this one

  • Works where others stop. Headless stores (custom front ends) and stores behind a firewall often hide their product feed. This scraper finds the store's own myshopify.com address and reads the feed there.
  • Past 25,000 products. Shopify's product listing stops at 25,000. For bigger stores it carries on through the store's collections, then its sitemap. Products found only in the sitemap are read one by one (a few thousand an hour), so very large stores take longer past that point.
  • The right prices, wherever it runs. Shopify can price a store's feed for the visitor's country, so scrapers can return euros or baht depending on where their server is. This one always gets the store's main prices (or the country you ask for) and labels them with the right currency.
  • Country prices. Stores that sell in several countries (Shopify Markets) show other prices per country. Set Country to CA, GB, DE... and you get that country's prices, currency and stock. Stores that sell each country through a folder (/en-gb/) are handled automatically; if a store does not change its prices for that country, the summary says so instead of guessing.
  • One row per product or one row per variant. Variant rows are spreadsheet ready: one line per size and colour with its own price, SKU, barcode and stock flag.
  • Filters: in stock only, on sale only, price range, vendors, product types, tags, title words, created or updated since a date ("7 days" works too).
  • Change tracking. Schedule it daily or hourly and each row says what changed since the last run: new, price-drop, price-increase, back-in-stock, sold-out, variants-changed, content-changed, or removed (gone from the store, or from the collection you monitor). Switch on "Only changed products" to get just the changes. Works for whole stores up to 25,000 products and for collections up to 25,000 (for bigger stores, monitor some of their collections).
  • Barcodes (GTIN, UPC, EAN) and stock tracking per variant, as an option.
  • Exact stock quantity per variant, where the store publishes it (through its public storefront key, or as printed in its product pages); each row says where the number came from.
  • Best-seller rank: Shopify's own best-selling order (1 = best seller), on stores with a public storefront key (read on 11 of 14 test stores).
  • Product page sections: Dimensions & Care, Shipping & Returns, Ingredients and similar tabs and accordions.
  • Sales estimates: with monitoring and exact stock on, units sold since the last run (and restocks), from the stock the store publishes. Labelled as estimates: a restock between runs hides the sales before it.
  • Price history: with monitoring on, the last 5 earlier prices of each variant with the day each changed, and the day each product was first seen.
  • Store report, free: per store, catalogue size, price range and median, share on sale, average discount, new products in the last 7 and 30 days (by creation date), top brands, types and tags, the top 10 best sellers among the products read, countries shipped to, stock units in the saved rows. In the run's OUTPUT record.
  • Collections per product (Sale, New In...) and related products (Shopify's own "you may also like").
  • Alerts: paste a Slack, Discord, Zapier or Make link and get each run's changes as a message. Free.
  • Clear run summary per store: name, currency, how it was reached, products read, rows saved, errors in plain words.

What people use it for

Copy one of these into the JSON input tab, then adjust the store addresses.

Watch a competitor's prices every day and get only what changed. Schedule it daily (see "Get alerts" below).

{ "startUrls": ["https://competitor.com"], "maxProductsPerStore": 0, "trackChanges": true, "changesOnly": true }

Export a whole catalogue to Excel or Google Sheets, one line per size and colour:

{ "startUrls": ["https://store.com"], "maxProductsPerStore": 0, "outputMode": "variants" }

Find a store's best sellers and what is on sale:

{ "startUrls": ["https://store.com"], "maxProductsPerStore": 0, "bestsellerRank": true, "onSaleOnly": true }

Size up many stores at once (agencies, market research): run a list of stores and read the free store report (catalogue size, price range, share on sale, new products, top brands, best sellers):

{ "startUrls": ["https://store-one.com", "https://store-two.com"], "maxProductsPerStore": 0, "bestsellerRank": true, "descriptionFormat": "none" }

Estimate what a competitor sells: monitoring plus exact stock, run daily; each row then shows units sold since the last read (on stores that publish stock):

{ "startUrls": ["https://competitor.com"], "maxProductsPerStore": 0, "trackChanges": true, "includeStock": true }

Get alerts when prices drop

  1. Switch on Track changes (and Only changed products if you only want the changes in the dataset).
  2. Paste a Slack or Discord webhook link, or a Zapier or Make webhook (which can email you), into Send changes to. After each run you get a short message per store: "3 price drops, 2 new, 1 removed", with up to 10 examples and their links. It is free, and sent only when something changed.
  3. Save the input as a Task and add a daily (or hourly) Schedule to it.
  4. The first run saves the starting point; alerts start from the second run.

You can also use Apify's own Integrations on the task (email or Slack on "Run succeeded") instead of step 2.

Input

FieldWhat it does
Store, collection or product URLsallbirds.com, https://shop.com/collections/sale, https://shop.com/products/blue-shirt, or name.myshopify.com. As many as you like.
Max products per storeStop each store after this many products. 0 = everything. Through the API, leaving it out means 25.
One row perProduct (variants inside) or variant (flat).
CountryTwo-letter code (US, CA, GB...): prices, currency and stock for that country. Empty = the store's main prices (row field country is then empty).
MarketThe store's country folder such as en-ca, for stores that use folders; empty for none.
Barcodes and stock trackingAdds barcode, stock tracking, subscription plans and image alt text. One extra request per product.
Exact stock quantityUnits in stock per variant where the store publishes them (stockQuantity, totalStock, stockSource).
Product page sectionsThe page's tabs and accordions as pageSections (title and text).
Best-seller rank / ranks to readShopify's best-selling order as bestsellerRank, for the top N (default 1,000).
Collections per productcollections (handle and title) on each row.
Related productsrelatedProducts (id, title, price, in stock, URL), up to 10 per product.
DescriptionPlain text, HTML, both or none.
FiltersIn stock, on sale, min and max price, vendors, product types, tags, title contains, created since, updated since. Products read one by one (product URLs, past 25,000) carry no update date and pass the "updated since" filter.
Track changes / Only changed productsMonitoring (see above). The first run saves the starting point.
Monitor nameKeeps separate histories for different monitors of the same store.
Read past 25,000 productsOn by default.
ProxyNot needed for most stores.

Example:

{
"startUrls": ["https://www.allbirds.com", "kyliecosmetics.com/collections/kylie-skin"],
"maxProductsPerStore": 0,
"outputMode": "products",
"onSaleOnly": true
}

Output

One row per product (example from a real run on 16 Oct 2026, shortened):

{
"storeUrl": "https://www.allbirds.com",
"storeName": "Allbirds",
"currency": "USD",
"country": null,
"market": null,
"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", "shoprunner"],
"priceMin": 25,
"priceMax": 25,
"onSale": true,
"maxDiscountPercent": 50,
"available": true,
"variantsCount": 7,
"availableVariantsCount": 1,
"options": [{ "name": "Size", "values": ["5", "6", "7", "8", "9", "10", "11"] }],
"imageUrl": "https://cdn.shopify.com/s/files/1/1104/4168/files/A12513_26Q2_Allbirds-Flip-Flop-Dusty-Pink_PDP_LEFT.png?v=1774646345",
"description": "Sun on your feet. Comfort underneath. Light, easy, and made for warm weather...",
"variants": [
{
"id": 42146889039952,
"title": "5",
"options": { "Size": "5" },
"sku": "A12513W050",
"price": 25,
"compareAtPrice": 50,
"onSale": true,
"discountPercent": 50,
"available": false,
"grams": 455,
"url": "https://www.allbirds.com/products/womens-allbirds-flip-flop-dusty-pink?variant=42146889039952"
}
],
"createdAt": "2026-03-27T14:03:50-07:00",
"updatedAt": "2026-10-16T03:59:35-07:00",
"publishedAt": "2026-09-25T16:58:13-07:00",
"source": "catalog",
"scrapedAt": "2026-10-16T10:59:35.015Z"
}

With change tracking on, each row also has changeType, changes (all that apply), previousPriceMin, previousAvailable, priceChanges (each variant whose price moved, with old and new price), firstSeenOn, and per variant priceHistory (changedOn, previousPrice) and lastPriceChangeOn. With exact stock on as well: unitsSoldSinceLastRead, restockedSinceLastRead, hoursSinceLastRead and estimatedUnitsSoldPerDay (given only when the reads are at least 6 hours apart).

For Excel or Google Sheets, choose One row per variant: in product mode, variants, images and collections are lists that a spreadsheet splits into many columns. In the run's Storage tab, the Products, Variants and Changes views show the main columns only, and can be exported as they are.

Readable store report: each run also saves a page with one card per store (record REPORT in the key-value store, linked from the run's Output tab), ready to forward.

Prices are numbers in the currency of the currency field. They are the store's catalogue prices: automatic discounts that a store applies on its pages or at checkout through apps (for example "40% off everything") are not in the product feed, so they are not in the rows either. The key-value store record OUTPUT has the summary per store.

Pricing

Pay per event, no monthly fee:

EventPrice
Result row (product, or variant in variant mode)USD 0.90 per 1,000
Catalog page read (up to 250 products)USD 0.0005 (USD 0.002 per 1,000 products read)
Store checkedUSD 0.0005 per store per run
Product lookup: barcodes, product URLs, products past 25,000, a product page read (stock or sections), related productsUSD 0.50 per 1,000
Storefront-key request: best-seller ranks (per 250), stock and collections (per 100 products)USD 0.0005 each, counted as a catalog page
Run startUSD 0.002

1,000 products from one store cost about USD 0.90. Filtered-out and unchanged products are never billed as results (and never get a barcode lookup); only the pages read to find them count. Set a maximum cost per run and the scraper stops at it, still saving its summary and change-tracking snapshots.

Good to know

  • Stock numbers: every row says in stock or not per variant. Exact quantities only come where the store publishes them (4 of 12 test stores); a store's page and its storefront key can show different counts for large stocks (two counts the store keeps), so stockSource tells you which you got. Nothing is guessed.
  • Password-protected stores (not open yet) cannot be read; the summary says so.
  • Not a Shopify store? The summary says so, and you are only billed the store check.
  • Very slow stores are stopped so a run never drags on; the summary says which.
  • Billing of lookups: a product URL (or a product past 25,000) is billed when the store answers, found or not. A barcode lookup, a product page read and a related-products lookup are billed only when they return what was asked for (a page with no stock count and no sections is not billed; after 5 such pages the store's pages are skipped). Blocked or unanswered requests are never billed.
  • Change tracking keeps a small snapshot per store in a key-value store named shopify-products-monitor on your account. Delete it to start a monitor from scratch.
  • Removed products are reported only when both this scan and an earlier one read the whole store (or collection), and this scan saw at least 80% of what the last one did. A bigger drop (a sale that ended) is reported once the next complete scan confirms it. With filters on, only products that matched them are reported as removed. The first run of a monitor saves the starting point. In variant mode, a size or colour that disappears comes as a removed variant row.
  • If Apify moves a long run to another server, it resumes where it was: nothing is saved or billed twice.

FAQ

Does it work on any Shopify store? On most: 116 of 125 stores in our test. Stores behind an anti-bot wall (Cloudflare and similar) cannot be read, and the run summary says so instead of returning an empty result. Headless stores (custom front ends) are read through their Shopify address automatically.

How do I get the data into Excel or Google Sheets? Choose One row per variant, run, then export the dataset as CSV or Excel (or connect Google Sheets in the run's Integrations). Each size and colour is one line with its own price, SKU, barcode and stock flag.

What does it cost? About USD 0.90 per 1,000 products. A 10,000-product store costs about USD 9; a daily price watch of a 5,000-product store with "Only changed products" costs about USD 0.05 a day. You can set a maximum cost per run; the run stops at it.

Can I get prices in another currency or country? Yes: set Country (for example GB or CA) and you get that country's prices, currency and stock, as a shopper there would see them. Without it, you get the store's main prices, whatever the location of the server.

How do I get alerts when a competitor changes prices? Switch on Track changes, paste a Slack, Discord, Zapier or Make link into Send changes to, and schedule the run daily. See "Get alerts when prices drop" above.

Can I get the exact stock count? Where the store publishes it (about 1 store in 3 in our tests): switch on Exact stock quantity. Every row also says in stock or not per variant, for every store.

Is scraping Shopify stores allowed? The tool reads only the public product data a store publishes for shoppers and search engines: no login, no personal data, no password-protected stores. Check that your use of the data fits your local rules and the store's terms.

Use it from code

curl -X POST "https://api.apify.com/v2/acts/<USERNAME>~shopify-products/run-sync-get-dataset-items?token=<YOUR_TOKEN>" \
-H "Content-Type: application/json" \
-d '{"startUrls": ["https://www.allbirds.com"], "maxProductsPerStore": 100}'

Responsible use

The scraper reads only public product information that stores publish for shoppers and search engines. It does not collect personal data, log in, or get past password pages. It waits between requests to the same store and slows down when a store asks it to.