Shopify Store Scraper — Products & Variants
Pricing
$0.80 / 1,000 products
Shopify Store Scraper — Products & Variants
Scrape any Shopify store's products from its public JSON endpoints: title, vendor, type, tags, variants with prices, compare-at prices, SKUs and stock status, images and URLs. Filter by collection, one row per product or per variant, monitor prices and stock on a schedule. No login or API key.
Pricing
$0.80 / 1,000 products
Rating
0.0
(0)
Developer
Trevor Ortega
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
3 days ago
Last modified
Categories
Security
Limited permissionsShare
Shopify Store Scraper: Products & Variants
Scrape any Shopify store's products with their variants, prices and stock status. Paste a store domain, a collection page or a product page and get every product as clean data: title, vendor, product type, tags, description, price and compare-at price, currency, whether it is in stock, every variant (size, colour, SKU, barcode, price, compare-at price, availability, weight), options, images, dates and the product URL. Export to JSON, CSV or Excel, or pull the results through the API into a spreadsheet, your app or an LLM pipeline.
It reads the public JSON endpoints that every Shopify storefront serves (/products.json, /collections/<handle>/products.json, /products/<handle>.js), so one request returns up to 250 complete products and a whole catalog takes seconds. Use it for competitor price monitoring, MAP checks, assortment and stock tracking, product research, feed building and catalog migration. Switch on One row per variant when you need one line per size or colour, and Only new or changed items to watch prices and stock on a schedule.
What data does Shopify Store Scraper extract?
| Field | Description |
|---|---|
productId, handle, url | Shopify's product id, the handle (the last part of the product URL) and the product page URL |
title, vendor, productType, tags | Product title, brand/vendor, the merchant's product type and tag list |
description | The product description as plain text (HTML removed) |
price, maxPrice, compareAtPrice, currency | The cheapest variant's price, the most expensive variant's price, the cheapest variant's crossed-out "compare at" price (null when not on sale) and the store's currency (e.g. USD, EUR, GBP) |
available | true when at least one variant can be bought |
variantCount, variants | All variants: variantId, title, sku, barcode, price, compareAtPrice, available, inventoryQuantity (when the store exposes it), options (e.g. {"Size": "10"}), weightGrams, requiresShipping, imageUrl, position |
options | The product's option names and values, e.g. [{"name": "Size", "values": ["5", "6", "7"]}] |
images, imageUrl | All product images (CDN URLs) and the first one |
createdAt, updatedAt, publishedAt | When the product was created, last changed and published, ISO 8601 UTC |
storeUrl, storeName, collection | The store's origin and name, and the collection handle the product was listed in (when you scrape collections) |
scrapedAt | When the item was scraped |
With One row per variant on, each item is one variant: the product fields above plus variantId, variantTitle, sku, barcode, the variant's own price, compareAtPrice, available, inventoryQuantity, options, weightGrams, requiresShipping, imageUrl and a url that opens that variant (?variant=...).
How to scrape a Shopify store
- Put one or more stores into Store URLs: a domain such as
allbirds.com, or any page of the store. A collection page (https://colourpop.com/collections/best-sellers) scrapes that collection, a product page (https://colourpop.com/products/bare-necessity) that product, anything else the whole catalog. - Optionally list Collections (handles such as
saleornew-arrivals, applied to every store) or single Product URLs. - Set Max items and Max pages per store (250 products per page), switch on One row per variant or Only in-stock products if you need them, and click Start. Download the results as JSON, CSV or Excel, or read them through the API.
Input example
{"storeUrls": ["https://www.allbirds.com", "colourpop.com/collections/best-sellers"],"productUrls": ["https://kyliecosmetics.com/products/dewy-balm-stick"],"collections": [],"itemPerVariant": false,"onlyAvailable": false,"maxItems": 500,"maxPagesPerStore": 20}
Output example
{"productId": 7340901859408,"handle": "womens-allbirds-flip-flop-dusty-pink","title": "Women's Allbirds Flip Flop - Dusty Pink","vendor": "Allbirds","productType": "Shoes","tags": ["allbirds::gender => womens", "allbirds::hue => pink", "allbirds::material => sugar"],"description": "Sun on your feet. Comfort underneath. Light, easy, and made for warm weather, these flip flops bring everyday comfort to sunny days, beach walks, and everything in between. Just slip them on and go.","price": 50,"maxPrice": 50,"compareAtPrice": null,"currency": "USD","available": true,"variantCount": 7,"variants": [{"variantId": 42146889039952, "title": "5", "sku": "A12513W050", "barcode": null, "price": 50, "compareAtPrice": null, "available": false, "inventoryQuantity": null, "options": {"Size": "5"}, "weightGrams": 455, "requiresShipping": true, "imageUrl": null, "position": 1},{"variantId": 42146889203792, "title": "10", "sku": "A12513W100", "barcode": null, "price": 50, "compareAtPrice": null, "available": true, "inventoryQuantity": null, "options": {"Size": "10"}, "weightGrams": 594, "requiresShipping": true, "imageUrl": null, "position": 6}],"options": [{"name": "Size", "values": ["5", "6", "7", "8", "9", "10", "11"]}],"images": ["https://cdn.shopify.com/s/files/1/1104/4168/files/A12513_26Q2_Allbirds-Flip-Flop-Dusty-Pink_PDP_LEFT.png?v=1774646345", "..."],"imageUrl": "https://cdn.shopify.com/s/files/1/1104/4168/files/A12513_26Q2_Allbirds-Flip-Flop-Dusty-Pink_PDP_LEFT.png?v=1774646345","url": "https://www.allbirds.com/products/womens-allbirds-flip-flop-dusty-pink","createdAt": "2026-03-27T21:03:50Z","updatedAt": "2026-11-01T20:48:00Z","publishedAt": "2026-09-25T23:58:13Z","storeUrl": "https://www.allbirds.com","storeName": "Allbirds","collection": null,"scrapedAt": "2026-11-01T20:52:10Z"}
Which stores work?
Any store that runs on Shopify's standard storefront (the vast majority), including stores on a custom domain or a myshopify.com address. The scraper is generic: you supply the store URLs. Prices come in the store's base currency (currency, from the store's /meta.json), not in the currency of a local market. These stores do not work; each one is reported in the run summary (errors) instead of crashing the run, and the other stores of the run still run:
- Headless storefronts (Shopify Hydrogen or a custom front end that only uses the Storefront API): their domains answer
404,403or429on/products.json. Examples at the time of writing: bombas.com, gymshark.com. - Password-protected stores: there is nothing public to read; the Actor reports the store as password-protected.
- Closed or restricted stores (for example a store that answers
401) and sites that are not Shopify stores at all: reported with the HTTP status or "did not answer JSON".
Products that are not published to the online store (or are visible only in another sales channel) do not appear in the JSON endpoints; a collection that is empty for that reason, or a misspelled collection handle, is listed under sourcesWithoutProducts in the run summary.
Does it need an API key or a login?
No. It reads the same public product JSON that the store's own theme and apps load for every visitor; no Shopify account, access token or Storefront API key is involved. Apify's datacenter proxy (the default) is enough. Shopify occasionally answers a request with its own "Verify your browser" check; the Actor does not solve it, it retries the request on a fresh proxy connection a few times and reports the store if the check persists (challengePages in the run summary). Nothing is solved or bypassed.
Monitor Shopify prices and stock on a schedule
Turn on Only new or changed items to watch stores, collections or single products: each run remembers what earlier runs returned and outputs only products that are new or whose price or stock status changed. Unchanged products are dropped before they are saved, so they are not charged; a daily run over a 1,000-product catalog that saw 12 price changes costs 12 results. With monitoring on, Max items is the number of products checked per run, so set it to the catalog size (for example 1,000 with 4 pages). Save the input as a task and add a Schedule in Apify (hourly, daily, weekly); give each watch its own Monitoring key if several schedules use the same stores. Every output item has changeType (new or changed), and changed items carry previousValues with the old values, e.g. {"price": 135} or {"available": true}. With One row per variant, variants are watched one by one, so a single size selling out is reported.
How much does it cost?
You pay per product saved to the dataset (or per variant row with One row per variant): see the Pricing tab. There is no start fee, no per-collection fee and no subscription, and platform usage is included in the price. A store page holds up to 250 products, so a 1,000-product catalog is four requests.
Is it legal to scrape Shopify stores?
This Actor collects publicly visible product data that every visitor of the store sees without an account: product titles, prices, variants, availability, descriptions, tags and images. It does not log in, does not collect customer or order data and does not export anything personal. Product descriptions and images are the merchant's content; check the store's terms of use and the laws that apply to you (copyright, database rights, competition law) for your use case, and use the data responsibly.
Limits
inventoryQuantity(the exact stock count) is exposed only by stores whose theme settings allow it, and only for single Product URLs (the/products/<handle>.jsendpoint); catalog pages carryavailable(true/false) per variant.- Prices are the store's base prices in its base currency. Market-specific prices (e.g. a EUR price shown to visitors in Germany) and customer-specific discounts are not in the public JSON.
- Collections are read by handle; the Actor does not list a store's collections. Find handles in the store's navigation URLs (
/collections/<handle>). - A catalog page is 1-2 MB; very large stores (10,000+ products) need Max pages per store above the default 20.
Integrations and API
Run it from the Apify API, schedule it, and send the results to Google Sheets, Slack, Make, Zapier, n8n or a webhook. Use maxItems and maxPagesPerStore to cap the cost of each run.
Support
Found a bug, a store that should work but does not, or a field that is missing? Open an issue on the Issues tab with the input you used and the run link.
Related scrapers
- Shopify App Store Scraper: Apps, Pricing, Reviews & Developers
- Etsy Scraper: Listings, Prices, Shops & Badges
- Google Shopping Scraper: Prices & Offers
Found it useful?
A ★ review on this Actor's Apify Store page helps other users find it and tells us what to improve. Issues and feature requests are welcome in the Actor's Issues tab.