Shopify Product Scraper avatar

Shopify Product Scraper

Pricing

Pay per event

Go to Apify Store
Shopify Product Scraper

Shopify Product Scraper

Scrape any Shopify store without an API key: products, prices, variants, images, stock and discounts. Pay per result - price tracking from $1.50 per 1,000 products. Export JSON, CSV or Excel.

Pricing

Pay per event

Rating

0.0

(0)

Developer

Per Schondell

Per Schondell

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

3 days ago

Last modified

Categories

Share

Extract all products from any Shopify store — prices, variants, images, stock status, and discounts — with no Shopify API key, no login, and no coding required. Enter a store URL, press Run, and export the full catalog to JSON, CSV, or Excel.

Unlike bundled scrapers that bill you for everything on every run, this actor is pay-per-result with modular tiers: a daily price check on 1,000 products costs $1.50, not $4–8.

What can you do with it?

  • Track Shopify competitor prices daily — current price, compare-at price, and discount status for every product
  • Detect winning products — the built-in soldOutRatio shows which products are selling out (a strong demand signal)
  • Export a full Shopify catalog — variants, images, tags, descriptions, vendors, SKUs, and barcodes for product research or dropshipping
  • Import products to your own store — clean JSON/CSV output maps directly to catalog import tools
  • Monitor stock and availability — per-variant sold-out counts across the whole store
  • Feed AI agents and pipelines — structured output via API, webhooks, or the Apify MCP server

Pricing — pay only for what you need

ModePriceReturnsBest for
Price$1.50 / 1K productscurrent price, compare-at price, availability, sold-out variant ratioDaily price tracking, repricing, discount detection
Catalog$4 / 1K products+ variants, images, tags, description, vendor, SKU, barcodeProduct research, dropshipping, catalog import
Full(roadmap)+ review-app aggregation (Judge.me / Yotpo / Loox / Okendo / Stamped), sales estimateCompetitor intelligence, full audits

Concrete examples:

ScenarioModeRun cost
Daily price check on 1,000 productsPrice$1.50 / day
Full catalog export of 5,000 products (one-time)Catalog$20

Compare with bundled-billing actors that charge $4–$7 per 1K products regardless of which fields you actually use.

