Shopify Products.json Scraper — Price & Stock Monitor
Pricing
from $0.70 / 1,000 results
Shopify Products.json Scraper — Price & Stock Monitor
Scrape public Shopify /products.json catalogs (optional collections). One dataset row per variant. Monitor price_up/down and stock_in/out between runs. No login, no browser. Soft-fails blocked (403) stores.
Pricing
from $0.70 / 1,000 results
Rating
0.0
(0)
Developer
David Tu
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
9 days ago
Last modified
Categories
Share
Scrape public Shopify store catalogs via /products.json and optionally detect price / stock / new-product changes between runs. One dataset row per variant. Optional collection handles. No login, no browser, no residential proxies. Soft-fails stores that return HTTP 403.
Also see the Greenhouse / Lever / Ashby Jobs Scraper + Monitor and Workday Jobs Scraper + Monitor for hiring-signal monitoring.
What does this Shopify products.json scraper do?
- 🛒 Multi-store catalog export. Page through
/products.json?limit=250(or selected collections). - 💲 One row per variant. Price, compare-at, SKU, availability, image, product URL.
- 📡 Monitor mode. Remembers variant fingerprints and emits only
new/price_up/price_down/stock_in/stock_out/removed. - 🎯 Filters. Title, vendor, product type, tags, in-stock only, caps.
- 🛡️ Polite. Per-host throttling, retries on 429/5xx, per-shop
RUN_SUMMARY(ok/blocked/not_found/error/skipped).
Who uses it?
Ecommerce analysts and brand teams
Export competitor catalogs and track price_up / price_down and stock_in / stock_out on a schedule without building your own crawler.
Price intelligence and MAP monitoring
Watch a watchlist of Shopify stores; pay only for change rows in monitor mode.
Product data / aggregators
Ingest structured variant-level rows (SKU, price, availability, image URL) from public /products.json.
Input
| Format | Example |
|---|---|
| Domain | allbirds.com |
| With www | www.allbirds.com |
| Full URL | https://www.allbirds.com |
Path and query are ignored; the Actor always hits the shop origin.
Example: sample export
{"shops": ["allbirds.com"],"maxProductsPerShop": 10,"maxProductsTotal": 50}
Example: daily price & stock monitor
{"shops": ["allbirds.com"],"monitorMode": true,"monitorStateKey": "footwear","outputPriceChanges": true,"outputStockChanges": true,"outputRemoved": true,"skipExistingOnFirstRun": true}
Output example
{"productKey": "shopify:www.allbirds.com:7340901859408:42146889203792","status": "active","shop": "www.allbirds.com","shopName": "Allbirds","productId": "7340901859408","handle": "womens-allbirds-flip-flop-dusty-pink","title": "Women's Allbirds Flip Flop - Dusty Pink","vendor": "Allbirds","productType": "Shoes","tags": ["shoprunner"],"variantId": "42146889203792","sku": "A12513W100","variantTitle": "10","price": 25,"compareAtPrice": 50,"currency": "USD","available": true,"grams": 594,"imageUrl": "https://cdn.shopify.com/...","productUrl": "https://www.allbirds.com/products/womens-allbirds-flip-flop-dusty-pink","collectionHandle": null,"sourceApiUrl": "https://www.allbirds.com/products.json?limit=250&page=1","scrapedAt": "2026-10-09T08:00:00.000Z"}
A RUN_SUMMARY record in the run key-value store lists every shop with status and counts.
Monitor mode
- State lives in key-value store
shopify-catalog-monitor-stateunder your Monitor state key. - Fingerprint per variant:
{ price, available, title }. - First run: all matching variants as
new, or baseline-only if Skip existing on first run is on. - Later runs: only changes (and optionally
removed). - Variants not output because of max/budget caps are not marked seen / updated, so the next run delivers them.
Pricing
$1.00 per 1,000 variant rows, pay per result (pay-per-event). You pay only for rows saved to your dataset, plus a tiny Apify start fee per run ($0.00005). There is no monthly rental, and in monitor mode you pay only for change rows.
| Apify plan discount | Price per 1,000 variant rows |
|---|---|
| Free / Starter | $1.00 |
| Bronze | $0.90 |
| Silver | $0.80 |
| Gold and above | $0.70 |
Examples at $1.00 / 1,000:
- Sample of 10 products × ~5 variants ≈ 50 rows ≈ $0.05.
- A daily monitor that emits ~200 change rows/day ≈ 6,000 rows/month ≈ $6/month.
Set Max products per shop / Max variant rows in total or the run's maximum cost to cap spending.
FAQ
What is /products.json?
Most public Shopify storefronts expose a paginated JSON catalog at https://{shop}/products.json. This Actor reads that feed (and optional /collections/{handle}/products.json) — no theme HTML scraping.
Why one row per variant?
Shopify products often have many sizes/colors. Billing and monitoring are per variant row (price and stock change at variant level).
A shop shows blocked (403). Why?
Some brands block anonymous /products.json access. The Actor soft-fails those stores (status blocked in RUN_SUMMARY) and continues with others. v1 does not spend residential proxies.
Can I scrape only one collection?
Yes. Set Collection handles to crawl /collections/{handle}/products.json instead of the full catalog.
Do I need login or a browser?
No. Public JSON only. Password-protected / headless stores are not supported.
How is this different from a full-page catalog dump?
You get variant-level rows plus optional monitor mode (price_up / price_down / stock_in / stock_out / new / removed) so scheduled runs stay cheap.
Limitations
- Public JSON only. Does not scrape theme HTML, cart, checkout, or customer accounts.
- Some brands return 403 on
/products.json. Those are reported asblockedinRUN_SUMMARY. No residential proxy spend in v1. - Currency comes from
/meta.jsonwhen available; otherwisenull. - Password-protected / headless stores are not supported.
- Large catalogs (tens of thousands of products) take more wall time; use caps or collection handles.
Related
| Actor | Use for |
|---|---|
| Greenhouse / Lever / Ashby Jobs Scraper + Monitor | ATS job boards + hiring signals |
| Workday Jobs Scraper + Monitor | *.myworkdayjobs.com CXS career boards |