Shopify Store Scraper: Products, Prices & Stock
Pricing
from $0.60 / 1,000 products
Shopify Store Scraper: Products, Prices & Stock
Scrape every product and variant from any Shopify store: prices by country, stock, sales estimates, best-seller rank, store apps, cross-store comparison and changes-only competitor monitoring. From $0.80 per 1,000 products; compact JSON for AI agents.
Pricing
from $0.60 / 1,000 products
Rating
0.0
(0)
Developer
CleanPull
Maintained by CommunityActor stats
0
Bookmarked
3
Total users
2
Monthly active users
17 hours ago
Last modified
Categories
Share
Get every product and variant from any Shopify store: prices, compare-at prices and discounts, availability, SKUs, options, images, tags, vendors and dates. Go further than a catalogue: exact stock and estimated sales per day (where the store publishes stock), the store's own best-seller rank, prices in other countries and currencies, a store summary with the apps it runs, cross-store price comparison, and a changes-only monitoring mode for new products, price moves, discounts, sell-outs and restocks. Fast HTTP requests to Shopify's public storefront data, no browser, from $0.80 per 1,000 products.
What you can do with it
- Copy a catalogue: "Every product and variant from gymshark.com, as one row per variant for a spreadsheet."
- Watch competitors: schedule daily runs with
monitorModeand get only what changed: new products, price drops and rises, discounts starting or ending, items selling out or coming back, sizes restocking. - See what sells: turn on
includeStockand run daily. Where a store publishes stock, each run gives units sold since the last run, sales per day and days of stock left per variant, andbestSellerRankshows the store's own best-selling order. - Compare international pricing:
markets: ["GB", "DE", "CA"]gives each product's price in those countries and currencies, for stores that sell abroad with Shopify Markets. - Profile a store:
storeSummaryreturns catalogue size, price range and median, share on sale, new products in the last 7 and 30 days, top vendors and product types, the theme, the apps it runs (reviews, email and SMS, subscriptions, loyalty, payments, support, analytics…) and its social profiles. - Find the cheapest seller: list several stores with
compareAcrossStoresand get every product they share (matched by SKU, else by title) with the cheapest store and the price spread. - Feed an AI agent or a sheet: choose only the fields you need, or get flat rows.
Why this actor
- More than products.json. Stock and sales estimates, best-seller rank, prices by market, store analytics with app detection, cross-store comparison and change monitoring, in one actor and one run.
- Works on more stores. Stores that redirect to
www, use locale paths, or run a headless front are found through their Shopify address. A store that blocks its product feed is read through its sitemap and product pages instead. A site that is not Shopify is reported, not returned empty. - Pay for what you use. Products are $0.80 per 1,000; stock, market prices and store summaries are add-ons billed only when switched on and only where the store gives the data (no charge for hidden stock or a product not sold in a market); unchanged products in monitoring cost $0.15 per 1,000 (plus $0.50 when stock tracking is on).
- Compatible input.
domains,maxProducts,includeInventoryDetailsandstartUrls(as strings or{ "url": … }) from other Shopify actors work as they are. - Honest data. Stock is reported only where the store publishes it (null otherwise, never a guess), a compare-at price of 0 means no discount, and a product not sold in a market has a null price there.
Input
| Field | Type | What it does |
|---|---|---|
stores | array of domains or URLs | Stores to read in full (up to maxProductsPerStore) |
startUrls | array of URLs | Collection pages (only that collection) or product pages (only that product) |
maxProductsPerStore | integer | Products per store (default 1,000; up to 25,000) |
maxItems | integer | Stop after this many records in the run. In monitoring mode, unchanged products checked are billed in bulk and not capped by it |
minPrice, maxPrice | numbers | Price range |
inStockOnly, onSaleOnly | boolean | Only available products / only discounted products |
vendors, productTypes, tags, keywords | arrays | Filters by vendor, type, any tag, or title words |
publishedWithinDays | integer | New arrivals only |
includeStock | boolean | Exact stock per variant (where published) and, from the second run, units sold, sales per day, days of stock left |
markets | array of country codes | Prices in those countries and their currencies (GB, DE, CA, AU…) |
bestSellerRank, bestSellerDepth | boolean, integer | The store's best-selling order, with movement since the last run |
storeSummary | boolean | One store record: catalogue analytics, theme, apps, social profiles, top sellers |
compareAcrossStores | boolean | The same product across stores, cheapest store and spread |
monitorMode, monitorName | boolean, string | Changes only, compared with the last run under the same name |
changeTypes | array | new-product, removed-product, price-drop, price-rise, discount-started, discount-ended, sold-out, back-in-stock, variants-changed, best-seller-move |
priceChangePercent, rankChangeMin | numbers | Ignore smaller price or rank moves |
outputFormat | products, variants | One record per product, or one flat row per variant |
includeDescriptionHtml | boolean | Also return description HTML (text is always included) |
fields | array of strings | Return only these fields (dotted paths reach into lists) |
Example inputs
A full catalogue as spreadsheet rows:
{ "stores": ["gymshark.com"], "outputFormat": "variants" }
A daily competitor watch with sales estimates (schedule it once a day):
{"stores": ["colourpop.com", "allbirds.com"],"monitorMode": true,"monitorName": "beauty-competitors","includeStock": true,"bestSellerRank": true,"changeTypes": ["new-product","price-drop","price-rise","discount-started","sold-out","back-in-stock","best-seller-move"]}
International pricing for one collection:
{"startUrls": ["https://kith.com/collections/footwear"],"markets": ["GB", "DE", "CA", "JP"]}
Output
A product (shortened; a real record from 5 October 2026, run with stock, rank and UK prices):
{"recordType": "product","storeDomain": "colourpop.com","storeName": "ColourPop","currency": "USD","productId": 1495817420882,"title": "Pencil Sharpener","handle": "pencil-sharpener","url": "https://colourpop.com/products/pencil-sharpener","vendor": "ColourPop","productType": "Makeup Tools & Accessories","priceMin": 5,"priceMax": 5,"onSale": false,"available": true,"variantCount": 1,"totalInventory": 3750,"bestSellerRank": 76,"marketPrices": { "GB": { "currency": "GBP", "priceMin": 4, "priceMax": 4 } },"publishedAt": "2026-10-02T11:11:31-07:00","variants": [{"variantId": 12951787864146,"title": "Default Title","sku": "Tool-PencilSharpener","price": 5,"compareAtPrice": null,"available": true,"inventoryQuantity": 3750,"inventoryPolicy": "deny","unitsSoldSinceLastRun": null,"salesPerDay": null,"marketPrices": { "GB": { "price": 4, "compareAtPrice": null, "currency": "GBP" } }}]}
Sales fields fill in from the second run under the same monitorName. In monitoring mode each record also has changeTypes, previousPriceMin, priceChangePercent, variantChanges (price, availability and compare-at changes per variant) and previouslySeenAt.
A store summary (storeSummary, same store, first 120 products read):
{"recordType": "store","storeName": "ColourPop","country": "US","currency": "USD","myshopifyDomain": "colourpop-prd.myshopify.com","productCount": 120,"publishedProductsCount": 1049,"collectionCount": 189,"priceMin": 5,"priceMedian": 15,"priceMax": 159,"inStockShare": 85.8,"newProductsLast7Days": 31,"newProductsLast30Days": 74,"theme": { "name": "Colourpop/Main", "schemaName": "Colourpop", "themeStoreId": null },"apps": [{ "name": "Okendo", "category": "reviews" },{ "name": "Klaviyo", "category": "email-sms" },{ "name": "Attentive", "category": "email-sms" },{ "name": "Gorgias", "category": "support" },{ "name": "Klarna", "category": "payments" }],"socialProfiles": {"instagram": "https://instagram.com/colourpopcosmetics","tiktok": "https://www.tiktok.com/@colourpopco"},"bestSellers": [{ "rank": 1, "productId": 8091207302, "handle": "flexitarian", "title": "Flexitarian" }]}
Comparison records (compareAcrossStores) carry matchKey, matchedBy (sku or title), storeCount, cheapestStore, cheapestPrice, highestPrice, priceSpreadPercent and every store's offer. Every run also writes RUN_SUMMARY to the key-value store: the outcome (COMPLETE, PARTIAL, NO_CHANGES, EMPTY or FAILED), counts, warnings and the reason for any failed store.
Pricing
Pay only for results delivered. Stores that fail are never charged.
| Event | Free and Bronze | Silver | Gold |
|---|---|---|---|
| Product (all its variants) | $0.80 | $0.70 | $0.60 |
| Change (monitoring mode: one changed product) | $1.00 | $0.90 | $0.80 |
| Unchanged product checked (monitoring mode) | $0.15 | $0.13 | $0.12 |
| Stock and sales tracking (add-on per product) | $0.50 | $0.45 | $0.40 |
| Price in another market (add-on per product per country) | $0.30 | $0.27 | $0.24 |
| Store summary (per store) | $3.00 | $2.70 | $2.40 |
| Cross-store comparison group | $1.00 | $0.90 | $0.80 |
Prices are per 1,000; your tier depends on your Apify plan. Each run also has a $0.00005 start fee. The variants output format is billed per product, not per row. The first monitoring run (every product new) is billed at the product price, not the change price. Cross-store comparisons run in catalogue mode only.
How sales estimates work
Shopify stores that track stock often publish the count per variant. Each run records it under your monitorName; the next run reads the drop as units sold (and a rise as a restock), divided by the days between runs. Returns, cancellations and stock moved between warehouses are not visible, so treat it as an estimate. Stores that hide stock get null, never a guess.
Limits
- Only what a Shopify store publishes to every visitor: no orders, revenue or customer data. Stores can hide stock, the best-selling sort or market prices; the fields are then null and the run says so in its warnings.
- Shopify serves up to 25,000 products a store through its product feed.
- Best-seller rank follows the store's own sort over its catalogue (or its default collection, which some stores redirect to).
- Two runs with the same
monitorNameand store at the same time share one memory; schedule them apart. - Monitoring chosen collections or product URLs reports changes to those products, but not products leaving a collection; monitor the whole store for removals.
- A market a store does not sell to separately (same currency as home) is skipped with a warning;
UKis read asGB.
Changelog
- 0.1 (October 2026): catalogues by store, collection or product; filters; stock and sales estimates; best-seller rank; prices by market; store summaries with app detection; cross-store comparison; changes-only monitoring; flat variant rows and field selection.