How to scrape a Shopify store (step by step)

  1. Click Try for free — you'll need a free Apify account (no credit card for the trial).
  2. Paste one or more Shopify store URLs into Shopify store URLs (e.g. https://allbirds.com).
  3. Pick a mode: price for price tracking, catalog for full product data.
  4. Click Start. The run finishes in seconds for most stores.
  5. Open the Dataset tab and export as JSON, CSV, Excel, HTML, or XML — or fetch it via API.

To run it on a schedule (e.g. daily price tracking), click Actions → Schedule on the actor page.

Input

{
"mode": "price",
"storeUrls": ["https://allbirds.com", "https://gymshark.com"],
"maxProductsPerStore": 500,
"delayMs": 1500
}

Sample output (Price mode)

{
"storeUrl": "https://allbirds.com",
"productId": 6616124981328,
"handle": "trino-cozy-crew-heathered-onyx",
"title": "Trino® Cozy Crew - Heathered Onyx",
"vendor": "Allbirds",
"productType": "Socks",
"minPriceCents": 2400,
"maxPriceCents": 2400,
"compareAtMinCents": null,
"compareAtMaxCents": null,
"hasDiscount": false,
"variantCount": 4,
"soldOutCount": 3,
"soldOutRatio": 0.75,
"scrapedAt": "2026-05-27T15:53:23.620Z"
}

A soldOutRatio near 1.0 with the product still listed is one of the strongest demand signals in Shopify data — buyers cleared most variants and the store hasn't restocked yet.

Use it from code or AI agents

Run the actor and read results with the Apify API or client libraries:

curl -X POST "https://api.apify.com/v2/acts/worktech~shopify-product-scraper/run-sync-get-dataset-items?token=YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{"mode":"price","storeUrls":["https://allbirds.com"]}'

It also works with n8n, Make, Zapier, webhooks, and the Apify MCP server, so AI agents can discover and call it as a tool.

Why this scraper?

  • 100% parse success rate on every reachable Shopify store in our 20-store benchmark (report ships in the repo; reproduce with npm run test:real).
  • Correct SKU merging — one row per product, not one row per variant. (Some popular alternatives get this wrong.)
  • No silent failures — HTTP 430 security rejections, 429 rate limits, malformed JSON, and blocked endpoints surface as named errors with per-store context. A failed store never poisons the rest of the run: the remaining stores are still scraped. (A billing failure is the one exception — see "What the run reports" below.)
  • Partial stores are still counted — if a store delivers 250 products and is then blocked on page 2, those 250 products are in your dataset and are reported as 250. The run never tells you 0 for rows you actually received.
  • Retry with backoff — 429/5xx retry automatically honouring Retry-After; 430/4xx fail fast (they won't fix themselves).
  • Cents-based price math — integer minor units, no float drift on 19.99 + 0.01.

What the run reports

Every run writes a SUMMARY record to the run's key-value store:

FieldMeaning
modeprice or catalog
storeCountstores you asked for
successCountstores scraped without error
failureCountstores that failed (see failures)
totalProductsScrapedrows delivered to your dataset
rowsBilledrows a charge was recorded for
failures[{ storeUrl, error }], one per failed store
storesNotAttemptedstores the run never reached because it aborted
billingFailurenull normally; a message when billing broke

successCount + failureCount + storesNotAttempted.length always equals storeCount.

Billing failures abort the run (read this before you re-run)

totalProductsScraped and rowsBilled are reported separately because they can differ. If Apify cannot record a pay-per-event charge — for example the actor's monetization is misconfigured — then rows have already been delivered to your dataset that could not be billed.

When that happens the actor stops immediately and fails the run. It does not continue to the remaining stores, and storesNotAttempted names the ones it skipped. This is deliberate: the same fault would repeat on every remaining store, so carrying on would quietly deliver more and more unbilled data while reporting a green run. The failure message states how many rows were delivered and how many were billed, so you can see your exposure.

Re-running after a billing failure re-delivers and re-bills the rows that were already delivered — they are not de-duplicated across runs. Fix the pay-per-event configuration first, and if you only need the stores that were skipped, re-run with just the URLs listed in storesNotAttempted.

A scrape failure (430/429/malformed) never does any of this: it is contained to its own store and the run continues and finishes normally.

Comparison vs alternatives (Apify Store)

FeatureShopify Product Scraperautofacts/shopifywebdatalabs/shopify-product-scraper
Modular pay-per-result billing (Price / Catalog)
Proper SKU merging on product pages❌ (documented limitation)
Explicit 430 / 429 / parse error loggingpartialpartial
Retry-with-backoff + Retry-After honoredpartialpartial
Cents-based price math (no float drift)
Published parse success rate100% on 20/20 reachable storesnot publishednot published

FAQ

Do I need a Shopify API key or store access? No. The scraper reads the store's public product listing — the same data any visitor's browser sees. You only need the store URL.

Can I export Shopify products to CSV or Excel? Yes. Every run produces a dataset you can download as CSV, Excel, JSON, HTML, or XML from the Apify Console, or fetch via API.

Is it legal to scrape a Shopify store? The actor only collects publicly available product data (no personal data, no login-protected content). Whether scraping is permissible for your use case depends on your jurisdiction and the store's terms — when in doubt, consult a lawyer.

How do I track Shopify prices every day? Set the mode to price, add your competitor stores, and create a Schedule on the actor page. Each daily run costs $1.50 per 1,000 products tracked.

Does it work on any Shopify store? Any store on Shopify with a public catalog. If a site has moved off Shopify, the actor reports a clear NOT_SHOPIFY error instead of returning empty data.

What about stores with more than 5,000 products? Currently the actor reads the public products endpoint, which returns up to ~5,000 products per store. Sitemap-based pagination for larger catalogs is next on the roadmap.

How is this different from the Shopify API? The official Admin API requires the store owner's credentials. This scraper needs nothing — it works on any store, including competitors' stores.

Roadmap

  • Sitemap-based pagination for catalogs >5K products; Web Bot Auth signed requests
  • Full mode — review-app aggregation (Judge.me / Yotpo / Loox / Okendo / Stamped) + algorithmic sales estimate
  • Diff / webhook mode for price-change alerts on a watched set
  • CHF / EUR rounding, VAT-inclusive prices, German review platforms

Limitations

  • Public products endpoint only for now; stores with >5,000 products lose tail items until sitemap pagination ships.
  • "Sales estimate" (Full mode, roadmap) will be algorithmic — directional, not transaction data.

Status

v0.2 — Price and Catalog modes in production with pay-per-event billing. 68 unit tests + 33-store integration suite passing, plus a 19-check in-image pre-push gate (gate.mjs).