Shopify Scraper: Any Store's Full Product Catalog avatar

Shopify Scraper: Any Store's Full Product Catalog

Pricing

from $1.40 / 1,000 products

Go to Apify Store
Shopify Scraper: Any Store's Full Product Catalog

Shopify Scraper: Any Store's Full Product Catalog

Export the complete catalog of any Shopify store: every product and variant with price, compare-at price, live discount, SKU, stock status, images, tags, vendor and description. Filter by keyword, vendor, type, price range, in-stock or on-sale. Official Shopify endpoint, no key.

Pricing

from $1.40 / 1,000 products

Rating

0.0

(0)

Developer

Daniel Meshulam

Daniel Meshulam

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

a day ago

Last modified

Share

Export the complete catalog of any Shopify store: every product, every variant, with live prices and stock.

Uses the /products.json endpoint Shopify publishes on every storefront. No key, no login, no headless browser, nothing rendered by JavaScript.

One row per variant

A shirt in 4 sizes is 4 sellable SKUs: 4 prices, 4 stock states. That's what you get by default, because "is the medium in stock at $39?" is the question people are actually asking.

Set oneRowPerProduct: true to collapse to one row per product with priceMin / priceMax instead.

What you get

FieldExample
title, variantTitle, skuMen's Cruiser, 10, A12856M080
price, compareAtPrice105.00, 140.00
onSale, discountPercenttrue, 25.0
inStocktrue
vendor, productType, tagsAllbirds, Shoes, […]
option1/2/3, optionsBlue, 10 · ["Color","Size"]
url, image, variantImage, imageCount
descriptionplain text, HTML stripped
publishedAt, createdAt, updatedAt
productId, variantId, grams

discountPercent is computed for you, price monitoring shouldn't require arithmetic on your end.

Filters that actually save you money

Everything below filters before billing, and the row cap counts rows kept, not scanned, so a narrow filter never comes back empty just because the first 250 products didn't match.

{
"storeUrls": ["allbirds.com", "gymshark.com"],
"onSaleOnly": true,
"inStockOnly": true,
"minPrice": 20,
"maxPrice": 150,
"keywords": ["shoe", "runner"],
"maxProductsPerStore": 500
}
  • keywords, match on title, type, vendor or tags
  • vendors, productTypes, exact match
  • inStockOnly, onSaleOnly
  • minPrice / maxPrice

Collections

Set includeCollections: true to also get the store's collections with product counts, a fast map of how a competitor organises their catalog.

Who this is for

  • Competitor & price monitoring: schedule it daily, diff the prices, catch every discount the day it launches
  • Dropshippers & resellers: pull a supplier's full catalog with SKUs and stock in one run
  • Market research: how many SKUs, what price bands, what's sold out
  • Affiliate & deal sites: onSaleOnly: true is a ready-made deals feed
  • AI / dataset builders: clean structured product data, no HTML parsing

Pricing

Pay per result. One row = one variant (or one product, or one collection). Stores that fail come back as error rows and are not charged, and neither is anything removed by your filters.

products.json, paged for you

Every Shopify storefront serves its catalogue at /products.json. It needs no key and no app install, because it is the same endpoint the storefront itself reads. The reasons people give up on calling it directly are all handling:

The limitationWhat this does about it
limit is capped at 250 per pagepages automatically, up to 10,000 products per store
page must be walked until emptywalks it, and stops cleanly at the end
No sort, no filter, no search on the endpointfilters after fetch on keyword, vendor, product type, price range, in-stock and on-sale
One row per variant, or one per product?your choice, via oneRowPerProduct
Password-protected stores return HTMLdetected and reported as a named error row, not a parse failure

oneRowPerProduct decides the shape: on, one row per product with priceMin and priceMax across its variants; off, one row per variant with a single price, sku, variantTitle and variantId. Neither is a summary of the other, so pick by what you are loading it into.

/collections.json is available the same way via includeCollections, giving a quick map of how the catalogue is organised with product counts per collection.

Notes

  • If a store isn't on Shopify, or has password-protected its storefront, you get a clear error row saying exactly that, not a raw HTTP code.
  • Shopify caps this endpoint at 250 products per page; the Actor pages automatically up to 10,000 products per store.
  • Prices are in the store's own currency. Shopify does not expose the currency code on this endpoint, so check the store if you're mixing regions.
  • Set a max charge per run in the run options for a hard spend ceiling. The Actor honors it and stops cleanly.