Shopify Store Scraper: Products, Prices & Stock avatar

Shopify Store Scraper: Products, Prices & Stock

Pricing

from $0.60 / 1,000 products

Go to Apify Store
Shopify Store Scraper: Products, Prices & Stock

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

CleanPull

Maintained by Community

Actor stats

0

Bookmarked

3

Total users

2

Monthly active users

17 hours ago

Last modified

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 monitorMode and 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 includeStock and 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, and bestSellerRank shows 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: storeSummary returns 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 compareAcrossStores and 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, includeInventoryDetails and startUrls (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

FieldTypeWhat it does
storesarray of domains or URLsStores to read in full (up to maxProductsPerStore)
startUrlsarray of URLsCollection pages (only that collection) or product pages (only that product)
maxProductsPerStoreintegerProducts per store (default 1,000; up to 25,000)
maxItemsintegerStop after this many records in the run. In monitoring mode, unchanged products checked are billed in bulk and not capped by it
minPrice, maxPricenumbersPrice range
inStockOnly, onSaleOnlybooleanOnly available products / only discounted products
vendors, productTypes, tags, keywordsarraysFilters by vendor, type, any tag, or title words
publishedWithinDaysintegerNew arrivals only
includeStockbooleanExact stock per variant (where published) and, from the second run, units sold, sales per day, days of stock left
marketsarray of country codesPrices in those countries and their currencies (GB, DE, CA, AU…)
bestSellerRank, bestSellerDepthboolean, integerThe store's best-selling order, with movement since the last run
storeSummarybooleanOne store record: catalogue analytics, theme, apps, social profiles, top sellers
compareAcrossStoresbooleanThe same product across stores, cheapest store and spread
monitorMode, monitorNameboolean, stringChanges only, compared with the last run under the same name
changeTypesarraynew-product, removed-product, price-drop, price-rise, discount-started, discount-ended, sold-out, back-in-stock, variants-changed, best-seller-move
priceChangePercent, rankChangeMinnumbersIgnore smaller price or rank moves
outputFormatproducts, variantsOne record per product, or one flat row per variant
includeDescriptionHtmlbooleanAlso return description HTML (text is always included)
fieldsarray of stringsReturn 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.

EventFree and BronzeSilverGold
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 monitorName and 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; UK is read as GB.

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.