Shopify Products Scraper: Prices, Variants & Stock
Pricing
from $0.80 / 1,000 product or variant records
Shopify Products Scraper: Prices, Variants & Stock
Scrape every product from any Shopify store: prices, sale prices, variants, SKUs, stock, images, tags and vendor, via the public products.json feed. Whole store or one collection. Tracks price and stock changes between runs. Fast, no browser, no login.
Pricing
from $0.80 / 1,000 product or variant records
Rating
0.0
(0)
Developer
Lantern Lane Data
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
16 days ago
Last modified
Categories
Share
Shopify Products Scraper: prices, variants, SKUs & stock from any Shopify store
🛍️ What is the Shopify Products Scraper?
Export every product from any Shopify store into a clean dataset: title, vendor, product type, tags, price, compare-at (original) price, discount %, variants, SKUs, stock status, images, description and dates. Paste store domains (or collection URLs) and get results in seconds.
It reads the store's public products.json storefront feed, the same JSON every Shopify store serves to browsers and apps. No browser, no login, no captcha, and usually no proxy, so it's fast and very cheap to run.
Schedule it and it becomes a competitor price & stock monitor: it remembers the last run and flags isNew, priceChanged (with previousPrice) and availabilityChanged, and can output only what changed.
- ✅ Any public Shopify store:
allbirds.com,colourpop.com,gymshark.com... - ✅ Whole store or just one collection (
https://store.com/collections/sale) - ✅ One row per product (variants nested) or per variant / SKU (flat, CSV-friendly)
- ✅ Prices, compare-at prices,
onSale,discountPercent, in-stock flags per variant - ✅ Price & stock change tracking between runs, plus an "only changes" mode for alerts
- ✅ Filters: keywords, product types, vendors, in-stock only, on-sale only, price range, updated since
- ✅ Respects each store's robots.txt (stores that disallow the feed are skipped)
- ✅ Up to 25,000 products per store, ~250 products per request
🎯 What can I use it for?
- Competitor price monitoring: track competitors' prices, discounts and sell-outs daily.
- Dropshipping & product research: find best-sellers, new arrivals, price points and vendors in a niche.
- Catalogue migration & backups: export a store's catalogue (titles, images, variants, SKUs) to CSV/Excel.
- Market research: compare assortments and pricing across many DTC brands.
- Deal & sale alerts: run hourly with Only discounted products + Only new / changed items.
- AI agents & apps: predictable JSON via the Apify API, integrations or MCP.
⬇️ Input
| Field | Description |
|---|---|
storeUrls (required) | Store domains or URLs. A /collections/<handle> URL limits the run to that collection. |
outputLevel | product (default, variants nested) or variant (one flat row per variant/SKU). |
keywords | Keep products whose title, type, vendor or tags contain any of these. |
productTypes / vendors | Exact product types / vendors to keep. |
onlyAvailable / onlyOnSale | Only in-stock / only discounted items. |
minPrice / maxPrice | Price range in the store's currency. |
updatedSince | 2026-10-01 or 7 days. |
maxProductsPerStore | Products read per store (default 1,000; 0 = all). |
maxResults | Overall cap on output records (also caps cost). |
includeDescription | Plain-text description (default on). |
trackChanges / onlyChanges | Change tracking (default on) / output only new or changed items. |
stateStoreName | Named store for tracking; use one per monitor. |
Example input
{"storeUrls": ["allbirds.com", "https://colourpop.com/collections/lips"],"outputLevel": "variant","onlyOnSale": true,"maxProductsPerStore": 0}
⬆️ Output
Product mode (shortened):
{"id": "allbirds.com-7340901859408","storeName": "Allbirds","title": "Women's Allbirds Flip Flop - Dusty Pink","url": "https://allbirds.com/products/womens-allbirds-flip-flop-dusty-pink","vendor": "Allbirds","productType": "Shoes","currency": "USD","price": 25.0,"priceMax": 25.0,"compareAtPrice": 50.0,"onSale": true,"discountPercent": 50.0,"available": true,"variantCount": 7,"availableVariantCount": 3,"imageUrl": "https://cdn.shopify.com/s/files/1/1104/4168/files/A12513_26Q2_Allbirds-Flip-Flop-Dusty-Pink_PDP_LEFT.png","variants": [{"variantId": "42146889039952", "title": "5", "sku": "A12513W050", "price": 25.0, "compareAtPrice": 50.0, "available": false}],"isNew": false,"priceChanged": true,"previousPrice": 30.0,"availabilityChanged": false}
Variant mode adds variantId, variantTitle, sku, option1-3, grams and gives each variant its own price, sale and stock flags. See sample_output.json for full records. Console views: Overview (with images) and Price & stock changes.
RUN_SUMMARY in the default key-value store lists products read, records output and any error per store.
💰 How much does it cost?
Free until 22 October 2026. From then on it uses pay-per-event pricing: $0.80 per 1,000 products or variants (product-result, $0.0008 each) plus Apify's standard $0.00005 Actor start fee. Platform usage is included. Use the maximum-items limits or the run's maximum cost setting to cap spending.
⚠️ Notes & limits
- Works with stores running Shopify's standard storefront. Headless stores that disable the public feed, password-protected stores, and stores whose robots.txt disallows
products.jsonare reported inRUN_SUMMARYand skipped. - The feed doesn't include inventory quantities, only in-stock yes/no per variant.
- Currency is the store's default currency.
- Product data only: no customer or personal data is read or returned.
🔌 Use it via API, Python or integrations
Run it from the Apify Console, on a schedule, or from code with the Apify API, the Python or JavaScript apify-client, or MCP. Connect results to Google Sheets, Slack, Zapier, Make, n8n or a webhook from the Integrations tab.
from apify_client import ApifyClientclient = ApifyClient("<YOUR_APIFY_TOKEN>")run = client.actor("lanternlane-data/shopify-store-products-scraper").call(run_input={"storeUrls": ["allbirds.com", "https://colourpop.com/collections/lips"], "outputLevel": "product"})for item in client.dataset(run["defaultDatasetId"]).iterate_items():print(item)
❓ FAQ
How do I know if a site is on Shopify? Just add it. If it isn't (or the feed is disabled) the run tells you in RUN_SUMMARY.
How do I monitor prices? Use outputLevel: variant, keep trackChanges on, turn on onlyChanges, and schedule the Actor daily. Connect Slack, e-mail or a webhook integration to get alerts.
Can I scrape only a collection? Yes, paste the collection URL, e.g. https://colourpop.com/collections/lips.
Something broke? Open an issue on the Issues tab and we'll fix it fast.
🏮 More from Lantern Lane Data
Jobs & hiring data is our focus: job postings straight from employers' applicant tracking systems and official public feeds, in one consistent schema. More ATS platforms and hiring-signal tools are on the way.
- 💼 ATS Jobs Scraper: Every open job from 7 ATS platforms (Greenhouse, Lever, Ashby, Workday, SmartRecruiters, Workable, Recruitee) in one schema, with new and closed job alerts.
- 🌍 Remote Jobs Scraper: Remote jobs from 7 boards via their official public feeds, deduplicated, with salary and location filters.
Other tools
- 🗺️ Sitemap URL Extractor: Every URL from any website's XML sitemaps, with lastmod, hreflang and new-page alerts.
- 🔦 AI Brand Visibility Tracker: How often ChatGPT, Perplexity, Gemini and Claude mention, rank and cite your brand vs competitors.
Made by Lantern Lane Data. Not affiliated with Shopify Inc. or any store.