Shopify Products Scraper: Prices, Variants, SKUs & Stock avatar

Shopify Products Scraper: Prices, Variants, SKUs & Stock

Pricing

$1.00 / 1,000 product returneds

Go to Apify Store
Shopify Products Scraper: Prices, Variants, SKUs & Stock

Shopify Products Scraper: Prices, Variants, SKUs & Stock

Export any Shopify store's public catalog as one row per variant: price, compare-at price, SKU, stock, options, images and description, with collection and keyword filters. $1 per 1,000 products, variants included.

Pricing

$1.00 / 1,000 product returneds

Rating

0.0

(0)

Developer

Changefeeds Tools

Changefeeds Tools

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

11 hours ago

Last modified

Share

  • What you get: a Shopify store's public catalog as rows: one per variant (or per product) with price, compare-at price, SKU, in-stock flag, options, weight, images, tags and description.
  • Use it for: competitor catalog pulls, repricing, spreadsheets and BI feeds. Filter by collection or keyword. Reads only the public products.json every Shopify store serves; no login.
  • Price: $1 per 1,000 products, however many variants each has. Failed stores are free.

Sample output

The prefilled input (https://www.allbirds.com, first 30 products), run on 2026-10-23, returned 361 variant rows for 30 products plus one free store row. One line per product for the first five:

titlevariantsfirst SKUpricecompare_at_pricevariants in stock
Women's Allbirds Flip Flop - Dusty Pink7A12513W05025501 of 7
Men's Canvas Runner NZ - Deep Navy Stripes (Blizzard Sole)13A12498M080100null5 of 13
Women's Canvas Runner NZ - Deep Navy Stripes (Blizzard Sole)13A12500W050100null7 of 13
Men's Cruiser Terry - Warm White (Warm White Sole)13A12374M080115null3 of 13
Men's Cruiser Slip On - Natural Black (Blizzard Sole)13A12642M080100null5 of 13

The first variant row in full (tags, image and body_text shortened):

{
"type": "variant",
"store": "www.allbirds.com",
"product_id": "7340901859408",
"handle": "womens-allbirds-flip-flop-dusty-pink",
"title": "Women's Allbirds Flip Flop - Dusty Pink",
"vendor": "Allbirds",
"product_type": "Shoes",
"tags": ["allbirds::carbon-score => undefined", "allbirds::cfId => color-a4d5d0f6620dc304306f503bf67bc5f9", "…"],
"created_at": "2026-03-27T14:03:50-07:00",
"updated_at": "2026-10-22T20:56:55-07:00",
"published_at": "2026-09-25T16:58:13-07:00",
"url": "https://www.allbirds.com/products/womens-allbirds-flip-flop-dusty-pink",
"image": ["https://cdn.shopify.com/s/files/1/1104/4168/files/A12513_26Q2_Allbirds-Flip-Flop-Dusty-Pink_PDP_LEFT.png?v=1774646345", "…"],
"body_text": "Sun on your feet. Comfort underneath. Light, easy, and made for warm weather, these flip flops bring everyday comfort to…",
"variant_id": "42146889039952",
"variant_title": "5",
"sku": "A12513W050",
"price": 25,
"compare_at_price": 50,
"available": false,
"option1": "5",
"option2": null,
"option3": null,
"grams": 455,
"requires_shipping": true
}

And the free store row that closes every store's run:

{
"type": "store",
"store": "www.allbirds.com",
"status": "ok",
"products_found": 30,
"products_exported": 30,
"variants_exported": 361,
"truncated": true,
"truncation_reason": "max_products",
"collection": null,
"error_code": null,
"error_message": null,
"note": "Stopped at maxProductsPerStore (30).",
"run_at": "2026-10-23T03:56:55.016Z"
}

How to run in 30 seconds

  1. Click Try for free. The input already holds https://www.allbirds.com and a 30-product cap.
  2. Click Start. Our test run of that input took 17 seconds and cost $0.03 (30 products, 361 variant rows).
  3. Open the Output tab, or export the dataset as CSV, JSON or Excel.

For your own store, replace the URL with any Shopify store's home page and raise Max products per store (default 5,000) to get the whole catalog. Untick Include variants for one row per product with a price range.

Pricing

  • $0.001 per product exported ($1 per 1,000). A product is charged once, however many variants it has.
  • Free: products filtered out by keywords, skipped and failed stores, and the store status rows.
  • Set a maximum cost per run and the actor stops fetching when the budget is used up, keeps what it already exported, marks the affected stores truncated, and records stopped_reason: "max_total_charge" in OUTPUT. It never charges past your limit.
  • Examples: 1 store with 1,000 products is $1.00 per run; a full 5,000-product catalog is $5.00 per run.

FAQ

Is this allowed? The actor reads the same public JSON catalog that Shopify serves to every visitor, at about one request per second, and identifies itself in its User-Agent. You are responsible for your own use of the data and for respecting each store's terms.

Why fewer products than the store has? Check the store row:

truncated: true
with truncation_reason: "max_products" means Max products per store cut the run short; raise it. status: "blocked" or "not_shopify" means the store's public catalog could not be read at all.

What currency are the prices in? The store's own default currency, exactly as products.json reports the number. The response does not say which currency it is, so the actor does not guess.

Do you charge per variant? No. One charge per product, whatever its variant count.

Can it tell me what changed since last week? No, every run returns the whole (filtered) catalog. For price drops, restocks and new or removed variants since the last run, use our Shopify Price & Stock Monitor.

Limits

  • Public products.json only. It never logs in, never touches cart or checkout, and collects no personal data.
  • Some stores disable or block products.json. HTTP 403/401 or a hidden catalog is reported as a store row with status: "blocked"; a site that is not Shopify reports not_shopify. There is no workaround, by design.
  • Only products published to the Online Store appear. Hidden, draft and channel-only products are not visible.
  • No sales or inventory counts. Public catalogs carry only in stock / out of stock.
  • Polite, so slower on big catalogs: one request at a time per store, at least 1 second apart, honouring HTTP 429 Retry-After. Up to three stores run in parallel.
  • Descriptions are capped at 5,000 characters of HTML-stripped text (body_text). The original body_html is not returned.

Input reference

{
"storeUrls": ["https://www.allbirds.com"],
"maxProductsPerStore": 5000,
"includeVariants": true,
"collection": "mens",
"keywords": ["runner"]
}
  • storeUrls (required): store base URLs, e.g. https://www.allbirds.com. Paths are ignored.
  • maxProductsPerStore (default 5,000, maximum 50,000): the most products read per store per run (250 per request). Stores with more are marked truncated.
  • includeVariants (default true): one row per variant with price, SKU, stock, options and weight, or false for one row per product with a price_min/price_max range.
  • collection (optional): a collection handle; for https://www.allbirds.com/collections/mens, use mens.
  • keywords (optional): only export products whose title, product_type or tags contain every keyword (case-insensitive substring). Filtered-out products are not charged.

Output reference

  • type: "variant": one per variant: store, product_id, handle, title, vendor, product_type, tags, created_at, updated_at, published_at, url, image (all image URLs), body_text, variant_id, variant_title, sku, price, compare_at_price, available, option1/2/3, grams, requires_shipping.
  • type: "product": one per product (with includeVariants: false): the same product fields plus price_min, price_max, any_available.
  • type: "store": one free status row per store: status (ok, not_shopify, blocked, error), products_found, truncated and any error detail. Every run leaves at least one row, even when every store fails.

Prices are numbers in the store's own currency. The run summary is saved to the default key-value store as OUTPUT, including stopped_reason ("max_total_charge" when the run's maximum charge stopped it early).