Shopify Store Scraper - Full Product Catalog Export avatar

Shopify Store Scraper - Full Product Catalog Export

Pricing

Pay per event

Go to Apify Store
Shopify Store Scraper - Full Product Catalog Export

Shopify Store Scraper - Full Product Catalog Export

Scrape the entire product catalog of any Shopify store in minutes — titles, prices, variants, SKUs, images, inventory, vendor, tags, and more. Every row is flagged isNew, and new-product mode lets scheduled runs report only fresh listings. No login, no API key, no code.

Pricing

Pay per event

Rating

0.0

(0)

Developer

Halven Labs

Halven Labs

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

Share

Shopify Store Scraper — Export Any Shopify Store's Full Product Catalog

Scrape the entire product catalog of any Shopify store in minutes — titles, prices, variants, SKUs, images, inventory status, vendor, tags, and more. No login, no API key, no code. Export straight to CSV, Excel, JSON, or Google Sheets.

Perfect for competitor price monitoring, dropshipping product research, market analysis, catalog migration, and building product datasets.


🎯 Why use this actor

  • See a competitor's full catalog in minutes — pricing, inventory, and product mix, without manually browsing hundreds of pages.
  • Research products to sell — pull thousands of real products with prices and images for dropshipping or market research, ready for a spreadsheet.
  • Catch changes automatically — new-product mode flags exactly what's new since your last run, so you can monitor a store on a schedule instead of re-checking by hand.

✨ Features

  • Works on any Shopify store — just paste the store URL. The scraper reads each store's public product feed.
  • Full catalog, not just one page — automatically paginates through every product in the store.
  • Product or variant level — get one row per product (with a price range) or expand to one row per variant (size/color) with variant-level price, SKU, and stock status.
  • Rich, flat data — 20+ clean columns ready for spreadsheets. No messy nested JSON.
  • Multiple stores at once — pass a list of store URLs and scrape them all in a single run.
  • New-product mode — every row is flagged isNew; turn on onlyNewProducts to get only items that didn't exist last time you ran this actor. Great for scheduled catalog-change monitoring.
  • Fast & cheap — pure HTTP (no headless browser), so runs are quick and low-cost.
  • Robust — automatic retries, graceful handling of failed pages, and a sitemap fallback if a store's product feed is restricted.
  • Bounded — set maxItems to cap exactly how much you scrape.

🚀 Quick start

  1. Paste one or more Shopify store URLs into Store URLs.
  2. (Optional) Set Max items and toggle Expand variants.
  3. Click Start. That's it — the default input runs successfully with zero edits.

Example input

{
"storeUrls": [
"https://www.allbirds.com",
"https://colourpop.com"
],
"maxItems": 100,
"expandVariants": false,
"includeBodyHtml": false,
"onlyNewProducts": false,
"proxyConfiguration": { "useApifyProxy": true }
}
FieldTypeDefaultDescription
storeUrlsarray(required)Store URLs. A homepage URL scrapes the whole catalog; a collection URL (.../collections/sale) scrapes just that collection.
maxItemsinteger100Max dataset rows to scrape across all stores. 0 = no limit.
expandVariantsbooleanfalseOne row per variant (size/color) instead of one row per product.
includeBodyHtmlbooleanfalseInclude the raw HTML product description in a bodyHtml field.
onlyNewProductsbooleanfalseMonitor mode — only output products not seen in a previous run.
proxyConfigurationobjectApify Proxy (auto)Proxy settings.

📦 Output

Each row is a flat, spreadsheet-friendly object. Example (product-level):

{
"storeUrl": "https://www.allbirds.com",
"productId": 7205181653072,
"title": "Men's Cruiser Terralux - Anthracite",
"handle": "mens-cruiser-terralux-anthracite",
"productUrl": "https://www.allbirds.com/products/mens-cruiser-terralux-anthracite",
"currency": "USD",
"vendor": "Allbirds",
"productType": "Shoes",
"tags": "runner, mens, limited",
"price": 135,
"priceMax": 135,
"compareAtPrice": null,
"available": true,
"variantsCount": 12,
"sku": "A12400M080",
"optionsSummary": "Size",
"imagesCount": 5,
"featuredImage": "https://cdn.shopify.com/.../LEFT.png",
"images": "https://.../1.png, https://.../2.png",
"publishedAt": "2026-06-30T18:04:23-07:00",
"createdAt": "2025-08-06T16:52:33-07:00",
"updatedAt": "2026-07-03T02:53:15-07:00",
"description": "Crafted using bio-fabrication, designed for movement...",
"isNew": true
}

