Shopify Products Scraper: Catalog, Prices, Variants & Stock
Pricing
from $0.80 / 1,000 products
Shopify Products Scraper: Catalog, Prices, Variants & Stock
Scrape all products from any Shopify store: the full catalog with title, price, compare-at price, discount, variants, SKUs, inventory availability, images, tags and vendor. Monitor Shopify prices and stock. Public store JSON, no proxies.
Pricing
from $0.80 / 1,000 products
Rating
0.0
(0)
Developer
Emilio Cisneros
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
a day ago
Last modified
Categories
Share
Get every product from any Shopify store in clean JSON, CSV or Excel: titles, prices, compare-at (sale) prices, discount %, stock availability, SKUs, variants and options (size, color...), vendor, product type, tags, images and description.
- Bulk: paste many stores and scrape them in one run.
- Collections: scrape a single collection (e.g.
/collections/sale) instead of the whole catalog. - One row per variant (optional) for spreadsheets and price monitoring, at no extra cost: you pay per product, not per variant.
- Store info: store name and currency are attached to every product.
It reads the public storefront catalog that every Shopify store serves (/products.json). There's no login, no browser, no proxies and no bot-protection bypass, and it uses polite rate limits (about 1 request per second per store, 250 products per request).
How to use
- Paste Shopify store URLs into Store URLs (any store built on Shopify).
- Optionally limit to a collection, only available products, or flatten variants into rows.
- Click Start and export the catalog with prices, compare-at prices, discounts, variants and stock.
What you get per product
storeUrl, storeName, currency, productId, handle, title, url, vendor, productType, tags, available, price (lowest variant), priceMax, compareAtPrice, onSale, maxDiscountPercent, variantsCount, availableVariantsCount, options (name + values), featuredImage, imageUrls, imagesCount, description (plain text), optional descriptionHtml, publishedAt, createdAt, updatedAt, collection, scrapedAt, and variants (each with variantId, title, sku, price, compareAtPrice, available, option1-3, weightGrams, requiresShipping, taxable, imageUrl).
Prices are numbers, in the store's currency.
Why this Actor
| This Actor | Typical Shopify scrapers | |
|---|---|---|
| Price | $1.00 / 1,000 products | $1 to $10 / 1,000 |
| One row per variant | Free (still 1 charge per product) | Often charged per row |
| Computed fields | Sale flag, max discount %, in-stock variant count | Raw JSON only |
| Collections | Collection URL or handle | Rare |
| Failed stores | Clear, free error record explaining why | Silent empty runs |
Input examples
Whole catalogs of two stores
{ "storeUrls": ["https://www.allbirds.com", "https://colourpop.com"], "maxItems": 5000 }
Only the sale collection, one row per in-stock variant
{ "storeUrls": ["https://kith.com/collections/sale"], "flattenVariants": true, "onlyAvailable": true }
Sample 100 products from each of many competitor stores
{ "storeUrls": ["store-one.com", "store-two.com", "store-three.myshopify.com"], "maxItemsPerStore": 100 }
Output
{"storeUrl": "https://www.allbirds.com", "storeName": "Allbirds", "currency": "USD","productId": 7340901859408, "handle": "mens-tree-runners", "title": "Men's Tree Runner", "url": "https://www.allbirds.com/products/mens-tree-runners","vendor": "Allbirds", "productType": "Shoes", "tags": ["mens", "runner"], "available": true,"price": 98, "priceMax": 110, "compareAtPrice": 120, "onSale": true, "maxDiscountPercent": 18, "variantsCount": 12, "availableVariantsCount": 9,"options": [ { "name": "Size", "values": ["8", "9", "10"] } ], "featuredImage": "https://cdn.shopify.com/...", "imagesCount": 6,"description": "Light & breezy...", "createdAt": "2025-01-01T00:00:00-08:00", "updatedAt": "2026-10-18T21:33:50-07:00","variants": [ { "variantId": 1, "title": "8 / Black", "sku": "TR-8-B", "price": 98, "compareAtPrice": 120, "available": true, "option1": "8", "option2": "Black" } ]}
With "flattenVariants": true, each row is one variant, with productTitle, variantTitle, sku, price, compareAtPrice, available, option1Name/option1 ... option3, imageUrl and the product fields repeated.
Pricing (pay per event)
- $0.001 per product ($1.00 per 1,000). All variants are included. Variant rows in flatten mode are free.
- Error records (store not Shopify, password-protected, blocked) are free. Set a maximum cost per run and the Actor stops cleanly at your limit.
How much does it cost?
You only pay for results, never for compute time:
| You get | You pay (Starter/Bronze plan price) |
|---|---|
| 100 products | $0.10 |
| 1,000 products | $1.00 |
| 10,000 products | $10.00 |
Apify's free plan includes $5 of usage every month, and free-plan users pay half price on this Actor, so that covers about 10,000 products at no cost. Paid plans get volume discounts (Silver -10%, Gold -20%). Set a maximum cost per run and the Actor stops cleanly at your limit.
Limits you should know
- It works on Shopify stores that keep the public catalog enabled. Some stores disable
/products.jsonor block automated access. Those stores get an error record explaining why, and the Actor does not try to get around it. - Only published, publicly visible products are included. Exact inventory quantities aren't public on Shopify, but
available(in stock or not) is. - It collects product data only. It never touches customers, orders, reviews or checkout.
Use cases
Competitor price monitoring, catalog and assortment research, dropshipping and product research, MAP/discount tracking, building product feeds, and market analysis of brands and vendors.
FAQ
How do I know if a site is on Shopify? Open https://<store>/products.json in your browser. If you see JSON, it works.
Is it legal? It reads the public product catalog that the store serves to every visitor, at a polite rate, with no login. Respect each store's terms and don't republish copyrighted images or descriptions without permission.
Can I schedule it? Yes. Use Apify Schedules to track prices and stock daily, and webhooks or the API to send data to Google Sheets or your database.
Run it from code (API, Python, JavaScript)
curl -X POST "https://api.apify.com/v2/acts/api-co~shopify-products-scraper/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \-H "Content-Type: application/json" -d '{"storeUrls": ["https://www.allbirds.com"], "maxItems": 20}'
from apify_client import ApifyClientclient = ApifyClient("YOUR_APIFY_TOKEN")run = client.actor("api-co/shopify-products-scraper").call(run_input={"storeUrls": ["https://www.allbirds.com"], "maxItems": 20})for item in client.dataset(run["defaultDatasetId"]).iterate_items():print(item)
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: 'YOUR_APIFY_TOKEN' });const run = await client.actor('api-co/shopify-products-scraper').call({"storeUrls": ["https://www.allbirds.com"], "maxItems": 20});const { items } = await client.dataset(run.defaultDatasetId).listItems();
It also works from AI agents through the Apify MCP server, and with Zapier, Make, n8n, Google Sheets and webhooks. You can schedule it in the Apify Console.