Shopify Product Scraper — Prices, Variants & Images
Pricing
from $1.00 / 1,000 product scrapeds
Shopify Product Scraper — Prices, Variants & Images
Collect supported public Shopify catalogs with returned product, variant, price and availability fields. No login. Bulk export: JSON, CSV, Excel and API. PPE: From $1/1K products; start fee extra.
Pricing
from $1.00 / 1,000 product scrapeds
Rating
0.0
(0)
Developer
Apivault Labs
Maintained by CommunityActor stats
1
Bookmarked
17
Total users
10
Monthly active users
8 hours ago
Last modified
Categories
Share
Shopify Product Scraper | Public Catalogs, Variants and SKU Exports
⚡ Use this Actor in n8n — no code
Building no-code workflows in n8n? Install our community node and drop this Actor straight onto your canvas:
📦
n8n-nodes-apivault-shopify-productSetup: in n8n go to Settings → Community Nodes → Install, paste
n8n-nodes-apivault-shopify-productand confirm → add the new node to your workflow → paste your Apify API token → fill in the input and run.
Collect public Shopify product catalogs from stores that expose /products.json, or fetch a specific product through /products/{handle}.json. Export titles, prices, variant SKUs, image URLs, tags, options and reported availability. No Shopify login or merchant API key is required; Apify API access uses your Apify token. Store restrictions and endpoint availability determine coverage.
✨ Why this is special
- Direct JSON requests without browser rendering; actual runtime depends on the source and requested scope
- 🎯 Structured data — no AI guessing, exact fields from Shopify
- Paginated catalog collection until an empty/short page, request failure or your product cap
- Publicly exposed variants with SKU, price and availability where supplied
- 🖼️ All image URLs per product
- 🏷️ Tags, vendor, product type, options
- 💰 Compare-at-price — spot discounts
- Explicit source restrictions: disabled endpoints, access blocks and request failures can limit output
Works on
Potential inputs are Shopify stores exposing public JSON. The following are example domains, not a guarantee of continuing endpoint access:
- Allbirds, Gymshark, Bombas, Kith, Death Wish Coffee
- Your favorite niche DTC brands
- Your competitors' stores
- Any custom domain hosted on Shopify Plus
Not sure if a store is Shopify? Try appending /products.json to its URL. Inspect that the response contains usable public product JSON; an accessible first page does not establish complete catalog coverage.
Input
Scrape entire catalog
{"storeUrls": ["https://allbirds.com"],"maxProducts": 500}
Scrape specific products
{"storeUrls": ["https://allbirds.com/products/wool-runner-mizzle-natural-white","https://gymshark.com/products/vital-seamless-2-0-sports-bra"]}
Flat mode (one row per variant — best for CSV export)
{"storeUrls": ["https://allbirds.com"],"flattenVariants": true,"onlyAvailable": true}
Multi-store competitive analysis
{"storeUrls": ["https://allbirds.com","https://rothys.com","https://vessiofficial.com"],"maxProducts": 100,"maxConcurrency": 3}
Input Parameters
| Field | Type | Required | Description |
|---|---|---|---|
storeUrls | string[] | ✅ | Store domains, product URLs, or bare domains. Mix freely. |
maxProducts | int | ❌ | Limit per store (0 = unlimited). Schema default: 1000; omitted direct API input falls back to 250 in the runtime. Set this explicitly. |
perPage | int | ❌ | Products per API page, max 250 (default: 250) |
flattenVariants | bool | ❌ | One row per variant (true) or per product with variants nested (false, default) |
onlyAvailable | bool | ❌ | Skip products where all variants are out of stock |
extractTitle / extractVendor / extractProductType / extractPrice / extractComparePrice / extractSku / extractDescription / extractTags / extractImages / extractVariants / extractOptions / extractDates / extractHandle | bool | ❌ | Toggle fields (all default true) |
maxConcurrency | int | ❌ | Parallel store fetches (default: 3) |
timeout | int | ❌ | HTTP timeout per request (default: 30) |
Output
Aggregate output illustration (one row per product — default)
{"success": true,"productId": 6616124981328,"handle": "trino-cozy-crew-heathered-onyx","productUrl": "https://allbirds.com/products/trino-cozy-crew-heathered-onyx","title": "Trino® Cozy Crew - Heathered Onyx","vendor": "Allbirds","productType": "Socks","description": "The Trino Cozy Crew is a breathable, odor-reducing sock...","tags": "allbirds::carbon-score => 5.9, FINAL SALE, shoprunner","price": "12.00","comparePrice": "24.00","priceMin": 12.00,"priceMax": 12.00,"sku": "PCC1HONU301","mainImage": "https://cdn.shopify.com/.../front.png","images": "https://cdn.shopify.com/.../front.png, https://cdn.shopify.com/.../back.png","options": "Size: [S (W5-7), M (W8-10 / M8), L (W11 / M9-12), XL (M13-14)]","variantsCount": 4,"variants": [{ "id": 39574630924368, "title": "S (W5-7)", "price": "12.00", "sku": "PCC1HONU301", "available": true }],"publishedAt": "2026-04-21T12:39:05-07:00","updatedAt": "2026-05-10T17:46:58-07:00","available": true}
Flat output illustration (one row per variant)
{"productId": 6616124981328,"title": "Trino® Cozy Crew - Heathered Onyx","variantId": 39574630924368,"variantTitle": "S (W5-7)","price": "12.00","comparePrice": "24.00","sku": "PCC1HONU301","option1": "S (W5-7)","option2": "","option3": "","variantAvailable": true,"variantGrams": 140,"vendor": "Allbirds"}
Both output records above are illustrative shapes, not a current live Allbirds response. Values and field availability must be checked on your run.
Use Cases
🏪 Dropshipping / Resellers
- Collect a bounded public catalog sample for comparison
- Compare advertised prices; margins require separate cost data
- Track price changes daily to spot discounts
📊 Competitive Intelligence
- Diff your catalog vs. competitor stores monthly
- Identify which SKUs competitors added/dropped
- Analyze pricing strategies across niches
🏷️ Price Monitoring & MAP Enforcement
- Brands: monitor retailers hosting your products on Shopify
- Compare observed prices with your own reviewed MAP rules outside the Actor
- Track compare-at-price for discount analysis
🛠️ Product Catalog Migration
- Prepare public product data for a reviewed migration workflow
- Create affiliate sites with real product data
- Build price-comparison sites
🧬 Product Research
- Analyze which vendor has the richest catalog
- Compare observed product-type distributions across your sample
- Mine SKU patterns for manufacturer intelligence
Pricing
Free $1.5 per 1,000 primary result events; paid plans $1 per 1,000 primary result events. Separately paid platform resources are active. Existing start/add-on events and result eligibility rules below still apply. Rates verified on 20 October 2026.
- $0.0015 on Free / $0.001 on paid plans per delivered Dataset row ($1.50 / $1 per 1,000 rows). Aggregate mode normally emits a product row; flat mode emits variant rows.
- Pay-per-event pricing plus a $0.00005 start event per GB (minimum one); Apify platform resources are paid by the user.
- Result charges correspond to delivered rows; failed fetches can still incur start/resource costs.
- 10,000 delivered rows = $15 on Free / $10 on paid plans in result events, before startup and platform usage. Flat variants can make row count exceed product count.
How it works
Shopify stores expose a public /products.json endpoint by default. This actor:
- Normalizes your input (store domain, product URL, or bare domain)
- Paginates through
/products.json?limit=250&page=Nuntil exhausted or cap hit - Parses structured product JSON (no AI, no browser)
- Optionally flattens variants to one row each
Runtime depends on store response times, catalog pages, configured concurrency and source restrictions. No fixed completion time is guaranteed.
Coverage depends on public endpoint access. A failed later page can leave a partial catalog. A successful Actor status does not certify that the full store inventory was collected.
Notes
- Shopify sites can disable or restrict
/products.json, resulting in 404 or other access responses - Inventory quantities (
inventory_quantity) are NOT exposed publicly — only availability (in/out of stock) - Product reviews are not part of this endpoint — use a dedicated reviews scraper
- Customer data is never exposed via
/products.json— this is product-only
Pro tips
- Daily monitoring: run on a schedule (Apify Scheduler), diff
updatedAt→ spot changes - Cross-store search: dump multiple competitors into one dataset, use Apify's filters
- Flatten + CSV: for spreadsheets, always use
flattenVariants: true - Store detection: to check if a domain is Shopify, test
domain.com/products.json?limit=1manually first
Shopify catalog extraction for practical workflows
Use this Shopify scraper when you already know the store domains or public product URLs. It collects product data, not store discovery, order history, customer details, sales estimates or inventory quantities. For a comparison project, keep each store in its own run or preserve productUrl so records can be attributed to the correct source.
| Goal | Suggested mode | Review before use |
|---|---|---|
| First catalog sample | Aggregate products with a small cap | Source URLs and title/price coverage |
| Spreadsheet of SKU variants | flattenVariants | Variant row count and variantAvailable |
| Selected product review | Exact product URL | Handle still exists and public JSON is accessible |
| Price comparison | Preserve prices and comparePrice | Source currency and matching SKU/variant |
| Repeated catalog review | Schedule plus external comparison | Partial fetches can resemble removals |
Start with three products
Set maxProducts explicitly to avoid different omitted-value defaults between Console schema initialization and raw API input. A small aggregate sample is easier to inspect before flattening a large number of variants.
{"storeUrls": ["https://www.fashionnova.com"],"maxProducts": 3,"perPage": 3,"flattenVariants": false,"maxConcurrency": 1}
Create a small variant export
One product may produce many variant rows. maxProducts caps source products
per input URL, not total Dataset rows. Use the run charge limit as an additional
spending control; this Actor does not expose a maxResults input.
{"storeUrls": ["https://www.fashionnova.com"],"maxProducts": 1,"perPage": 1,"flattenVariants": true,"onlyAvailable": true,"maxConcurrency": 1}
onlyAvailable is a product-level check: at least one variant must be
available. In flat mode, unavailable sibling variants can still be present.
Filter variantAvailable in the exported data if you need only available SKUs.
Product availability does not mean every size/color is purchasable.
Reduce descriptive payload
Field switches reduce output size, not the number of source products or the per-row price. Keep identity, price and SKU when preparing a pricing file.
{"storeUrls": ["https://www.fashionnova.com"],"maxProducts": 3,"perPage": 3,"extractDescription": false,"extractImages": false,"extractVariants": false,"extractOptions": false}
Price, field and coverage interpretation
Aggregate price, comparePrice and sku are taken from the first variant.
Price range fields are added only when exposed variant prices differ and can
be parsed. An absent range does not mean the price is zero. Currency is not
established by a currency field in this output: verify the store's currency
before combining prices across markets. A compare-at price is a source field,
not independent proof that a discount was previously available to a customer.
Flat mode repeats parent product fields alongside variantId, variantTitle, variantAvailable and option values. Aggregate mode retains nested variants when extractVariants is enabled. Use JSON to retain nesting; flat CSV is easier for spreadsheet review. Neither mode produces a guaranteed destination-ready import file. Images are source URLs, not a license to redistribute those assets.
API, MCP and repeatable exports
Use Actor apivault_labs/shopify-product-scraper through the Console, the linked
clients, or authenticated POST /v2/acts/JNpCUgDcPwRUrVdZj/runs. Keep your token
in a private credential/environment variable and an Authorization header, never
in shared URLs or copyable inputs. Pass the same JSON input and set a small
maxTotalChargeUsd run option. Poll the returned run ID, then read the returned
default Dataset ID. Add format=csv to the Dataset items request for CSV export.
An Apify MCP client can discover apivault_labs--shopify-product-scraper and
use the same bounded input. A tool's run response is not the result Dataset;
wait for completion and inspect actual rows. Downloading a stored Dataset does
not require a new paid Actor run.
For scheduled price monitoring, save dated runs and compare store+productId, adding variantId for flat exports. The Actor does not maintain change state or send alerts. Source timestamps describe the source product object, not sales, stock quantities or a verified time at which your selected field changed.
Shopify Product Scraper FAQ
Can it scrape every Shopify site? Only when the required public JSON is accessible. A Shopify-powered storefront can restrict those endpoints.
Can I assume an empty run means an empty store? No. Check the run log for HTTP, JSON and page failures. This version reports its operational count in the status/log and does not create a structured SUMMARY/ERRORS contract.
Are overlapping inputs deduplicated? Do not rely on cross-input deduplication. A store URL plus a product URL from that store can collect the same product. Choose non-overlapping inputs or deduplicate stored results before analysis.
What does a three-product test cost? In aggregate mode, three delivered rows have $0.0045 on Free / $0.003 on paid plans in result events, plus startup and user-paid resources. Flat mode can produce more than three paid rows from those same three products.
n8n and developer integrations
Use this Actor in your automation or application with the existing community integrations below. An Apify account and API token are required; Actor and platform charges follow the current pricing.
- n8n community node: n8n-nodes-apivault-shopify-product. Install package name
n8n-nodes-apivault-shopify-productin a self-hosted n8n instance that permits community packages. - Python client and examples: GitHub.
- n8n source and usage: GitHub.
These are community packages. Publication on npm does not establish n8n verification or availability in n8n Cloud. Review the linked package README for supported inputs and setup.