Shopify Products Scraper: Prices, Variants & Stock avatar

Shopify Products Scraper: Prices, Variants & Stock

Pricing

from $0.80 / 1,000 product or variant records

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

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

Lantern Lane Data

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

16 days ago

Last modified

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

FieldDescription
storeUrls (required)Store domains or URLs. A /collections/<handle> URL limits the run to that collection.
outputLevelproduct (default, variants nested) or variant (one flat row per variant/SKU).
keywordsKeep products whose title, type, vendor or tags contain any of these.
productTypes / vendorsExact product types / vendors to keep.
onlyAvailable / onlyOnSaleOnly in-stock / only discounted items.
minPrice / maxPricePrice range in the store's currency.
updatedSince2026-10-01 or 7 days.
maxProductsPerStoreProducts read per store (default 1,000; 0 = all).
maxResultsOverall cap on output records (also caps cost).
includeDescriptionPlain-text description (default on).
trackChanges / onlyChangesChange tracking (default on) / output only new or changed items.
stateStoreNameNamed 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.json are reported in RUN_SUMMARY and 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 ApifyClient
client = 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.