Shopify Products Scraper
Products of any Shopify store: prices, discounts, stock, variants, SKUs and images. From $0.0008 / product, pay per result, no browser, no login.
▶ Run it on Apify · Python example · All scrapers
Export the full product catalog of any Shopify store as JSON, CSV or Excel: titles, prices, compare-at prices and discount %, stock status, every variant with SKU, options (size, color), images, vendor, product type, tags and dates. Paste store or collection URLs — no browser, no login, no API key. 300 products take about 5 seconds.
✅ Whole catalogs or single collections (/collections/sale)
✅ Prices, compare-at prices and discount % — spot every sale
✅ Stock status per product and per variant
✅ Variants with SKU, options, weight and price
✅ Store name and currency added to every product
✅ Headless stores too (Gymshark, Fashion Nova…): read from their sitemap and product pages, with customer rating and review count
✅ Filters: only in stock, only discounted
✅ Hundreds of stores per run; non-Shopify sites are skipped and never charged
🚀 Why this Shopify scraper is different
| This Actor | Typical Shopify scrapers | |
|---|---|---|
| Price | $0.0008 per product | $0.001+ per product |
| Discount % and on-sale flag | Computed for you | Raw prices only |
| Collections | Yes | Often whole store only |
| Headless stores (custom front end) | Yes, from sitemap + product pages | Skipped or failing |
| Non-Shopify URLs | Skipped, not charged | Run fails or is charged |
| Blocked pages | Retried with new IPs, residential fallback | Lost |
| Speed | ~300 products in 5 s | Browser-based, minutes |
💡 Use cases
- E-commerce competitor monitoring: track prices, new products and discounts of rival stores every day.
- Dropshipping & product research: find best-sellers, price ranges and suppliers (vendors) in a niche.
- Price comparison & deal sites: collect every discounted product with its discount %.
- Brands & resellers: check how retailers price and stock your products (MAP monitoring).
- Catalog migration & data science: export a complete catalog with variants and images.
🛠️ How to use it (3 steps)
- Paste store URLs (
allbirds.com) or collection URLs (https://shop.com/collections/sale). - Optionally keep only in-stock or only discounted products.
- Click Start and download products as CSV, Excel or JSON, or use the API.
📥 Input example
{
"storeUrls": ["https://www.allbirds.com", "https://www.colourpop.com", "kyliecosmetics.com"],
"maxProductsPerStore": 1000,
"onlyOnSale": true
}
📤 Output example (real product)
{
"store": "https://www.allbirds.com",
"storeName": "Allbirds",
"productId": "7366895894608",
"title": "Women's Wool Runner - Natural Grey (Light Grey Sole)",
"url": "https://www.allbirds.com/products/womens-wool-runners-natural-grey",
"vendor": "Allbirds",
"productType": "Shoes",
"tags": ["FINAL SALE", "allbirds::material => wool", "allbirds::gender => womens"],
"currency": "USD",
"price": 49,
"maxPrice": 49,
"compareAtPrice": 110,
"onSale": true,
"discountPercent": 55,
"available": true,
"variantsCount": 7,
"variants": [
{ "variantId": "42424464900176", "title": "5", "sku": "WR3WNCW050", "price": 49, "compareAtPrice": 110, "available": true, "options": ["5"], "grams": 698 },
{ "variantId": "42424464932944", "title": "6", "sku": "WR3WNCW060", "price": 49, "compareAtPrice": 110, "available": false, "options": ["6"], "grams": 714 }
],
"options": [{ "name": "Size", "values": ["5", "6", "7", "8", "9", "10", "11"] }],
"images": ["https://cdn.shopify.com/s/files/1/1104/4168/files/WR3WNCW_SHOE_LEFT_GLOBAL_WOMENS_WOOL_RUNNER_GREY_LIGHT_GREY_bc7cc3a6-43a0-4dde-8f9e-48a8d80499df.png"],
"description": "The Allbirds Wool Runner is the original wool sneaker that started it all…",
"createdAt": "2026-05-26T11:10:21-07:00",
"updatedAt": "2026-10-31T17:37:05-07:00",
"publishedAt": "2026-09-25T16:24:03-07:00"
}
⚙️ Input parameters
| Field | Type | Default | Description |
|---|---|---|---|
storeUrls |
array | ["https://www.allbirds.com"] |
Store home pages (“allbirds.com”) or collection pages (“https://shop.com/collections/sale”). Non-Shopify sites are skipped and never charged. |
maxProductsPerStore |
integer | 1000 |
Products read per store or collection (before the filters below). |
onlyAvailable |
boolean | false |
Skip products with no available variant. |
onlyOnSale |
boolean | false |
Keep products with a compare-at price above the price. |
proxyConfiguration, maxRetries |
object, integer | Apify Proxy, auto | Proxy and retries; the defaults work for most runs. |
📋 Output fields
| Field | Type | Description |
|---|---|---|
store |
string | Store URL |
storeName |
string | Store name |
productId |
string | Shopify product ID |
title |
string | Product title |
url |
string | Product page |
handle |
string | URL handle |
vendor |
string | Brand / vendor |
productType |
string | Product type |
tags |
array | Tags |
currency |
string | Store currency |
price |
number | Lowest variant price |
maxPrice |
number | Highest variant price |
compareAtPrice |
number | Price before discount |
onSale |
boolean | At least one variant discounted |
discountPercent |
integer | Biggest variant discount, % |
available |
boolean | At least one variant in stock |
variantsCount |
integer | Number of variants |
variants |
array | Variants with SKU, price, stock, options |
options |
array | Options (size, color…) and values |
images |
array | Image URLs |
description |
string | Description as plain text |
createdAt |
string | Created at |
updatedAt |
string | Updated at |
publishedAt |
string | Published at |
rating |
number | Average customer rating (product pages) |
reviewsCount |
integer | Number of customer reviews (product pages) |
dataSource |
string | products.json (standard feed) or product pages (headless stores) |
Export as JSON, CSV, Excel, XML or HTML, or read it through the API.
💰 Pricing — pay per product
| What you run | Products | Cost (free plan) |
|---|---|---|
| 1 store, 300 products | 300 | $0.24 |
| 10 competitor stores × 500 | 5,000 | $4.00 |
| Daily sale tracking, 3 collections × 100 | 9,000/month | $7.20/month |
Higher Apify plans pay less: $0.0007 (Bronze), $0.0006 (Silver), $0.0005 (Gold and above). Platform usage and proxies are included. Non-Shopify sites and empty stores are never charged.
🔌 API & integrations
Python
from apify_client import ApifyClient # pip install "apify-client>=3"
client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("victorrodi/shopify-products-scraper-api").call(
run_input={"storeUrls": ["https://www.allbirds.com"], "onlyOnSale": True}
)
for p in client.dataset(run.default_dataset_id).iterate_items():
print(p["discountPercent"], p["price"], p["title"])
cURL
curl -X POST "https://api.apify.com/v2/acts/victorrodi~shopify-products-scraper-api/run-sync-get-dataset-items" \
-H "Authorization: Bearer $APIFY_TOKEN" -H "Content-Type: application/json" \
-d '{"storeUrls": ["colourpop.com"], "maxProductsPerStore": 50}'
Works with Google Sheets, Make, Zapier, n8n and MCP / AI agents: “List every discounted product of these 5 Shopify stores, sorted by discount.”
🤖 Use it from AI agents (Claude, ChatGPT, Cursor…)
This Actor is available to AI assistants through the Apify MCP server. Add the server to Claude Desktop, Claude Code, Cursor or any MCP client, then simply ask:
“List every discounted product of allbirds.com sorted by discount.”
“Compare the price range of these 5 Shopify stores and tell me which one is cheapest.”
The clean, flat output is designed to be read directly by LLMs.
🛡️ Reliability
- Requests are paced and retried with a new IP and exponential backoff.
- If the site keeps blocking, the Actor switches to residential IPs automatically.
- One failing item never stops the run, and you are never charged for it.
- Every run writes a
RUN_SUMMARYrecord (results, failures, retries, blocks). - Measured on real runs: 858 products from 3 standard stores in 20 seconds; 1,000 Fashion Nova products (headless) in 6 minutes with 0 blocks.
More examples and docs for all our Actors: Vicshock/trendpulse-scrapers.
📌 Tips
- Schedule a daily run and compare
price/availablebetween runs to detect price drops and restocks. - Use a collection URL to scrape only one category or the sale section.
discountPercentis the biggest discount among the product’s variants.
❓ FAQ
How do I know if a site is a Shopify store? Just add it: if it does not expose Shopify product data, it is listed under notShopify in the run summary and nothing is charged.
What about big brands with a custom (headless) front end? They hide the standard Shopify product feed, so the Actor reads their sitemap and product pages instead (dataSource: "product pages"). You get prices, stock, SKUs, sizes, colors and customer ratings; compare-at prices and tags are not shown on those pages, and collections of headless stores are not supported. It takes about 1 second per product instead of 250 products per request.
Do I get stock quantities? Shopify publicly shows whether each variant is available, not the exact quantity.
Is it legal? The Actor reads public product data that the stores publish for browsers, with no personal data. Respect each site’s terms and the laws that apply to you.
💬 Support
Missing a field or a store that does not work? Open an issue in the Issues tab — it is answered fast.