Shopify Product Scraper
Pricing
Pay per event
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
Maintained by CommunityActor 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
soldOutRatioshows 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
| Mode | Price | Returns | Best for |
|---|---|---|---|
| Price | $1.50 / 1K products | current price, compare-at price, availability, sold-out variant ratio | Daily price tracking, repricing, discount detection |
| Catalog | $4 / 1K products | + variants, images, tags, description, vendor, SKU, barcode | Product research, dropshipping, catalog import |
| Full | (roadmap) | + review-app aggregation (Judge.me / Yotpo / Loox / Okendo / Stamped), sales estimate | Competitor intelligence, full audits |
Concrete examples:
| Scenario | Mode | Run cost |
|---|---|---|
| Daily price check on 1,000 products | Price | $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)
- Click Try for free — you'll need a free Apify account (no credit card for the trial).
- Paste one or more Shopify store URLs into Shopify store URLs (e.g.
https://allbirds.com). - Pick a mode:
pricefor price tracking,catalogfor full product data. - Click Start. The run finishes in seconds for most stores.
- 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:
| Field | Meaning |
|---|---|
mode | price or catalog |
storeCount | stores you asked for |
successCount | stores scraped without error |
failureCount | stores that failed (see failures) |
totalProductsScraped | rows delivered to your dataset |
rowsBilled | rows a charge was recorded for |
failures | [{ storeUrl, error }], one per failed store |
storesNotAttempted | stores the run never reached because it aborted |
billingFailure | null 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)
| Feature | Shopify Product Scraper | autofacts/shopify | webdatalabs/shopify-product-scraper |
|---|---|---|---|
| Modular pay-per-result billing (Price / Catalog) | ✅ | ❌ | ❌ |
| Proper SKU merging on product pages | ✅ | ❌ (documented limitation) | ✅ |
| Explicit 430 / 429 / parse error logging | ✅ | partial | partial |
| Retry-with-backoff + Retry-After honored | ✅ | partial | partial |
| Cents-based price math (no float drift) | ✅ | ✅ | ❓ |
| Published parse success rate | 100% on 20/20 reachable stores | not published | not 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).