Shopify Store Products Scraper - Full Catalog Export
Pricing
from $8.00 / 1,000 results
Shopify Store Products Scraper - Full Catalog Export
Export any Shopify store's full product catalog: titles, variants, SKUs, prices, compare-at prices, stock, images, tags. Multi-store batch, collection filter, one-row-per-variant. JSON, CSV, Excel.
Pricing
from $8.00 / 1,000 results
Rating
0.0
(0)
Developer
Scrapers Lat
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Share
Shopify Store Products Scraper - Full Catalog Export
Here is one real result, with the fields the actor returns (one row per product):
{"storeDomain": "gymshark.com","productId": 6806612050122,"title": "Gymshark Cosy Campus Polo Sweatshirt - Bros Chalk Marl","handle": "gymshark-cosy-campus-polo-sweatshirt-pullovers-brown-aw26","vendor": "Gymshark | Be a visionary.","productType": "Womens>Apparel>Pullovers>crew","tags": ["13/08/26", "activity:Rest Day", "airport-outfits"],"createdAt": "2026-02-12T14:14:35-08:00","updatedAt": "2026-08-16T05:22:55-07:00","publishedAt": "2026-08-13T08:07:02-07:00","url": "https://gymshark.com/products/gymshark-cosy-campus-polo-sweatshirt-pullovers-brown-aw26","imageCount": 6,"featuredImage": "https://cdn.shopify.com/s/files/1/0156/6146/files/CosyLuxeCampusEditCollaredSweatshirtBROSChalkMarlB7B5R_NDLF_0174.jpg?v=1785830091","variantCount": 7,"minPrice": 60,"maxPrice": 60,"priceRange": "60","currency": null,"inStock": true,"onSale": false,"discountPercent": null,"totalInventory": null,"options": [{ "name": "Size", "values": ["Extra Small", "Small", "Medium", "Large", "Extra Large"] }],"variants": [{ "variantId": 39797352890570, "title": "Medium", "sku": "B7B5R-NDLF-M", "price": 60, "compareAtPrice": null, "available": true, "option1": "Medium", "option2": null, "option3": null },{ "variantId": 39797356331210, "title": "Large", "sku": "B7B5R-NDLF-L", "price": 60, "compareAtPrice": null, "available": true, "option1": "Large", "option2": null, "option3": null }],"observedAt": "2026-08-16T12:22:56.437Z","error": null}
Export the full public product catalog of any Shopify store: every product, every variant, SKUs, prices, compare-at prices, stock status, images, tags and options. Batch many stores in one run, limit to a single collection, and switch to one-row-per-variant for price and stock monitoring.
📥 Input · 📤 Output · 💰 Pricing · ▶️ Examples
Table of contents
- What it does
- Use cases
- Quickstart
- Input reference
- Output reference
- One row per variant
- Run via API and CLI
- Billing and limits
- FAQ and troubleshooting
What it does
Give the actor one or more Shopify store domains. For each store it reads the store's own public storefront product feed, paginates through the entire catalog, and writes one normalized record per product to the run's dataset. Every product includes its full variant list (title, SKU, price, compare-at price, availability, option values), image count and featured image, options, tags, and timestamps.
On top of the raw store data the actor derives fields you would otherwise compute yourself: minPrice, maxPrice, priceRange, inStock (true if any variant is available), onSale and discountPercent (from compare-at prices), variantCount, imageCount, and the public product url.
It accepts a domain in any common form: a bare domain (allbirds.com), a full URL (https://gymshark.com), or a myshopify subdomain (mystore.myshopify.com). Optional filters limit the run to a single collection, a product type, or a vendor.
Many Shopify stores block datacenter IP addresses. The actor defaults to Apify Residential proxy so those stores return data, and rotates the IP on a block. You can override the proxy in the input.
Two optional paid add-ons extend each run. The store profile add-on reads each store's public meta.json to return store-level context the product feed lacks, including the store currency, store name, country, city, myshopify domain, and published product and collection counts. The AI tags add-on uses AI to enrich every product with a clean category, sub-category, inferred material, target audience, and 5 to 8 SEO keywords buyers actually search for. Both are off by default, billed only on genuine success, and disabled for free plans.
Use cases
- Shopify product research and competitor catalog export for market and pricing analysis.
- Ecommerce price monitoring and stock tracking across many Shopify stores by SKU.
- Build a product feed for comparison shopping, affiliate, or dropshipping catalogs.
- Brand and vendor auditing: pull every product, variant, and compare-at price from a store.
- Sale and discount tracking to spot on-sale products and discount percentages in real time.
- Enrich a product dataset with AI category, material, target audience, and SEO keywords for merchandising and search.
- Normalize multi-store catalogs into one JSON, CSV, or Excel export for a data warehouse.
- Currency-aware pricing intelligence using the store profile add-on to attach the correct currency code.
Quickstart
Open the actor, paste this into the input, and press Run. It exports the first products from two stores.
{"storeUrls": ["allbirds.com", "gymshark.com"],"maxProductsPerStore": 50}
Input reference
| Field | Type | Description |
|---|---|---|
storeUrls | array | One or more Shopify store domains or URLs. Bare domain, https URL, or myshopify subdomain are all accepted. |
storeUrl | string | A single store domain/URL, as an alternative to storeUrls. |
collection | string | Optional collection handle (e.g. mens, sale). Limits every store to that collection. |
productType | string | Optional. Keep only products whose product type matches (case-insensitive). |
vendor | string | Optional. Keep only products whose vendor matches (case-insensitive). |
oneRowPerVariant | boolean | Off (default) = one row per product with a nested variants array. On = one row per variant. |
withStoreProfile | boolean | Off by default. Paid add-on ($0.012 per store): fetches each store's meta.json to add store profile context including currency, store name, country, city, myshopify domain, and product/collection counts, as one extra store_profile row per store. Charged only on usable data. Disabled for free users. |
withAiTags | boolean | Off by default. Paid AI add-on ($0.012 per product): adds AI category, sub-category, material, target audience, and 5-8 SEO keywords per product. Charged only on usable AI output. Disabled for free users. |
maxProductsPerStore | integer | Max products to capture per store. Empty = whole catalog. |
maxProducts | integer | Max products across all stores combined. Empty = no limit. |
proxyConfiguration | object | Proxy settings. Defaults to Apify Residential. |
Output reference
One row per product (default mode):
| Field | Description |
|---|---|
storeDomain | Store the record came from. |
productId | Shopify product id (unique within the store). |
title, handle, vendor, productType | Core product attributes. |
tags | Array of product tags. |
createdAt, updatedAt, publishedAt | Product timestamps. |
url | Public product page URL. |
imageCount, featuredImage | Image count and primary image URL. |
variantCount | Number of variants. |
minPrice, maxPrice, priceRange | Price summary across variants. |
currency | null from the base feed. Filled with the real currency code when the store profile add-on is enabled (see below). |
inStock | True if any variant is available. |
onSale, discountPercent | Derived from compare-at prices. |
totalInventory | Sum of variant inventory when the store exposes it, else null. |
options | Product options (name and possible values). |
variants | Nested array: variantId, title, sku, price, compareAtPrice, available, option1/2/3. |
aiCategory, aiSubCategory, aiMaterial, aiTargetAudience, aiKeywords | AI enrichment fields. null unless the AI tags add-on is enabled. aiKeywords is an array of SEO search phrases. |
observedAt | Capture timestamp. |
error | null on success. Set on an unbilled error row for a store that could not be read. |
When the store profile add-on is enabled, one extra store_profile row is written per store (recordType: "store_profile") with storeName, storeCountry, storeCity, storeProvince, storeCurrency, myshopifyDomain, productCount, and collectionCount.
One row per variant
Set oneRowPerVariant to true and each variant becomes its own row, flattened with its parent product fields plus variantId, variantTitle, sku, price, compareAtPrice, available, onSale, discountPercent and option1/2/3. This is the layout you want for price and stock monitoring or for loading into a spreadsheet or database keyed by SKU.
Run via API and CLI
# CLIapify call scrapers_lat/shopify-store-products-scraper --input='{"storeUrls":["allbirds.com"]}'# APIcurl -X POST "https://api.apify.com/v2/acts/scrapers_lat~shopify-store-products-scraper/runs?token=YOUR_TOKEN" \-H "Content-Type: application/json" \-d '{"storeUrls":["allbirds.com"],"maxProductsPerStore":100}'
Fetch the dataset once the run finishes:
$curl "https://api.apify.com/v2/datasets/DATASET_ID/items?clean=true&format=json"
Billing and limits
This actor is billed pay per result. You are charged one result event per output row (one per product, or one per variant in one-row-per-variant mode). Stores that cannot be read produce a single unbilled error row, so a broken or non-Shopify domain never costs you.
Two optional paid add-ons, both off by default and disabled for free users:
store_profile($0.012 per store), enabled withwithStoreProfile. Fetches the store's publicmeta.jsononce per store and writes onestore_profilerow with the store currency, name, country, city, myshopify domain, and product and collection counts. Charged once per store, only when usable data is returned.ai_tags($0.012 per product), enabled withwithAiTags. Uses AI to add a category, sub-category, material, target audience, and 5 to 8 SEO keywords per product. One model call per product, charged only when the model returns usable output.
Free Apify plans are capped at 10 output rows per run and cannot use the paid add-ons. Upgrade for the full catalog, higher volume, and the add-ons.
Currency note: the base Shopify storefront product feed does not include a currency code, so currency is null in the base result. Enable the store profile add-on (withStoreProfile) to resolve the store currency from its meta.json; the currency is then attached to the store_profile row as storeCurrency and filled into each product's currency field.
FAQ and troubleshooting
Which stores does this work on? Any store running on Shopify that leaves its public product feed enabled (the vast majority). A store that is not on Shopify, or that has disabled the feed, returns an unbilled error row.
Do I need an API key or login for the store? No. Only public catalog data is read. No account, password, or private token is required.
A store returned an error row. Why? Either it is not a Shopify store, its product feed is disabled, or it was temporarily blocking requests. Re-running with the default residential proxy usually resolves temporary blocks.
Can I monitor prices over time? Yes. Run on a schedule with oneRowPerVariant on and compare price and compareAtPrice per sku between runs.
How do I get only one collection? Set collection to the collection handle from its URL (/collections/<handle>).
Is inventory quantity included? Only when the store chooses to expose it. When it is hidden, totalInventory is null and variant availability is still reported via available.
