Shopify Product & Price Scraper
Pricing
Pay per usage
Shopify Product & Price Scraper
Scrape any Shopify store's full catalog — products, variants, prices, compare-at prices, discounts and stock — from the public products.json. No API key.
Pricing
Pay per usage
Rating
0.0
(0)
Developer
Ronak Patel
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
19 hours ago
Last modified
Categories
Share
Scrape the full product catalog of any Shopify store — every product, variant, price, discount, and stock status — straight from the store's public products.json feed. No API key, no login, no headless browser.
Just paste one or more store domains (e.g. allbirds.com) and get clean, structured data you can export to CSV/Excel/JSON or pull via API.
Why this scraper is different
- It almost never breaks. It reads the official
products.jsonthat Shopify itself serves to every visitor — a stable, documented JSON feed. There's no fragile HTML parsing and no anti-bot cat-and-mouse, so it keeps working when storefront designs change. - Built-in discount detection. Every product and variant is tagged with
onSale,discountAmount, anddiscountPercent(calculated from the compare-at price). Perfect for finding deals and tracking competitor promotions. - Two output shapes. One row per product (variants nested) for catalog snapshots, or one flat row per variant for price feeds and monitoring.
- Pay per product — variants are free. You're charged once per product scraped, no matter how many sizes/colors it has.
What you can do with it
- Competitor price & promo monitoring — schedule daily runs and watch when rivals drop prices or launch sales.
- Dropshipping & product research — pull entire catalogs to find winning products, vendors, and price points.
- MAP / pricing compliance — check that resellers honor your minimum advertised price.
- Market & trend research — analyze assortments, price tiers, and new arrivals across many stores at once.
- Build product feeds — generate clean variant-level feeds for marketplaces, ads, or internal tools.
Input
| Field | Type | Description |
|---|---|---|
storeUrls | array | One or more Shopify store domains or URLs (bare domain, full URL, or even a collection link — only the domain is used). Required. |
outputMode | select | product (one row per product, variants nested) or variant (one flat row per variant). Default product. |
maxProductsPerStore | integer | Cap products per store. 0 = whole catalog. Default 0. |
onlyOnSale | boolean | Keep only discounted products/variants. Default false. |
onlyAvailable | boolean | Keep only in-stock products/variants. Default false. |
includeBodyHtml | boolean | Include each product's raw HTML description. Default false. |
maxConcurrency | integer | How many stores to scrape in parallel. Default 5. |
proxyConfiguration | object | Optional Apify Proxy. Usually not needed; enable it if a large store rate-limits you (HTTP 430). |
Example input
{"storeUrls": ["allbirds.com", "https://www.gymshark.com"],"outputMode": "variant","onlyOnSale": true,"maxProductsPerStore": 0}
Output
Product mode (one row per product):
{"store": "allbirds.com","productId": 7134115037264,"title": "Women's Tree Dasher Relay","vendor": "Allbirds","productType": "Shoes","url": "https://allbirds.com/products/womens-tree-dasher-relay-natural-black-twilight-teal","price": 67,"priceMax": 67,"compareAtPrice": 135,"onSale": true,"discountPercent": 50,"available": false,"variantCount": 13,"availableVariantCount": 0,"tags": ["FINAL SALE"],"image": "https://cdn.shopify.com/.../left.png","images": ["https://cdn.shopify.com/.../left.png", "..."],"variants": [{"variantId": 41016739233872,"variantTitle": "5","sku": "A11465W050","options": { "Size": "5" },"price": 67,"compareAtPrice": 135,"onSale": true,"discountAmount": 68,"discountPercent": 50,"available": false,"grams": 638,"image": "https://cdn.shopify.com/.../left.png"}],"scrapedAt": "2026-06-28T20:30:00.000Z"}
Variant mode flattens this to one row per variant (each with its own price, compareAtPrice, onSale, discountPercent, available, sku, and options) — ideal for price tracking and feeds.
Good to know (honest limitations)
products.jsondoes not expose a currency code or exact inventory counts. You get prices as numbers and a reliable in-stockavailableboolean per variant — not "12 left in stock."- Only public, published products are returned. Password-protected stores and unpublished/draft products aren't accessible (by design).
- A small number of stores disable the
products.jsonendpoint. When that happens the actor logs a clear warning and moves on; enabling Apify Proxy resolves most rate-limit cases.
Is this allowed?
Yes. products.json is a public endpoint Shopify serves to every visitor and is widely used for catalog syndication. This actor only reads public catalog data and respects polite request limits. Use the data in line with applicable laws and the target store's terms.
Built with the Apify SDK + got-scraping. Pay-per-event pricing: you're billed per product scraped.