Shopify Store Products Scraper — Prices, Variants, Stock avatar

Shopify Store Products Scraper — Prices, Variants, Stock

Pricing

from $1.00 / 1,000 products

Go to Apify Store
Shopify Store Products Scraper — Prices, Variants, Stock

Shopify Store Products Scraper — Prices, Variants, Stock

Scrape products from any Shopify store: titles, prices, compare-at (sale) prices, variants, SKUs, stock status, vendors, tags, images and descriptions. Whole catalog or chosen collections. Product or per-variant rows for competitor price monitoring.

Pricing

from $1.00 / 1,000 products

Rating

0.0

(0)

Developer

Rasa Reka

Rasa Reka

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

a day ago

Last modified

Categories

Features

Limited permissions

Share

Scrape every product from any Shopify store in minutes: titles, prices, sale (compare-at) prices, all variants with SKU and stock status, vendors, tags, images and clean descriptions. Paste store URLs, get a ready-to-use product catalog for competitor price monitoring, product research and dropshipping.

No login, no API key, no proxies. The Actor reads the public product feed that Shopify stores serve to browsers (/products.json), so the data matches what shoppers see on the storefront.

What you get

  • 🏪 Store domain and store name, currency
  • 🏷️ Product id, title, handle, product URL, vendor (brand), product type, tags
  • 💲 Lowest price, highest price, compare-at price, on-sale flag and in-stock flag
  • 🎨 All variants (size, colour...) with id, title, SKU, price, compare-at price, availability, option values and weight in grams
  • 🖼️ All image URLs and the main image
  • 📝 Description as clean plain text (HTML removed), optional
  • 📅 Created, updated and published dates (ISO 8601)
  • 📊 Free STORES summary per store: product count, vendor count, price range, average price, % on sale, % in stock

Why this Actor

This Actor
InputStore URL, bare domain (colourpop.com) or any page of the store. Redirects are followed to the main domain
Whole catalog or collectionsBoth. Add collection handles or collection URLs to scrape only those
Output modesProduct (one item per product, variants nested) or Variant (one flat row per variant, ideal for price tracking in a spreadsheet)
Sale detectiononSale is true when any variant's compare-at price is above its price
Store summaryFree STORES record with price range, vendor count, % on sale
Stores that don't workListed in a free FAILED record with the reason, never charged
Login / cookies / proxiesNot needed

Use cases

  • Competitor price monitoring: schedule a daily run in variant mode and track price, compare-at price and stock per SKU over time
  • Product research: see a competitor's full range, which product types and vendors they carry, what is on sale and what is sold out
  • Dropshipping and sourcing: find products, prices and images from niche Shopify stores and import them into your own research sheet
  • Market and brand analysis: compare price ranges and discount depth (% on sale) across many stores in one run
  • Catalog feeds for AI and apps: structured product data with plain-text descriptions, ready for RAG, search or recommendation pipelines

Input example

{
"storeUrls": ["https://www.allbirds.com", "kyliecosmetics.com"],
"collectionHandles": [],
"maxProductsPerStore": 1000,
"outputMode": "product",
"includeDescription": true
}
FieldWhat it does
storeUrlsStore URLs or domains. https://, www. and page paths are optional
collectionHandlesOptional. Only scrape these collections (handle such as mens-shoes or the full collection URL). Empty = whole catalog
maxProductsPerStoreCap per store (default 1000)
outputModeproduct (default) or variant
includeDescriptionAdd descriptionText (default true)

Output example (product mode, real data)

{
"store": "www.allbirds.com",
"storeName": "Allbirds",
"productId": 7366895894608,
"title": "Women's Wool Runner - Natural Grey (Light Grey Sole)",
"handle": "womens-wool-runners-natural-grey",
"url": "https://www.allbirds.com/products/womens-wool-runners-natural-grey",
"vendor": "Allbirds",
"productType": "Shoes",
"tags": [
"allbirds::gender => womens",
"allbirds::material => wool",
"bfcm-womens",
"FINAL SALE"
],
"createdAt": "2026-05-26T18:10:21.000Z",
"updatedAt": "2026-11-07T01:47:43.000Z",
"publishedAt": "2026-09-25T23:24:03.000Z",
"price": 49,
"maxPrice": 49,
"compareAtPrice": 110,
"onSale": true,
"available": true,
"currency": "USD",
"variantsCount": 7,
"variants": [
{
"id": 42424464900176,
"title": "5",
"sku": "WR3WNCW050",
"price": 49,
"compareAtPrice": 110,
"available": true,
"option1": "5",
"option2": null,
"option3": null,
"grams": 698
},
{
"id": 42424464932944,
"title": "6",
"sku": "WR3WNCW060",
"price": 49,
"compareAtPrice": 110,
"available": false,
"option1": "6",
"option2": null,
"option3": null,
"grams": 714
}
],
"options": [
{
"name": "Size",
"values": [
"5",
"6",
"7",
"8",
"9",
"10",
"11"
]
}
],
"images": [
"https://cdn.shopify.com/s/files/1/1104/4168/files/WR3WNCW_SHOE_LEFT_GLOBAL_WOMENS_WOOL_RUNNER_GREY_LIGHT_GREY_bc7cc3a6-43a0-4dde-8f9e-48a8d80499df.png?v=1779819025",
"https://cdn.shopify.com/s/files/1/1104/4168/files/WR3WNCW_SHOE_BACK_GLOBAL_WOMENS_WOOL_RUNNER_GREY_LIGHT_GREY_0e004c82-37f9-43cb-aea0-2adb950bf655.png?v=1779819025"
],
"mainImage": "https://cdn.shopify.com/s/files/1/1104/4168/files/WR3WNCW_SHOE_LEFT_GLOBAL_WOMENS_WOOL_RUNNER_GREY_LIGHT_GREY_bc7cc3a6-43a0-4dde-8f9e-48a8d80499df.png?v=1779819025",
"descriptionText": "The Allbirds Wool Runner is the original wool sneaker that started it all. Called the world's most comfortable shoe, it's flexible, supportive, astonishingly soft, and machine washable. The Wool Runner is breathable, lightweight, and can be worn sockless. Best used for walking, cooler weather, and everyday casual wear.",
"scrapedAt": "2026-11-07T01:47:42.128Z"
}

