Shopify Store Products Scraper - Prices, SKUs & Variants
Pricing
from $3.00 / 1,000 results
Shopify Store Products Scraper - Prices, SKUs & Variants
Scrape every product from any Shopify store through its public product feed: title, vendor, type, tags, images and all variants with price, compare-at price, SKU and stock. Optionally one row per variant for price monitoring. HTTP-only, no API key, no account.
Pricing
from $3.00 / 1,000 results
Rating
0.0
(0)
Developer
Farhan Febrian Nauval
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
12 days ago
Last modified
Categories
Share
Shopify Store Products Scraper — Prices, SKUs & Variants
Scrape every product from any Shopify store through its public product feed: title, vendor, type, tags, images, and all variants with price, compare-at price, SKU and stock. No API key, no account, no browser.
Input
| Field | Type | Default | Description |
|---|---|---|---|
storeUrls | array | required | Store domains, store URLs, or collection URLs |
flattenVariants | boolean | false | One row per variant instead of per product |
maxProductsPerStore | integer | 1000 | Stop a store after this many products |
maxPages | integer | 20 | Pages per store (250 products each) |
maxConcurrency | integer | 3 | Stores in parallel |
A collection URL scopes the scrape: https://www.allbirds.com/collections/mens reads only
that collection (94 products in testing), while https://www.allbirds.com reads the whole
catalogue (294).
Output
Product rows carry Shopify's own fields verbatim plus derived ones:
{"_input": "https://www.allbirds.com","_source": "S1-products-json","_scrapedAt": "2026-09-07T04:34:59Z","storeUrl": "https://www.allbirds.com","productUrl": "https://www.allbirds.com/products/mens-dasher-nz-anthracite","id": 7369944137808, "title": "Men's Dasher NZ - Anthracite","vendor": "Allbirds", "product_type": "Shoes", "handle": "…","tags": [...], "images": [...], "options": [...], "variants": [...],"body_html": "…", "created_at": "…", "published_at": "…", "updated_at": "…","variantCount": 13, "availableVariantCount": 11, "inStock": true,"minPrice": 140.0, "maxPrice": 140.0, "imageCount": 6}
With flattenVariants: true you get one self-contained row per variant instead — the
product fields are copied onto each row (and the nested variants array dropped) so you never
have to join back to a product table:
{"title": "Men's Dasher NZ - Anthracite","variantId": 42436493115472, "variantTitle": "8.5", "sku": "A12417M085","variantPrice": 140.0, "variantCompareAtPrice": 140.0,"variantAvailable": false, "onSale": false, "variant": { … }}
40 products became 472 variant rows in testing, every field populated. That is the shape you want for price and stock monitoring.
How it works
Every Shopify storefront exposes /products.json (and
/collections/<handle>/products.json) as a public, unauthenticated JSON feed. There is no HTML
to parse and nothing to reverse-engineer.
Pagination. limit is capped at 250 server-side — asking for 500 returns 250 — and paging
is ?page=N until a page comes back empty. Verified: page 1 = 250, page 2 = 44, page 3 = 0.
The actor stops on the empty page rather than guessing a page count.
Not every Shopify store is reachable. The feed has no anti-bot layer, but the storefront in
front of it can: allbirds.com answered a plain request while gymshark.com returned 403
(Cloudflare) and shop.tesla.com returned 406. The actor rotates a small TLS ladder for those,
and most stores never need past the first rung.
Three failure modes, three error codes — because "it didn't work" is not actionable:
_error | Meaning |
|---|---|
bad_input | Not a hostname at all (caught before any request is spent) |
not_shopify | The site answered, but not with a Shopify feed — wrong platform, or a password-protected storefront |
blocked | Shopify store, but the storefront refused us (Cloudflare etc.) |
Known limits
| Limit | Detail |
|---|---|
| Published products only | The feed shows what the storefront shows; drafts and hidden products are not in it |
| No inventory counts | Shopify exposes available (boolean) here, not quantity on hand |
| Password-protected stores | Report not_shopify — the feed is not served behind the password page |