Shopify Scraper – Products, Prices, Variants & Stock Monitor
Pricing
Pay per event
Shopify Scraper – Products, Prices, Variants & Stock Monitor
Scrape any Shopify store: all products, variants, SKUs, prices, compare-at (sale) prices, discount %, stock availability, vendor, type, tags, images and description. Store, collection or product URLs. Price & stock change monitor. No login, no proxy.
Pricing
Pay per event
Rating
0.0
(0)
Developer
Scrapeworks HQ
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Share
Shopify Scraper – Products, Prices, Variants & Stock Monitor for Any Shopify Store
Scrape any Shopify store (custom domains included): every product, variant, SKU, price, compare-at (sale) price, discount %, stock availability, vendor, product type, tags, images and description. Point it at a store, a collection or a single product URL. Built-in price & stock change monitor – schedule it and get only what changed. No login, no proxy, no browser.
🚀 Quick start (60 seconds)
- Paste one or more store URLs into Shopify stores, collections or product URLs, e.g.
allbirds.com,https://www.tentree.com/collections/saleorhttps://shop.com/products/some-handle. - Optional: set filters (keywords, vendor, in-stock only, on-sale only, price range) and Max products per store.
- Click Start and export to JSON, CSV, Excel or Google Sheets.
{"startUrls": ["https://www.allbirds.com/collections/mens", "tentree.com"],"onlyOnSale": true,"maxProductsPerStore": 100}
Sample output
{"storeDomain": "www.allbirds.com","productId": 4870548979792,"handle": "mens-tree-runners","title": "Men's Tree Runner - Jet Black (White Sole)","vendor": "Allbirds","productType": "Shoes","currency": "USD","minPrice": 100,"maxPrice": 100,"compareAtPrice": null,"onSale": false,"discountPct": null,"available": true,"variantsCount": 7,"availableVariantsCount": 5,"options": ["Size"],"imageUrl": "https://cdn.shopify.com/...png","url": "https://www.allbirds.com/products/mens-tree-runners","variants": [{ "variantId": 42146889039952, "title": "8", "sku": "TR3MJBW080", "price": 100, "compareAtPrice": null, "available": true }],"publishedAt": "2025-03-01T10:00:00.000Z","updatedAt": "2026-10-21T22:37:55.000Z"}
Why this Shopify product scraper?
- Works on any Shopify store – reads the store's public product feed (
/products.json), so custom domains just work, 250 products per request. - Store, collection or product URLs – scrape a whole catalog, just the
/collections/salepage, or a watchlist of products. - Product or variant rows – one row per product (with min/max price and nested variants) or one row per size/color/SKU with its own price and stock.
- Sale & discount detection –
compareAtPrice,onSale,discountPctcomputed for you. - Price & stock monitor – Monitor mode returns only new/changed products with
previousPriceandpriceChange; unchanged items are free. - Cheapest in class – $0.75 / 1,000 products, 25% below the leading Shopify Actors.
- Fast & polite – plain HTTP, no browser; a 1,000-product store takes a few seconds.
Use cases
- Competitor price monitoring for DTC brands and Shopify merchants – daily price/discount/stock changes per SKU.
- Product research & dropshipping – full catalogs with vendors, types, tags and images.
- Market & assortment analysis – catalog size, price ranges and discount depth across many stores.
- Restock alerts – variant mode + Monitor mode tells you when a size comes back in stock.
- AI / RAG datasets – clean product titles, descriptions and attributes.
Input
| Field | Description |
|---|---|
startUrls | Store domains, collection URLs or product URLs (required). |
keywords / excludeKeywords | Include/exclude by words in title, tags, type, vendor. |
vendors, productTypes | Exact vendor / product type filters. |
onlyAvailable, onlyOnSale | In-stock only; discounted only. |
minPrice, maxPrice | Price range in the store's currency (0 = off). |
outputLevel | product (default) or variant. |
includeDescription | Add description text/HTML (default on). |
maxProductsPerStore, maxResultsTotal | Limits (0 = all). |
monitorMode, monitorKey, outputFormat, summaryWebhookUrl | Monitoring & output options (see below). |
Output
Product rows: storeDomain, storeUrl, productId, handle, title, vendor, productType, tags, currency, minPrice, maxPrice, compareAtPrice, onSale, discountPct, available, variantsCount, availableVariantsCount, options, imageUrl, images, url, descriptionText, descriptionHtml, publishedAt, createdAt, updatedAt, variants[] (variantId, title, sku, price, compareAtPrice, available, option1-3, grams, requiresShipping, imageUrl), scrapedAt.
Variant rows carry the same product fields plus the variant's own variantId, sku, price, compareAtPrice, available and a variant url.
Dataset views: Overview, Variants and Changes. A RUN_STATS record lists stores scraped, blocked or not Shopify.
⭐ Unique: Monitor mode, CSV-ready output & webhook summary
Shopify price tracker in one setting: schedule daily with monitorMode: "changes" and you get only products whose price, compare-at price or stock changed (with previousPrice, priceChange, priceChangePct) plus brand-new products. Unchanged products are free. SUMMARY also counts price drops/rises and products that disappeared.
- Monitor mode (
monitorMode:all|changes|onlyNew, plusmonitorKey) – cross-run dedupe and field-level diffs (changeType,changedFields,changes,firstSeenAt). Skipped items cost $0. - Flat / CSV-ready output (
outputFormat: "flat") – one column per field, perfect for Excel and Google Sheets. - Run summary – a free
SUMMARYrecord in the run's key-value store (linked in the Output tab) and optionally POSTed tosummaryWebhookUrl.
💰 Pricing (pay per result)
| Event | Price |
|---|---|
| Run start | $0.00005 |
| Product (or variant row) | $0.75 / 1,000 |
25% cheaper than the most-used Shopify product Actors ($1.00 / 1,000). Filtered-out, duplicate and monitor-skipped items are never charged; stores that block their feed cost nothing.
Notes & limitations
- Works for stores that expose Shopify's standard public product feed (the vast majority). A few large brands block it (HTTP 403) or are password-protected – these are skipped and logged, not charged.
- Inventory quantities aren't public on Shopify; you get per-variant in-stock true/false.
- Currency is detected from the store; multi-currency stores return their default currency.
Legal & privacy
This Actor reads only public product catalog data that stores publish to every visitor. It does not log in, does not touch checkout, customers or orders and collects no personal data. You are responsible for using the data in line with applicable laws and each store's terms.
🔌 Integrations & API
Works with Zapier, Make, n8n, Google Sheets, Slack, Airbyte, LangChain/LlamaIndex and the Apify MCP server (AI agents).
JavaScript
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: process.env.APIFY_TOKEN });const run = await client.actor('scrapeworkshq/shopify-scraper').call({ startUrls: ['https://www.allbirds.com'], onlyOnSale: true });const { items } = await client.dataset(run.defaultDatasetId).listItems();
Python
from apify_client import ApifyClientclient = ApifyClient('<APIFY_TOKEN>')run = client.actor('scrapeworkshq/shopify-scraper').call(run_input={"startUrls": ["https://www.allbirds.com"], "onlyOnSale": True})items = client.dataset(run['defaultDatasetId']).list_items().items
cURL (sync, returns CSV)
curl -X POST 'https://api.apify.com/v2/acts/scrapeworkshq~shopify-scraper/run-sync-get-dataset-items?token=<APIFY_TOKEN>&format=csv' \-H 'content-type: application/json' -d '{"startUrls": ["tentree.com"], "outputLevel": "variant", "outputFormat": "flat"}'
❓ More FAQ
How do I know if a site is a Shopify store?
Just try it – non-Shopify sites are detected, logged and skipped for free.
Can I scrape only one collection?
Yes, paste the collection URL (https://store.com/collections/<handle>).
How does Monitor mode work?
The Actor remembers the IDs and key fields of items it returned before (in a named key-value store in your account, keyed by monitorKey). Next run, each item gets changeType = new / changed / unchanged plus a changes diff. In Only new / Only new or changed modes, the rest is skipped and not charged.
How do I get a clean CSV / Excel / Google Sheet?
Set Output format → Flat / CSV-ready. Nested objects become dot.columns and lists are joined with |.
How do I limit cost?
Use the max-results inputs and Apify's Maximum cost per run. The Actor stops cleanly when the limit is reached.
Found a bug or need a field? Open an issue on the Issues tab – we usually reply within 24 h.
Changelog
- 2026-10-21 – First release: store/collection/product URLs, product & variant rows, sale detection, Monitor mode, flat output, SUMMARY + webhook.