Shopify Store Products Scraper avatar

Shopify Store Products Scraper

Pricing

Pay per usage

Go to Apify Store
Shopify Store Products Scraper

Shopify Store Products Scraper

Extract the full product catalogue from any Shopify store - titles, variants, SKUs, prices, images and tags. No API key, no login.

Pricing

Pay per usage

Rating

0.0

(0)

Developer

BERCIK Group

BERCIK Group

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

3 days ago

Last modified

Share

Extract the full product catalogue from any Shopify store — titles, variants, SKUs, prices, compare-at prices, stock status, images and tags. No API key, no login, no store permission needed.

What does Shopify Store Products Scraper do?

Every Shopify storefront publishes its catalogue at a public /products.json endpoint. This Actor reads it, walks the whole catalogue, and returns clean, structured records you can drop straight into a spreadsheet or database.

You get one row per product with a nested variants array, or one row per variant (SKU-level) if you're tracking prices. Point it at several competitors at once and it returns a single unified dataset across all of them.

Because it reads a public JSON endpoint rather than rendering pages, there's no browser, no proxy and no CAPTCHA — runs are fast and cheap.

Why use Shopify Store Products Scraper?

  • Competitor price monitoring — track a rival's entire catalogue on a schedule and see exactly what changed.
  • Assortment and gap analysis — compare product types, vendors and price bands across several stores at once.
  • Dropshipping and reselling — pull catalogues with SKUs, images and stock status ready for import.
  • Market research — quantify how a category is priced across dozens of brands.
  • Stock monitoring — watch which SKUs sell out and how quickly they return.
  • Lead generation for agencies — profile a prospect's catalogue size and merchandising before a pitch.

How to use Shopify Store Products Scraper

  1. Click Try for free.
  2. Add one or more Shopify store URLsallbirds.com or https://www.gymshark.com both work.
  3. Optionally filter by product type, vendor, tag, price range or stock status.
  4. Turn on One row per variant if you want SKU-level rows for price tracking.
  5. Set Maximum results to cap your spend.
  6. Click Start, then download as JSON, CSV, Excel, HTML or XML.

Input

{
"storeUrls": ["allbirds.com", "gymshark.com"],
"productTypes": ["Shoes"],
"minPrice": 50,
"availableOnly": true,
"oneRowPerVariant": false,
"maxProductsPerStore": 1000,
"maxResults": 5000
}
FieldTypeDescription
storeUrlsarrayShopify stores — bare domain or full URL
maxProductsPerStoreintegerStop after this many products per store
maxResultsintegerHard cap on total records returned
oneRowPerVariantbooleanSKU-level rows instead of product-level
availableOnlybooleanKeep only in-stock items
productTypes, vendors, tagsarrayCase-insensitive filters
minPrice, maxPriceintegerPrice bounds, in the store's own currency

Output

{
"storeDomain": "allbirds.com",
"storeName": "Allbirds",
"currency": "USD",
"productId": 6842053460048,
"title": "Men's Cruiser - Shadow Blue",
"handle": "mens-cruiser-shadow-blue",
"productUrl": "https://allbirds.com/products/mens-cruiser-shadow-blue",
"vendor": "Allbirds",
"productType": "Shoes",
"tags": ["DNAM BRANDS", "EC STOCK"],
"description": "A comfy everyday shoe made with merino wool.",
"minPrice": 105,
"maxPrice": 105,
"available": true,
"variantCount": 13,
"variants": [
{
"variantId": 41990816759888,
"title": "8",
"sku": "A12856M080",
"price": 105,
"compareAtPrice": null,
"currency": "USD",
"available": true,
"grams": 1000
}
],
"imageUrl": "https://cdn.shopify.com/...jpg",
"imageCount": 4,
"publishedAt": "2026-01-14T09:12:03-08:00"
}

You can download the dataset in various formats such as JSON, HTML, CSV, or Excel.

Data fields

FieldDescription
storeDomain, storeName, currencyWhich store the row came from
productId, title, handle, productUrlProduct identity and link
vendor, productType, tagsMerchandising classification
descriptionProduct description, HTML stripped
minPrice, maxPrice, availablePrice range and stock across all variants
variantCount, variantsEvery variant: SKU, price, compare-at price, options, weight
imageUrl, imageCount, imagesProduct imagery
optionsOption names and values, e.g. Size / Colour
publishedAt, createdAt, updatedAtCatalogue timestamps

In one row per variant mode, each row carries the variant's own sku, price and available alongside the product context, and the nested variants array is dropped.

How much does it cost to scrape a Shopify store?

Priced per record returned, capped by Maximum results so you know your ceiling before the run starts. There's no browser and no proxy, so the underlying platform cost is very low.

A mid-sized catalogue is typically 200–500 products; large brands run into the thousands.

Tips

  • Not every store exposes /products.json. A minority disable it or run a custom storefront. The Actor logs a warning and moves on to the next store rather than failing the run.
  • currency and storeName come from /meta.json, which custom storefronts don't serve. When it's unavailable both fields are null — prices are still correct, they're just in the store's own unstated currency.
  • Use oneRowPerVariant for price tracking, product-level rows for catalogue analysis. Variant mode produces far more records, so raise maxResults accordingly.
  • Price filters behave sensibly in both modes. At product level a product qualifies if any variant matches; in variant mode each row is filtered on its own price and stock.
  • compareAtPrice reveals discounting — where it's higher than price, the item is on sale.
  • Schedule daily runs and diff on productId + sku to build a price history.

FAQ

Do I need permission from the store? /products.json is a public endpoint that Shopify serves to anyone; it's the same data the storefront itself uses. This Actor requests it at a polite rate and reads nothing private — no customer data, no orders, no admin. That said, this is general information rather than legal advice; check your own obligations before redistributing catalogue data commercially.

Why did a store return nothing? Either it isn't Shopify, or the merchant disabled the endpoint. The run log names the store and says so explicitly.

Can I get inventory quantities? No. The public endpoint exposes whether a variant is available, not how many units remain. Exact stock counts require the merchant's own Admin API credentials.

Can I scrape collections or a single product? This version walks the full catalogue. Filter the output by productType, vendor or tags to narrow it. If you need collection-level scraping, open an issue.

Support

Found a bug or need a field that isn't here? Open an issue on the Issues tab and I'll take a look. Custom data pipelines and bespoke scraping work are available on request.