Output fields

FieldTypeWhenDescription
storeUrlstringAlwaysStore origin URL.
productIdnumberAlwaysShopify product ID.
titlestringAlwaysProduct title.
handlestringAlwaysProduct URL handle/slug.
productUrlstringAlwaysPublic product page URL.
currencystring | nullAlwaysISO currency code, from the store's cart.json.
vendorstring | nullAlwaysBrand/vendor name.
productTypestring | nullAlwaysStore-defined product type.
tagsstringAlwaysComma-separated tags.
publishedAt / createdAt / updatedAtstring | nullAlwaysISO timestamps.
descriptionstringAlwaysPlain-text description.
isNewbooleanAlwaysNot seen in a previous run (see below).
price (min) / priceMaxnumber | nullProduct mode (default)Price range across variants.
compareAtPricenumber | nullBoth modesHighest compare-at price.
availablebooleanBoth modesIn stock.
variantsCountnumberProduct modeNumber of variants.
skustring | nullBoth modesSKU (first variant in product mode).
optionsSummarystringProduct modeOption names, e.g. "Size, Color".
imagesCount / images / featuredImageProduct modeImage count, all URLs, and the featured image.
variantId / variantTitlenumber / string | nullVariant mode (expandVariants: true)Variant identity.
option1 / option2 / option3string | nullVariant modeVariant option values (size/color/etc.).
gramsnumber | nullVariant modeVariant weight.
requiresShipping / taxablebooleanVariant modeShipping/tax flags.
positionnumber | nullVariant modeVariant display order.
bodyHtmlstring(optional)Raw HTML description, only when includeBodyHtml is on.

Each row includes the store's currency (ISO code, read from the store's public cart.json). If you scrape multiple stores, prices are still each store's own amounts — use the currency column to interpret them.

🆕 New-product mode

Every row includes isNewtrue if that product/variant wasn't present the last time you ran this actor (tracked per Apify account, refreshed each run; your first run always shows isNew: true for everything). Turn on onlyNewProducts to output only newly-appeared items — ideal for a scheduled run that should alert you to new listings instead of re-delivering the whole catalog each time.

Note: this reflects whichever products were actually fetched. If a very large catalog gets truncated by a low maxItems before pagination finishes, later pages aren't checked that run — use a higher maxItems (or 0) together with onlyNewProducts for complete coverage. "Last seen" history is retained for 90 days of inactivity per item.


💡 Use cases

  • Competitor price & catalog monitoring — schedule daily runs with onlyNewProducts to catch new listings automatically.
  • Dropshipping / product research — pull thousands of products with prices and images.
  • Market & assortment analysis — analyze pricing, product types, and vendors at scale.
  • Store migration & backup — export a full catalog to move or archive it.
  • Lead lists for agencies — combine with other actors to enrich store data.

💳 Pricing (pay-per-event)

This actor uses transparent pay-per-event pricing:

EventPrice
Actor start$0.005 per run
Product scraped$0.001 per row (product or variant)

Scraping 1,000 products costs about $1.01. Set maxItems to cap your spend exactly.


❓ FAQ

Does this work on every Shopify store? It works on the vast majority of public Shopify storefronts, which expose a standard product feed. A small number of stores disable that feed; the actor automatically falls back to the store sitemap where possible.

Do I need an account or API key for the target store? No. It only reads publicly available product data — the same data any visitor's browser can load.

Can I scrape only a specific collection? This version scrapes the full store catalog. Filter by productType, tags, or vendor in your spreadsheet after export.

How do I get more than 100 products? Increase maxItems (or set it to 0 for the entire catalog).

How does "new product" tracking work across runs? Each run compares the current catalog against a per-account history of previously-seen product/variant IDs and refreshes it automatically — no setup needed.


This actor collects only publicly accessible product information. You are responsible for using the data in compliance with applicable laws and the target website's terms. It does not access private, personal, or authenticated data.