Shopify Products Scraper avatar

Shopify Products Scraper

Pricing

Pay per event

Go to Apify Store
Shopify Products Scraper

Shopify Products Scraper

Scrape products from any Shopify store, collection or product URL: prices, compare-at and sale flag, variants with SKU and availability, optional stock counts and barcodes, images, tags, vendor, currency. Filters and a flat per-variant mode. $0.75 per 1,000 products.

Pricing

Pay per event

Rating

0.0

(0)

Developer

TidyHarvest

TidyHarvest

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

14 hours ago

Last modified

Share

Scrape every product from any Shopify store, on any custom domain: titles, prices, compare-at (sale) prices, variants with SKU and availability, images, options, tags, vendor, product type, descriptions and dates. Add exact stock counts and barcodes when the store exposes them. No login, no API key, no browser: the actor reads the public storefront JSON every Shopify store serves, so it is fast and cheap.

$0.75 per 1,000 products (less on paid Apify plans). Variant mode is billed per product, not per variant, and there is no per-run start fee.

What you get

  • Whole catalogs, collections or single products. Paste a domain (allbirds.com), a collection URL (https://kith.com/collections/footwear) or a product URL. Mix stores in one run.
  • Two output shapes. One row per product with variants nested, or one flat row per variant (size/color) for price monitoring and spreadsheets.
  • Filters before you pay. Keyword, vendor/brand, product type, tag, price range, in stock only, on sale only, updated after a date. Filtered-out products are never charged.
  • Stock counts (optional). Per-variant inventoryQuantity, inventoryPolicy, barcode/GTIN and quantity rules from each product's detail JSON, plus totalInventory per product. Charged only when stock counts were found.
  • Store currency and name from the store's own meta.json, on every row.
  • Clean failure reporting. Non-Shopify sites, password-protected stores, stores that disable products.json and stores whose robots.txt disallows it are skipped and listed in the run status and SUMMARY, while the other stores in the run finish normally.
  • Polite by design. Each store is throttled below Shopify's ~2 requests/second limit, 429s are retried with backoff, and the store's robots.txt is honoured.

Input examples

Whole catalog of two stores, 500 products max:

{ "startUrls": ["allbirds.com", "kith.com"], "maxItems": 500 }

Sale items under $80 from one collection, one row per variant (price monitoring):

{
"startUrls": ["https://www.allbirds.com/collections/mens"],
"outputMode": "variants",
"onSaleOnly": true,
"maxPrice": 80
}

Nike products in stock at a store, with stock counts:

{ "startUrls": ["kith.com"], "vendors": ["Nike"], "inStockOnly": true, "includeInventory": true, "maxItems": 200 }

Daily change tracking: only products updated since yesterday:

{ "startUrls": ["allbirds.com"], "updatedAfter": "2026-10-14" }
FieldWhat it does
startUrlsDomains, store URLs, collection URLs or product URLs, one per line
collectionsCollection handles to scrape on every store (e.g. sale); empty = whole catalog
maxItemsPerStore / maxItemsCaps per store and for the whole run
outputModeproducts (nested variants) or variants (flat)
keywords, vendors, productTypes, tagsText and exact-match filters
minPrice, maxPrice, inStockOnly, onSaleOnlyVariant-level filters (product kept if any variant matches)
updatedAfterKeep products updated on or after a date
includeInventoryAdd stock counts, barcode, inventory policy (one extra request per product)
includeBodyHtmlKeep the raw description HTML (plain text is always included)
proxyConfigurationOptional Apify Proxy for the rare store that blocks requests

Output sample (product mode, trimmed; stock values illustrative)

{
"storeDomain": "www.allbirds.com",
"storeName": "Allbirds",
"productId": 4870548979792,
"handle": "mens-tree-runners",
"url": "https://www.allbirds.com/products/mens-tree-runners",
"title": "Men's Tree Runner - Jet Black (White Sole)",
"vendor": "Allbirds",
"productType": "Shoes",
"tags": ["allbirds::gender => mens", "allbirds::material => tree"],
"description": "The Allbirds Tree Runner is a breathable and lightweight sneaker ...",
"descriptionHtml": "<p>The Allbirds Tree Runner is ...</p>",
"createdAt": "2021-01-29T13:57:15-08:00",
"updatedAt": "2026-10-15T16:56:06-07:00",
"publishedAt": "2026-09-25T16:57:46-07:00",
"currency": "USD",
"minPrice": 100.0,
"maxPrice": 100.0,
"compareAtMinPrice": null,
"onSale": false,
"available": true,
"variantCount": 7,
"totalInventory": 412,
"imageUrl": "https://cdn.shopify.com/s/files/1/1104/4168/products/....png",
"images": [{ "src": "https://cdn.shopify.com/...", "alt": null, "width": 4000, "height": 4000, "variantIds": [] }],
"options": [{ "name": "Size", "values": ["8", "9", "10", "11", "12", "13", "14"] }],
"variants": [{
"variantId": 33179624669264, "title": "8", "sku": "TR3MJBW080", "price": 100.0, "compareAtPrice": null,
"onSale": false, "available": true, "option1": "8", "grams": 680, "barcode": "194966057063",
"inventoryQuantity": 61, "inventoryPolicy": "deny",
"url": "https://www.allbirds.com/products/mens-tree-runners?variant=33179624669264"
}]
}

In variant mode each row carries the product fields plus the variant's own variantId, variantTitle, sku, price, compareAtPrice, onSale, available, option1..3, optionNames, stock fields and a variant url. totalInventory, inventoryQuantity and barcode are filled only when the store exposes them (with includeInventory on, or when the store's product JSON already includes them).

A SUMMARY record in the run's key-value store lists, per store, the store name, currency, published product count, products scanned and returned, requests made, and every skipped store with the reason (not_shopify, password_protected, products_json_disabled, robots_disallowed, blocked, unreachable).

Pricing

EventPrice (FREE plan)Paid plans
Product scraped$0.00075 ($0.75 / 1,000)down to $0.60 / 1,000
Inventory enriched (optional)$0.0005 ($0.50 / 1,000)down to $0.40 / 1,000

No start fee. In variant mode you pay per product, so a shoe with 13 sizes costs one product.

Limits and notes

  • Works only on Shopify stores that leave the standard public products.json on (the vast majority). Headless storefronts that turn it off are reported, not charged.
  • Shopify's storefront lists only published products; draft and hidden products are not visible to anyone.
  • Speed is ~250 products per request at about 1.6 requests/second per store, roughly 20,000 products a minute per store; several stores run in parallel. Inventory enrichment adds one request per product (about 100 products a minute per store).
  • Prices are in the store's default currency.
  • Only public catalog data is read. No customer, order or checkout data is touched.