Shopify Products Scraper — Prices, Variants, Stock avatar

Shopify Products Scraper — Prices, Variants, Stock

Pricing

from $0.50 / 1,000 products

Go to Apify Store
Shopify Products Scraper — Prices, Variants, Stock

Shopify Products Scraper — Prices, Variants, Stock

Scrape any Shopify store catalog: products, variant prices, sale prices, SKUs, availability, barcodes and stock counts where the store exposes them. Non-Shopify stores are detected and never charged. Pay per product.

Pricing

from $0.50 / 1,000 products

Rating

0.0

(0)

Developer

architek.earth

architek.earth

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

15 hours ago

Last modified

Categories

Share

Recorded 18 Oct 2026: allbirds.com's first 250 products — 2,720 variants with prices, sale prices, SKUs and availability — in one request. With details on, 5 of 5 products came back with a barcode on every variant and live stock counts.

From Architekture, makers of the AliExpress, Woolworths, Coles, Tesco, Pak'nSave and New World scrapers.

Give it store domains; get every product as clean JSON: title, vendor, type, tags, images, description, and every variant's price, compare-at (sale) price, SKU, options and availability. Each store is checked first: stores that are not Shopify, are walled, or don't answer get one free status row and are never charged. Turn on details for per-variant barcodes and real stock counts where the store exposes them.

🤖 Built for AI workflows. Every row is deterministic, schema-stable JSON — feed it straight to LLM apps, RAG pipelines, or agent tool calls via the Apify API, the Apify MCP server (mcp.apify.com), or AI coding agents like Claude Code and Cursor.

🛍️ Platform📍 Scope📦 Recorded💰 From🔑 Standout fields
Any Shopify storeGlobal250 products -> 2,720 variants in one request$0.50 / 1,000 productsPer-variant barcodes, live stock counts

🚀 Why choose this actor

  • 🎨 One row per product, all variants inside. You pay per product, not per size and colour: a shoe in 13 sizes is one product row with variants[13].
  • 💸 Sale detection built in. onSale, plus compareAtPrice on every discounted variant; minPrice/maxPrice for the price range.
  • 🔬 Stock counts and barcodes. With includeProductDetails, variants carry inventoryQuantity, barcode (GTIN/UPC) and the inventory policy — where the store publishes them.
  • 🆓 Probe-first, never pay for a dead store. Each store gets a status — OK, NOT_SHOPIFY, BLOCKED, UNREACHABLE, PARTIAL, ERROR or DUPLICATE (same store listed twice, e.g. with and without www., scraped once) — in RUN_SUMMARY; stores that could not be scraped also get a free row in the dataset.
  • 🌐 Fixes the www. trap. Some stores only serve their product feed on one host (gymshark.com works, www.gymshark.com is walled); the actor tries the other one automatically.

⚠️ Worth knowing up front

  • 🆓 Shopify stores only. Some large brands run a custom ("headless") storefront that switches the product feed off (e.g. ruggable.com in our tests) — those come back NOT_SHOPIFY, free. In our 12-store check, 8 served their product feed.
  • 💸 Some stores rate-limit or wall bots. They come back BLOCKED with the reason (e.g. "rate limited by the store after retries"). Not charged.
  • 📊 Stock counts only where the store exposes them. Many stores hide quantities; then you still get available per variant but no inventoryQuantity.
  • ⭐ No reviews. Reviews live in third-party apps (Judge.me, Yotpo, Loox), not in Shopify's product feed.
  • 🛑 25,000 products per store at most — Shopify's own page limit. RUN_SUMMARY warns when a store hits it.
  • 💸 Prices are in the store's currency (currency, from the store's own settings), as shown to visitors from the actor's location.

⚡ Try the example

{
"storeUrls": ["allbirds.com", "deathwishcoffee.com"],
"maxProductsPerStore": 100
}

⚙️ Input parameters

