Skip to content

Shopify Scraper

Try for free

Scrape public Shopify products, variants, prices, images, and collections from a store, a collection, a product page, or a keyword search.

🛍️ Shopify Scraper

Scrape public products, variants, prices, stock status, images and collections from any Shopify store. Point it at a store home page, a collection, a single product, the collections index, or search a store by keyword, and get one structured row per product.

Products cost $0.50 per 1,000, and the optional extras are separate, opt-in events.

✨ Why use Shopify Scraper?

  • 🔓 No login, no API key — it reads the store's public product JSON. Password-protected storefronts are skipped.
  • 🧩 Full variant detail — prices, options, stock status, images, tags, and on product pages barcodes, weights, tax codes and per-size availability.
  • 🗂️ Four ways in — a whole store, a collection, one product URL, or the /collections index.
  • 🔍 Keyword search and price window — search each store, or keep products between a minPrice and maxPrice.
  • 📦 Optional extras — real inventory counts, related products, selling plans and videos, and information panels.
  • 💸 Cheap and predictable — a flat price per product; extras are only billed when you turn them on.

🎯 Use cases

  • 💲 Price monitoring — compare price and stock across a collection over time.
  • 🛒 Competitor catalogs — save a rival's products, variants and tags.
  • 📦 Stock tracking — follow per-size availability and low-stock counts.
  • 🧮 Dropshipping research — gather product titles, images and prices from niche stores.
  • 🗃️ Collection mapping — list the collections a store publishes.

🚀 How to use

  1. Add one or more Store URLs: a home page, a collection, a product page, or a /collections URL.
  2. Set Maximum records (10 by default).
  3. Optionally add a search query, a price window or the extra data options.
  4. Click Start.
  5. Export the dataset to JSON, CSV or Excel, or read it through the API.

📥 Input

FieldTypeDescription
startUrlsarray (required)Store home page, collection URL, product URL or collections index.
querystringSearch each store instead of crawling the URL path.
maxResultsintegerRecords to save. Default 10. 0 means no cap, so set a run charge limit first.
minPrice, maxPricenumberPrice window in store currency (140 means 140.00), applied to the lowest variant.
maxRecommendationsPerProductintegerNest related products. Each is a separate charge.
grabRealInventorybooleanAdd a stock count when the store publishes one.
grabStorefrontDetailbooleanSelling plans and videos on collection and catalog crawls.
grabContentSectionsbooleanInformation panels from the product page, when present.
proxyConfigurationobjectDatacenter by default.
{
  "startUrls": [{ "url": "https://kith.com/collections/kith-tops" }],
  "maxResults": 10
}

To read prices in another currency add ?currency=EUR to the start URL, or use a locale path such as /en-gb/.

📤 Output

One dataset row per product. A /collections URL returns one row per collection instead. Prices are integers in minor units: 199500 means 1995.00 in source.currency.

FieldDescription
sourceStore id, canonical URL, retailer, language, currency and timestamps.
title, brand, categories, tagsProduct identity.
pricecurrent, previous and stockStatus (InStock, OutOfStock, LowInStock).
priceRangemin, max and whether prices vary.
options, variants, mediasOption names, per-variant data and images.
fullyOutOfStockTrue when every variant is out of stock.

Example product (trimmed):

{
  "source": {
    "id": "8286829772928",
    "canonicalUrl": "https://kith.com/products/gm005893u7304",
    "retailer": "Kith",
    "language": "en",
    "currency": "USD"
  },
  "title": "Giorgio Armani & Kith Ivy Wool Crepe Shirt - Stadium",
  "brand": "Kith",
  "categories": ["Button Up Shirts"],
  "price": { "current": 199500, "previous": 0, "stockStatus": "InStock" },
  "priceRange": { "min": 199500, "max": 199500, "varies": false },
  "fullyOutOfStock": false
}

LowInStock appears only when a real count was read and it is from 1 to 5. A collection row looks like this:

{
  "id": "421591943",
  "title": "Summer",
  "handle": "summer",
  "productsCount": 12
}

💰 Pricing

EventPriceWhen it is charged
Product$0.0005Once per product saved ($0.50 per 1,000)
Collection$0.0003Once per collection saved from a /collections URL
Recommended product$0.0003Once per related product nested on a product
Real inventory$0.0003Once per product that includes a published stock count
Information panels$0.0001Once per product with at least one panel

Worked example: 10 products from one collection cost $0.005 in product fees, and about $0.007 in total with compute and storage in our test. A product reached twice in the same run is saved once. Extras are off by default, and a store that does not publish stock counts is not charged for inventory. When a product's extras would go over your maximum charge, the product keeps only the extras the remaining budget pays for (real inventory first, then information panels, then recommended products), is charged for exactly those, and is marked truncatedAtChargeLimit: true; the run then stops.

❓ FAQ

Is it legal to scrape a Shopify store? The actor reads only publicly available product data. You are responsible for using it in line with applicable law and each store's terms.

Do I need a login or my own proxy? No. Datacenter proxies are included; pick residential only if a store refuses datacenter addresses.

What happens on a site that is not Shopify? The run succeeds and saves nothing for that site. The status line says it is not a Shopify store.

Why is the price a large integer? It is in minor units. For US dollars, divide by 100. source.currency names the currency.

Why is there no stock count? Turn on Real inventory counts. Stores that do not publish a number still return in stock or out of stock, and are not charged for a count.

Can I schedule it or use the API? Yes, via schedules or the API.

⚠️ Limits

  • Keyword search uses the store's public suggestion list and returns at most 10 products for each store.
  • Recommended products: Shopify's recommendation feed returns at most 10 per product.
  • Information panels are the disclosure sections on the product page; a theme that does not publish them returns none.
  • Stock counts are never invented, and 3D or AR models are skipped.
  • Password-protected storefronts are skipped.
  • Maximum records is a total for the whole run, not per store. A full 10,000-product catalog took about 22 minutes in testing.
  • updatedUTC and other timestamps follow whatever the store publishes.

Related actors

G2
4.7/5
Excellent
Trustpilot

The internet is full of data.
Start owning yours.

Scrape.ly gives you the infrastructure, the tooling, and the team to extract, process, and operationalize web data at any scale. Setup takes minutes. The advantage lasts forever.

No credit card. No setup calls.