Shopify Store Scraper - Full Product Catalog Export
Pricing
Pay per event
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
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
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 ononlyNewProductsto 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
maxItemsto cap exactly how much you scrape.
🚀 Quick start
- Paste one or more Shopify store URLs into Store URLs.
- (Optional) Set Max items and toggle Expand variants.
- 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 }}
| Field | Type | Default | Description |
|---|---|---|---|
storeUrls | array | (required) | Store URLs. A homepage URL scrapes the whole catalog; a collection URL (.../collections/sale) scrapes just that collection. |
maxItems | integer | 100 | Max dataset rows to scrape across all stores. 0 = no limit. |
expandVariants | boolean | false | One row per variant (size/color) instead of one row per product. |
includeBodyHtml | boolean | false | Include the raw HTML product description in a bodyHtml field. |
onlyNewProducts | boolean | false | Monitor mode — only output products not seen in a previous run. |
proxyConfiguration | object | Apify 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
| Field | Type | When | Description |
|---|---|---|---|
storeUrl | string | Always | Store origin URL. |
productId | number | Always | Shopify product ID. |
title | string | Always | Product title. |
handle | string | Always | Product URL handle/slug. |
productUrl | string | Always | Public product page URL. |
currency | string | null | Always | ISO currency code, from the store's cart.json. |
vendor | string | null | Always | Brand/vendor name. |
productType | string | null | Always | Store-defined product type. |
tags | string | Always | Comma-separated tags. |
publishedAt / createdAt / updatedAt | string | null | Always | ISO timestamps. |
description | string | Always | Plain-text description. |
isNew | boolean | Always | Not seen in a previous run (see below). |
price (min) / priceMax | number | null | Product mode (default) | Price range across variants. |
compareAtPrice | number | null | Both modes | Highest compare-at price. |
available | boolean | Both modes | In stock. |
variantsCount | number | Product mode | Number of variants. |
sku | string | null | Both modes | SKU (first variant in product mode). |
optionsSummary | string | Product mode | Option names, e.g. "Size, Color". |
imagesCount / images / featuredImage | — | Product mode | Image count, all URLs, and the featured image. |
variantId / variantTitle | number / string | null | Variant mode (expandVariants: true) | Variant identity. |
option1 / option2 / option3 | string | null | Variant mode | Variant option values (size/color/etc.). |
grams | number | null | Variant mode | Variant weight. |
requiresShipping / taxable | boolean | Variant mode | Shipping/tax flags. |
position | number | null | Variant mode | Variant display order. |
bodyHtml | string | (optional) | Raw HTML description, only when includeBodyHtml is on. |
Each row includes the store's
currency(ISO code, read from the store's publiccart.json). If you scrape multiple stores, prices are still each store's own amounts — use thecurrencycolumn to interpret them.
🆕 New-product mode
Every row includes isNew — true 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
onlyNewProductsto 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:
| Event | Price |
|---|---|
| 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.
⚖️ Legal
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.