Shopify Store Products Scraper - Prices, SKUs & Variants avatar

Shopify Store Products Scraper - Prices, SKUs & Variants

Pricing

from $3.00 / 1,000 results

Go to Apify Store
Shopify Store Products Scraper - Prices, SKUs & Variants

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

Farhan Febrian Nauval

Maintained by Community

Actor 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

FieldTypeDefaultDescription
storeUrlsarrayrequiredStore domains, store URLs, or collection URLs
flattenVariantsbooleanfalseOne row per variant instead of per product
maxProductsPerStoreinteger1000Stop a store after this many products
maxPagesinteger20Pages per store (250 products each)
maxConcurrencyinteger3Stores 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:

_errorMeaning
bad_inputNot a hostname at all (caught before any request is spent)
not_shopifyThe site answered, but not with a Shopify feed — wrong platform, or a password-protected storefront
blockedShopify store, but the storefront refused us (Cloudflare etc.)

Known limits

LimitDetail
Published products onlyThe feed shows what the storefront shows; drafts and hidden products are not in it
No inventory countsShopify exposes available (boolean) here, not quantity on hand
Password-protected storesReport not_shopify — the feed is not served behind the password page