Shopify Products Scraper
Pricing
Pay per event
Shopify Products Scraper
Scrape products from any Shopify store, collection or product URL: prices, compare-at and sale flag, variants with SKU and availability, optional stock counts and barcodes, images, tags, vendor, currency. Filters and a flat per-variant mode. $0.75 per 1,000 products.
Pricing
Pay per event
Rating
0.0
(0)
Developer
TidyHarvest
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
14 hours ago
Last modified
Categories
Share
Scrape every product from any Shopify store, on any custom domain: titles, prices, compare-at (sale) prices, variants with SKU and availability, images, options, tags, vendor, product type, descriptions and dates. Add exact stock counts and barcodes when the store exposes them. No login, no API key, no browser: the actor reads the public storefront JSON every Shopify store serves, so it is fast and cheap.
$0.75 per 1,000 products (less on paid Apify plans). Variant mode is billed per product, not per variant, and there is no per-run start fee.
What you get
- Whole catalogs, collections or single products. Paste a domain (
allbirds.com), a collection URL (https://kith.com/collections/footwear) or a product URL. Mix stores in one run. - Two output shapes. One row per product with variants nested, or one flat row per variant (size/color) for price monitoring and spreadsheets.
- Filters before you pay. Keyword, vendor/brand, product type, tag, price range, in stock only, on sale only, updated after a date. Filtered-out products are never charged.
- Stock counts (optional). Per-variant
inventoryQuantity,inventoryPolicy, barcode/GTIN and quantity rules from each product's detail JSON, plustotalInventoryper product. Charged only when stock counts were found. - Store currency and name from the store's own
meta.json, on every row. - Clean failure reporting. Non-Shopify sites, password-protected stores, stores that disable
products.jsonand stores whose robots.txt disallows it are skipped and listed in the run status andSUMMARY, while the other stores in the run finish normally. - Polite by design. Each store is throttled below Shopify's ~2 requests/second limit, 429s are retried with backoff, and the store's robots.txt is honoured.
Input examples
Whole catalog of two stores, 500 products max:
{ "startUrls": ["allbirds.com", "kith.com"], "maxItems": 500 }
Sale items under $80 from one collection, one row per variant (price monitoring):
{"startUrls": ["https://www.allbirds.com/collections/mens"],"outputMode": "variants","onSaleOnly": true,"maxPrice": 80}
Nike products in stock at a store, with stock counts:
{ "startUrls": ["kith.com"], "vendors": ["Nike"], "inStockOnly": true, "includeInventory": true, "maxItems": 200 }
Daily change tracking: only products updated since yesterday:
{ "startUrls": ["allbirds.com"], "updatedAfter": "2026-10-14" }
| Field | What it does |
|---|---|
startUrls | Domains, store URLs, collection URLs or product URLs, one per line |
collections | Collection handles to scrape on every store (e.g. sale); empty = whole catalog |
maxItemsPerStore / maxItems | Caps per store and for the whole run |
outputMode | products (nested variants) or variants (flat) |
keywords, vendors, productTypes, tags | Text and exact-match filters |
minPrice, maxPrice, inStockOnly, onSaleOnly | Variant-level filters (product kept if any variant matches) |
updatedAfter | Keep products updated on or after a date |
includeInventory | Add stock counts, barcode, inventory policy (one extra request per product) |
includeBodyHtml | Keep the raw description HTML (plain text is always included) |
proxyConfiguration | Optional Apify Proxy for the rare store that blocks requests |
Output sample (product mode, trimmed; stock values illustrative)
{"storeDomain": "www.allbirds.com","storeName": "Allbirds","productId": 4870548979792,"handle": "mens-tree-runners","url": "https://www.allbirds.com/products/mens-tree-runners","title": "Men's Tree Runner - Jet Black (White Sole)","vendor": "Allbirds","productType": "Shoes","tags": ["allbirds::gender => mens", "allbirds::material => tree"],"description": "The Allbirds Tree Runner is a breathable and lightweight sneaker ...","descriptionHtml": "<p>The Allbirds Tree Runner is ...</p>","createdAt": "2021-01-29T13:57:15-08:00","updatedAt": "2026-10-15T16:56:06-07:00","publishedAt": "2026-09-25T16:57:46-07:00","currency": "USD","minPrice": 100.0,"maxPrice": 100.0,"compareAtMinPrice": null,"onSale": false,"available": true,"variantCount": 7,"totalInventory": 412,"imageUrl": "https://cdn.shopify.com/s/files/1/1104/4168/products/....png","images": [{ "src": "https://cdn.shopify.com/...", "alt": null, "width": 4000, "height": 4000, "variantIds": [] }],"options": [{ "name": "Size", "values": ["8", "9", "10", "11", "12", "13", "14"] }],"variants": [{"variantId": 33179624669264, "title": "8", "sku": "TR3MJBW080", "price": 100.0, "compareAtPrice": null,"onSale": false, "available": true, "option1": "8", "grams": 680, "barcode": "194966057063","inventoryQuantity": 61, "inventoryPolicy": "deny","url": "https://www.allbirds.com/products/mens-tree-runners?variant=33179624669264"}]}
In variant mode each row carries the product fields plus the variant's own variantId, variantTitle, sku,
price, compareAtPrice, onSale, available, option1..3, optionNames, stock fields and a variant url.
totalInventory, inventoryQuantity and barcode are filled only when the store exposes them (with
includeInventory on, or when the store's product JSON already includes them).
A SUMMARY record in the run's key-value store lists, per store, the store name, currency, published product count,
products scanned and returned, requests made, and every skipped store with the reason (not_shopify,
password_protected, products_json_disabled, robots_disallowed, blocked, unreachable).
Pricing
| Event | Price (FREE plan) | Paid plans |
|---|---|---|
| Product scraped | $0.00075 ($0.75 / 1,000) | down to $0.60 / 1,000 |
| Inventory enriched (optional) | $0.0005 ($0.50 / 1,000) | down to $0.40 / 1,000 |
No start fee. In variant mode you pay per product, so a shoe with 13 sizes costs one product.
Limits and notes
- Works only on Shopify stores that leave the standard public
products.jsonon (the vast majority). Headless storefronts that turn it off are reported, not charged. - Shopify's storefront lists only published products; draft and hidden products are not visible to anyone.
- Speed is ~250 products per request at about 1.6 requests/second per store, roughly 20,000 products a minute per store; several stores run in parallel. Inventory enrichment adds one request per product (about 100 products a minute per store).
- Prices are in the store's default currency.
- Only public catalog data is read. No customer, order or checkout data is touched.