Shopify & WooCommerce Price Scraper: Real Discounts
Pricing
from $1.00 / 1,000 products
Shopify & WooCommerce Price Scraper: Real Discounts
Scrape the products of Shopify and WooCommerce stores that keep their product feed open: price, compare-at price and the discount per variant. Scheduled runs bill only products whose price or stock changed.
Pricing
from $1.00 / 1,000 products
Rating
0.0
(0)
Developer
Honest Data
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
20 hours ago
Last modified
Categories
Share
What does Shopify & WooCommerce Price Scraper do?
In short: Returns product prices from public Shopify /products.json and WooCommerce Store API endpoints, with the real discount computed from price vs compare-at (only where compare-at is higher), per variant and with stock, plus an only-new-or-changed mode for monitoring. $0.001 per product, no browser needed; stores that can't be read come back as free miss rows.
Price trackers, dropshippers, deal sites, competitor-watchers and market researchers keep asking the same
question: what does this store charge today, what is really on sale, and what changed since last week?
Shopify stores publish their catalogue as open JSON (/products.json) and WooCommerce stores through the
public Store API; this actor reads both, adds up each product's variants, and turns them into one clean row
per product. Schedule it with Only new or changed since the last run and each run returns, and bills,
only what moved.
It also shows what a price list can't tell you on its own: the discount against the store's own compare-at price per variant (counted only where that price is higher), whether anything is in stock, and a note that a store can set a compare-at price to anything and the feed doesn't say how long a sale has run.
What you get
Sample output (a real row from a test run on allbirds.com, trimmed to two variants):
{"id": "allbirds.com|7091689848912|e0cdd296df","store": "allbirds.com","platform": "shopify","title": "Women's Tree Dasher 2 - Weathered White (Weathered White Sole)","url": "https://allbirds.com/products/womens-tree-dashers-weathered-white","vendor": "Allbirds","productType": "Shoes","currency": "USD","priceMin": 70,"priceMax": 70,"onSale": true,"maxDiscountPercent": 50,"variantCount": 13,"inStock": false,"variants": [{"id": "40874029514832", "title": "5", "sku": "A11459W050", "price": 70, "compareAtPrice": 140, "discountPercent": 50, "available": false},{"id": "40874029547600", "title": "5.5", "sku": "A11459W055", "price": 70, "compareAtPrice": 140, "discountPercent": 50, "available": false}]}
| Field | Meaning |
|---|---|
title, url, vendor, productType, tags | As the store lists them (WooCommerce: first category as productType) |
priceMin, priceMax, currency | Lowest and highest variant price. Currency is null when the store doesn't state it |
onSale, maxDiscountPercent | True / biggest percent off, only where a variant's compare-at price is above its price |
variants | Every variant with its own price, compare-at price, discount and stock flag |
inStock | True when at least one variant is in stock; null when the feed has no stock flag |
createdAt, publishedAt, updatedAt | Shopify's own timestamps. updatedAt moves on any edit, so it is not when a sale started |
id | Product plus a fingerprint of every variant's price, compare-at price and stock. It changes when those change |
Honest limits.
- The feed doesn't say when a sale started or how long it has run, so there is no "sale length" field. Scheduled runs show you when a price changed from the day you started watching.
- A compare-at price is whatever the store typed in. A 50% discount against an inflated regular price is still 50% in this data; compare across your own runs and stores.
- Only stores that leave their product feed on can be read. Of 13 well-known Shopify stores we tried, 10 worked
(allbirds, gymshark, kith, colourpop, brooklinen, taylorstitch, tentree, glossier, rothys, fashionnova);
mejuri.com and ruggable.com had no open feed, and bombas.com refused its product feed with HTTP 429 in 4 of our
5 runs, including through residential IPs. Those come back as free rows with the reason (
no_open_feed,blocked). Addresses that can't be reached at all come back asunreachable. - Products with no positive price (placeholder entries, $0 samples) are skipped and not billed.
- Prices are in the currency of the store's default market. Stores that localise prices by country show the
default one. Currency comes from the store's
/meta.jsonand is null if that isn't readable. - WooCommerce rows are one row per product with a single "variant" entry. For variable products the row
shows the price range (
priceMin,priceMax) andonSaleas the store reports it, but no discount percent. WooCommerce support is verified on two stores (woocommerce.com, mercantile.wordpress.org, both run by Automattic, simple products); of 10 other stores we tried, none exposed an open WooCommerce feed (some were Shopify, some had no open feed or refused). - Catalogues are read in the store's own order, 250 products (Shopify) or 100 (WooCommerce) per request with a one-second pause between requests.
- Filters match whole words ("boot" matches "Boot" but not "Bootcut").
- "Only new or changed" remembers the latest state of each product, up to 50,000 products per input. Past that, the oldest are
forgotten and those products are delivered and billed again; the run log and the
seenIdsForgottenfield of the OUTPUT record say when it happens.
How to use it
- Enter store addresses (
allbirds.comorhttps://www.allbirds.com), one per line. - Optionally keep only products that are on sale, in stock, or have a word in their title.
- Click Start. Results appear in the Overview tab; export to CSV, JSON or Excel, or use the API.
- For price monitoring: schedule it daily or weekly with Only new or changed since the last run on and a Max products per store above the store's size (the default 100 is a cap, and the cap is applied before the change check). The first run delivers everything; later runs deliver only what changed.
How much does it cost?
$0.001 per product delivered, so 1,000 products cost $1. Stores that can't be read and filters that match nothing are listed free with the reason, and with "only new or changed" on, products whose price and stock haven't changed on the same input are free. Changing the input (stores, filters, max products) starts a fresh memory, so the next run delivers and bills those products again. There's also a tiny start fee of $0.00005 per run. Apify's free plan includes $5 of monthly credit.
Input
See the Input tab. Max products per store keeps the store's own order. The memory for "only new or changed" is kept per input, so two schedules with different stores or filters don't share state. Proxy is off by default because the feeds are open; turn Apify Proxy on if a store refuses your runs (a few refuse anyway).
Tips
- Start with one store and 20 products to see the fields, then add stores.
- Run it daily with On sale only and Only new or changed for a deal alert feed.
- Compare
priceMinbetween runs to catch price cuts and rises; stock flips show up as changed rows. - Sort by
maxDiscountPercent, but checkvariants: a 60% discount on one size is not 60% on the product.
FAQ
Can I use it from Claude, ChatGPT or Cursor? Yes, through Apify's MCP server:
https://mcp.apify.com?tools=honestdata/shopify-store-prices.
Does it collect personal data? No. It reads public product listings, not customers or orders.
Is it legal? It reads the public product data stores publish on their own sites. You are responsible for how you use it; check each store's terms and your local laws.
Something broke? Open an issue on the Issues tab. We test every tool every morning and answer fast.
More from Honest Data
- Google Trends Scraper: 200 Keywords on One Scale
- AliExpress Scraper: Real Prices, Ads Flagged
- YouTube Transcript Scraper
- Product Demand Radar
- Greenhouse Jobs Scraper & New-Job Monitor
Found it useful? A short review helps others find it.