Shortened for the README: this product really has 7 variants, 4 images and 22 tags. options lists the option names and values; variants holds every size/colour with its own price, SKU and stock flag.

Output example (variant mode, real data)

{
"store": "www.allbirds.com",
"storeName": "Allbirds",
"productId": 7292464824400,
"variantId": 41990816137296,
"title": "Women's Wool Cruiser - Port (Port Sole)",
"variantTitle": "5",
"handle": "womens-wool-cruiser-port-port-sole",
"url": "https://www.allbirds.com/products/womens-wool-cruiser-port-port-sole?variant=41990816137296",
"vendor": "Allbirds",
"productType": null,
"tags": [
"11/3/26 DROP",
"allbirds::cfId => color-f67ac276729fd74d9edd3ad836f79a7e",
"allbirds::hue => red"
],
"sku": "A12858W050",
"price": 120,
"compareAtPrice": null,
"onSale": false,
"available": false,
"currency": "USD",
"option1": "5",
"option2": null,
"option3": null,
"grams": 1000,
"image": "https://cdn.shopify.com/s/files/1/1104/4168/files/A12858W090-PORT_SIDE_TRANSPARENT.png?v=1793836076",
"createdAt": "2026-02-05T01:37:18.000Z",
"updatedAt": "2026-11-07T01:48:15.000Z",
"publishedAt": "2026-11-04T23:48:27.000Z",
"scrapedAt": "2026-11-07T01:48:13.591Z"
}

(Tags shortened.) url links straight to that variant. Fields a store does not fill are null.

Export to JSON, CSV, Excel, or connect to Google Sheets, Make, Zapier, n8n or your own code through the Apify API.

Free STORES and FAILED records

Open the run's Storage → Key-value store:

  • STORES: one entry per store with the store name, currency, products and variants saved, vendor count and top vendors, min / max / average price, % of products on sale and % in stock.
  • FAILED: stores (or collections) that could not be scraped, with the reason, for example store does not expose public products.json. These are never charged.

Example STORES entry (real data, 300 products scraped from allbirds.com):

{
"input": "allbirds.com",
"store": "www.allbirds.com",
"storeName": "Allbirds",
"currency": "USD",
"country": "US",
"publishedProductsCount": 368,
"publishedCollectionsCount": 1349,
"collections": null,
"productCount": 300,
"variantCount": 3658,
"itemsSaved": 300,
"vendorCount": 2,
"topVendors": [
{
"vendor": "Allbirds",
"products": 299
},
{
"vendor": "re:do",
"products": 1
}
],
"minPrice": 0.8,
"maxPrice": 165,
"avgPrice": 111.53,
"onSalePercent": 3.7,
"availablePercent": 99.3,
"pagesFetched": 2,
"scrapedAt": "2026-11-07T01:47:42.128Z"
}

Pricing

You pay only for results saved to your dataset: one result per product in product mode, or one per variant row in variant mode. Failed stores, the STORES summary and the FAILED record are free. You can set a maximum cost per run in the run options, and the Actor stops cleanly when it is reached.

Limits (please read)

  • Only Shopify stores that expose the public /products.json feed are supported. Most Shopify stores do, but some turn it off or block it (HTTP 404 or 403). Those stores appear in FAILED with the reason store does not expose public products.json and cost nothing. Non-Shopify sites are not supported. If only the www. or only the bare domain serves the feed, the Actor tries both automatically.
  • No inventory quantities. Shopify's public feed only says whether a variant is available (in stock or purchasable), not how many units are left.
  • Prices are in the store's default currency. Market-specific or customer-specific prices, discount codes and B2B prices are not shown.
  • Products hidden from the online store, password-protected stores and draft products are not included.
  • Reviews, ratings and metafields are not part of the public feed.
  • Headless stores (custom frontend on top of Shopify) work when their Shopify domain answers. Product URLs then point to that domain, which usually redirects to the live site.
  • price is the lowest variant price and may be 0 for free gifts or samples that some stores list as products.
  • The Actor waits about 0.5 s between pages to stay polite, so very large stores (10,000+ products) take a few minutes each. Shopify can rate-limit heavy use; the Actor waits and retries automatically.

FAQ

Do I need a Shopify account or API key? No. The Actor uses the same public product feed that the storefront uses.

How do I know if a store will work? Open https://<store>/products.json in your browser. If you see product data, the Actor can scrape it.

Can I track price changes daily? Yes. Create a schedule in Apify with outputMode: "variant" and compare runs by variantId, price, compareAtPrice and available.

Is scraping Shopify stores legal? This Actor reads only publicly published product information and collects no personal data. You are responsible for how you use the data, including each store's terms and copyright on images and descriptions, and privacy laws such as GDPR.

Something broken or a field missing? Open an issue on the Issues tab. We usually reply within 24 hours.