ParameterTypeDefaultDescription
storeUrlsarray of stringsrequiredStore domains or URLs. A collection URL (https://store.com/collections/sale) scrapes only that collection. Up to 200 stores.
collectionsarray of strings—Collection handles to scrape on every store instead of the whole catalog.
maxProductsPerStoreinteger1000Products per store. 0 = whole catalog (max 25,000).
includeProductDetailsbooleanfalseAdds barcodes, stock counts, inventory policy and selling plans. One extra request per product.
proxyConfigurationobjectApify datacenterRetries a 429 on a fresh IP.
feedbackstring—A note to the maintainers. Read by a human.

🧱 Stable fields for automations

Product rows have recordType: "product"; store status rows have recordType: "store". Fields are omitted (not null) when the store does not publish them. New fields are only ever added.

FieldMeaning
recordTypeproduct or store.
store, storeName, currencyHost the products came from, the store's name, its currency.
id, handle, title, urlShopify product id, handle, title, product page.
vendor, productType, tagsAs set by the merchant.
minPrice, maxPriceLowest / highest variant price.
onSaletrue when any variant has a compare-at price above its price.
availabletrue when any variant can be bought.
variantCount, variants[]Each variant: id, title, sku, price, compareAtPrice, available, options, grams, requiresShipping, image.
variants[].barcode, variants[].inventoryQuantity, variants[].inventoryManagement, variants[].inventoryPolicy, variants[].weightGramsWith details only, where published.
requiresSellingPlan, hasSellingPlans, mediaCountWith details only: subscription / pre-order flags and number of media items.
totalInventorySum of positive variant quantities (details only).
optionse.g. [{"name": "Size", "values": ["5", "6", …]}].
image, images, descriptionMain image, all images, description as plain text.
createdAt, updatedAt, publishedAtShopify timestamps.
source{source: "catalog" | "collection", collection?, page}.
Store rows: status, reason, httpStatusWhy a store was not scraped.

📦 Output example

{
"recordType": "product",
"store": "allbirds.com",
"storeName": "Allbirds",
"currency": "USD",
"id": 7340901859408,
"title": "Women's Allbirds Flip Flop - Dusty Pink",
"handle": "womens-allbirds-flip-flop-dusty-pink",
"url": "https://allbirds.com/products/womens-allbirds-flip-flop-dusty-pink",
"vendor": "Allbirds",
"productType": "Shoes",
"minPrice": 25.0,
"maxPrice": 25.0,
"onSale": true,
"available": true,
"variantCount": 7,
"variants": [
{ "id": 42146889203792, "title": "10", "sku": "A12513W100", "price": 25.0, "compareAtPrice": 50.0, "available": true,
"options": ["10"], "grams": 594, "barcode": "196942293133", "inventoryQuantity": 9, "inventoryManagement": "shopify", "inventoryPolicy": "deny" }
],
"options": [{ "name": "Size", "values": ["5", "6", "7", "8", "9", "10", "11"] }],
"totalInventory": 9,
"source": { "source": "catalog", "page": 1 }
}

(Variants abridged; with details off, the barcode/inventory fields are absent.) A store that could not be scraped:

{ "recordType": "store", "store": "example.com", "status": "NOT_SHOPIFY", "reason": "no /products.json (not a Shopify store, or a headless storefront with the API disabled)", "httpStatus": 404 }

🧠 Advanced usage

  • 💸 Competitor price monitoring: schedule the same storeUrls daily; join on store + variants[].id and compare price/compareAtPrice.
  • 📈 Sale tracker: filter onSale == true, or scrape a store's sale collection only.
  • 🔬 Stock-out alerts: with details on, watch variants[].inventoryQuantity / available flip.
  • 🔬 Product matching across retailers: join on variants[].barcode with our Woolworths, Tesco or Coles actors.
  • 💸 Completion check: read RUN_SUMMARY — status (COMPLETE, PARTIAL, NO_PRODUCTS, BUDGET_LIMIT, TIME_LIMIT, STATE_SAVE_FAILED, INVALID_INPUT, NOT_CONFIGURED), products, charged, and stores[] (each with status, reason, delivered, pages, currency, publishedProductsCount, warnings).

🔌 Integrations

Export as JSON, CSV, Excel or RSS; push to Google Sheets; trigger from Make, Zapier or n8n; webhook on run finish; schedule with the Apify Scheduler.

💸 How much does it cost?

1,000 products ≈ $0.50 — every variant included, so a 2,720-variant store is still ~250 product rows. Details (barcodes/stock) $2.00 / 1,000. Dead stores are free. Platform usage is included.

💰 Pricing

EventPriceCovers
product$0.50 / 1,000One product row, all variants included
product-detail$2.00 / 1,000One product row that came back with barcodes or stock counts (includeProductDetails)

Platform usage and proxy are included. Store status rows (NOT_SHOPIFY, BLOCKED, UNREACHABLE) are free, and nothing is charged for failed requests. If a detail request fails — or the store publishes neither barcodes nor stock for that product — it is delivered and charged as a plain product.

❓ FAQ

How do I know if a site is a Shopify store? Just add it. If it is not (or switched its feed off), you get a free NOT_SHOPIFY row.

Why did a Shopify store come back BLOCKED? It rate-limited or walled our requests after several retries on fresh IPs. Nothing was charged. Try again later.

Do I pay per variant? No — per product. A product with 30 variants is one product event.

Can I get exact stock? When the store's storefront publishes it, yes (inventoryQuantity, with details on). Many stores hide it; we never estimate.

Can I get reviews or sales numbers? No. Shopify does not publish them in the product feed.

Why are some prices in EUR/GBP? Prices are in the store's currency (currency).

🤖 For AI agents & LLM apps

architekture/shopify-products-scraper returns every product of any Shopify store — title, vendor, tags, and every variant's price, compare-at price, SKU and availability, optionally barcodes and stock counts — as deterministic, schema-stable JSON, one object per product, same fields on every run, so agents and RAG pipelines can parse it without defensive code. Invoke it from any agentic workflow via the Apify API or the Apify MCP server (mcp.apify.com) as a tool call; pay-per-event billing means a run costs a known amount before it starts ($0.50 per 1,000 products; maxProductsPerStore caps it). Every store gets a machine-readable status (OK, NOT_SHOPIFY, BLOCKED, UNREACHABLE, PARTIAL) in RUN_SUMMARY, so an agent can branch on it instead of parsing logs. Honest limits: Shopify storefronts only, no reviews, stock counts only where the store publishes them.

Works out of the box with LangChain, LlamaIndex and AI coding agents — call it as a tool from Claude Code, Cursor, or any MCP client via mcp.apify.com.

🧰 More Architekture scrapers

🙋 Support

Open an Issue on this actor's page; a human replies within a day.

This actor reads publicly available storefront product data, without logging in. You are responsible for how you use the data, including each store's terms of service, intellectual property in product content and images, and data-protection law where it applies.

📝 Changelog

  • 🆓 2026-10-18 — 1.0: probe-first store detection with free status rows; one row per product with variants nested; sale detection; optional barcodes and stock counts; collections; automatic www/bare-host retry; 429 retry on fresh IPs; clean stops at spending limit and timeout; resumable after platform migration.