Shopify Product & Price Scraper avatar

Shopify Product & Price Scraper

Pricing

Pay per usage

Go to Apify Store
Shopify Product & Price Scraper

Shopify Product & Price Scraper

Scrape any Shopify store's full catalog — products, variants, prices, compare-at prices, discounts and stock — from the public products.json. No API key.

Pricing

Pay per usage

Rating

0.0

(0)

Developer

Ronak Patel

Ronak Patel

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

19 hours ago

Last modified

Share

Scrape the full product catalog of any Shopify store — every product, variant, price, discount, and stock status — straight from the store's public products.json feed. No API key, no login, no headless browser.

Just paste one or more store domains (e.g. allbirds.com) and get clean, structured data you can export to CSV/Excel/JSON or pull via API.


Why this scraper is different

  • It almost never breaks. It reads the official products.json that Shopify itself serves to every visitor — a stable, documented JSON feed. There's no fragile HTML parsing and no anti-bot cat-and-mouse, so it keeps working when storefront designs change.
  • Built-in discount detection. Every product and variant is tagged with onSale, discountAmount, and discountPercent (calculated from the compare-at price). Perfect for finding deals and tracking competitor promotions.
  • Two output shapes. One row per product (variants nested) for catalog snapshots, or one flat row per variant for price feeds and monitoring.
  • Pay per product — variants are free. You're charged once per product scraped, no matter how many sizes/colors it has.

What you can do with it

  • Competitor price & promo monitoring — schedule daily runs and watch when rivals drop prices or launch sales.
  • Dropshipping & product research — pull entire catalogs to find winning products, vendors, and price points.
  • MAP / pricing compliance — check that resellers honor your minimum advertised price.
  • Market & trend research — analyze assortments, price tiers, and new arrivals across many stores at once.
  • Build product feeds — generate clean variant-level feeds for marketplaces, ads, or internal tools.

Input

FieldTypeDescription
storeUrlsarrayOne or more Shopify store domains or URLs (bare domain, full URL, or even a collection link — only the domain is used). Required.
outputModeselectproduct (one row per product, variants nested) or variant (one flat row per variant). Default product.
maxProductsPerStoreintegerCap products per store. 0 = whole catalog. Default 0.
onlyOnSalebooleanKeep only discounted products/variants. Default false.
onlyAvailablebooleanKeep only in-stock products/variants. Default false.
includeBodyHtmlbooleanInclude each product's raw HTML description. Default false.
maxConcurrencyintegerHow many stores to scrape in parallel. Default 5.
proxyConfigurationobjectOptional Apify Proxy. Usually not needed; enable it if a large store rate-limits you (HTTP 430).

Example input

{
"storeUrls": ["allbirds.com", "https://www.gymshark.com"],
"outputMode": "variant",
"onlyOnSale": true,
"maxProductsPerStore": 0
}

Output

Product mode (one row per product):

{
"store": "allbirds.com",
"productId": 7134115037264,
"title": "Women's Tree Dasher Relay",
"vendor": "Allbirds",
"productType": "Shoes",
"url": "https://allbirds.com/products/womens-tree-dasher-relay-natural-black-twilight-teal",
"price": 67,
"priceMax": 67,
"compareAtPrice": 135,
"onSale": true,
"discountPercent": 50,
"available": false,
"variantCount": 13,
"availableVariantCount": 0,
"tags": ["FINAL SALE"],
"image": "https://cdn.shopify.com/.../left.png",
"images": ["https://cdn.shopify.com/.../left.png", "..."],
"variants": [
{
"variantId": 41016739233872,
"variantTitle": "5",
"sku": "A11465W050",
"options": { "Size": "5" },
"price": 67,
"compareAtPrice": 135,
"onSale": true,
"discountAmount": 68,
"discountPercent": 50,
"available": false,
"grams": 638,
"image": "https://cdn.shopify.com/.../left.png"
}
],
"scrapedAt": "2026-06-28T20:30:00.000Z"
}

Variant mode flattens this to one row per variant (each with its own price, compareAtPrice, onSale, discountPercent, available, sku, and options) — ideal for price tracking and feeds.


Good to know (honest limitations)

  • products.json does not expose a currency code or exact inventory counts. You get prices as numbers and a reliable in-stock available boolean per variant — not "12 left in stock."
  • Only public, published products are returned. Password-protected stores and unpublished/draft products aren't accessible (by design).
  • A small number of stores disable the products.json endpoint. When that happens the actor logs a clear warning and moves on; enabling Apify Proxy resolves most rate-limit cases.

Is this allowed?

Yes. products.json is a public endpoint Shopify serves to every visitor and is widely used for catalog syndication. This actor only reads public catalog data and respects polite request limits. Use the data in line with applicable laws and the target store's terms.


Built with the Apify SDK + got-scraping. Pay-per-event pricing: you're billed per product scraped.