Shopify Products Scraper - Any Store Catalogue avatar

Shopify Products Scraper - Any Store Catalogue

Pricing

from $0.40 / 1,000 products

Go to Apify Store
Shopify Products Scraper - Any Store Catalogue

Shopify Products Scraper - Any Store Catalogue

Scrape any Shopify store's public products.json: one row per product or per variant with SKU, price, compare-at price and discount. Weekly changed-only runs charge nothing for unchanged products; on-sale filter is free. No login. $0.40 per 1,000 products; blocked stores are free.

Pricing

from $0.40 / 1,000 products

Rating

0.0

(0)

Developer

Fulox

Fulox

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

3 days ago

Last modified

Share

Read the full product catalogue of any Shopify store from its public products.json, for dropshippers, price-comparison and competitor-research teams: SKU, price, compare-at price, discount, availability, image, tags and timestamps in one typed row per product or per variant.

What you get

  • Pay per product from $0.40 per 1,000, 55% below both Shopify catalogue scrapers with users.
  • One row per variant (rows: "variant") for sheets: every SKU, size and colour on its own line; one charge per product for each 10 variant rows (most products have fewer, so one charge).
  • Changed-only mode (onlyChangedSinceLastRun): a weekly run returns only products updated since your last run, and unchanged products cost nothing.
  • Sale detection: discountPercent on every row from the compare-at price, and onlyOnSale drops full-price products before the charge.

Example output

{
"domain": "allbirds.com",
"productId": 7340901859408,
"handle": "womens-allbirds-flip-flop-dusty-pink",
"title": "Women's Allbirds Flip Flop - Dusty Pink",
"vendor": "Allbirds",
"productType": "Shoes",
"tags": ["loop::returnable => true", "shoprunner"],
"variantId": 42146889039952,
"variantTitle": "5",
"sku": "A12513W050",
"price": 50,
"compareAtPrice": null,
"discountPercent": null,
"available": true,
"variantCount": 7,
"imageUrl": "https://cdn.shopify.com/s/files/1/1104/4168/files/A12513_26Q2_Allbirds-Flip-Flop-Dusty-Pink_PDP_LEFT.png",
"createdAt": "2026-03-27T14:03:50-07:00",
"updatedAt": "2026-10-30T16:57:17-07:00",
"publishedAt": "2026-09-25T16:58:13-07:00",
"url": "https://allbirds.com/products/womens-allbirds-flip-flop-dusty-pink"
}

On a product row, price and compareAtPrice come from the cheapest variant and available is true when any variant is in stock. On a variant row they belong to that variant, and url ends in ?variant=<id>.

How to use it

  1. Paste one or more store domains (for example allbirds.com or https://www.kith.com) and choose how many products per store.
  2. Click Start.
  3. Download the dataset as JSON, CSV or Excel, or connect it to Google Sheets, Make, Zapier or n8n.

Input

FieldWhat it doesDefault
domainsStore domains or URLs, up to 100 per runallbirds.com
maxProductsPerStoreProducts listed per store, 1 to 5,000 (a run reads at most 5,000 in total)500 (25 in the prefilled example)
rowsproduct for one row per product, variant for one row per variantproduct
onlyOnSaleKeep only products with a variant whose compare-at price is above its priceoff
onlyChangedSinceLastRunReturn only products updated after the newest one an earlier run delivered for that storeoff

Pricing

$0.40 per 1,000 products ($0.0004 each). In product mode a product is one charge. In variant mode it is one charge per 10 variant rows or part of them, so a product with 7 variants is one charge and one with 25 variants is three. Stores that fail, are blocked, or return nothing cost nothing, and neither do products dropped by onlyOnSale or changed-only mode. Set a maximum cost per run to stay in control.

Limitations

  • Only stores that publish products.json work. A store that closes it, is password-protected or is not on Shopify returns a free store_failed row with the HTTP status.
  • Some stores sit behind bot protection and refuse requests from data-center addresses. They return a free store_blocked row; this version uses no proxy.
  • Public catalogue data only: no inventory counts, collections, reviews or storefront pages.
  • Changed-only mode needs a named storage on your account. If your account cannot open one, the run stops with a free not_processed row instead of charging for products you have already seen. The reference point is kept per store and per set of settings (onlyOnSale, maxProductsPerStore), so tasks with different settings do not affect each other. It moves forward only for a store whose changed products were all delivered: after a run that stopped early (for example your cost cap), the stores it did not finish are listed again next time, and their products delivered in the stopped run are charged again. Rule: after a delivered run the reference point is the newest updated_at delivered, even if maxProductsPerStore cut the list, so the next run never charges those products again; changed products beyond the cut are not returned later, so set maxProductsPerStore above the number of products that change between runs.
  • Redirects to a different website are not followed (the store fails free); only a redirect to the same host or its www. version is.
  • Prices are read as numbers in the store's own currency; the currency is not in products.json.

FAQ

How fresh is the data? Every run reads the live products.json.

Can I run it every week? Yes. Turn on onlyChangedSinceLastRun and schedule the Actor; each run returns only what changed.

Why is my store missing? Look for a store_blocked or store_failed row in the dataset; its reason says why.

Can I get one row per size and colour? Set rows to variant.

Changelog

  • 2026-10-31: first version.