Shopify Products Scraper
Pricing
from $1.30 / 1,000 products
Shopify Products Scraper
Extract complete product catalogs from any Shopify store — titles, prices, variants, SKUs, inventory, images, and tags. Works on 4M+ stores worldwide with zero proxy cost.
Pricing
from $1.30 / 1,000 products
Rating
0.0
(0)
Developer
Unfenced Group
Maintained by CommunityActor stats
1
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Share

Extract complete product catalogs from any Shopify-powered store — titles, prices, variants, SKUs, inventory, images, and tags. Works on 4M+ stores worldwide with zero proxy cost required.
Why this scraper?
🛍️ Universal Shopify support
Any store on the Shopify platform can be scraped — from small indie brands to large retailers. Supply one domain or a list of dozens for batch extraction.
📦 Full variant coverage
Every size, colour, and option is captured as a structured variant record — including price, compare-at price, availability flag, SKU, and position.
📊 Inventory-level data
Enable fetchDetails to retrieve per-variant inventory quantities, barcodes, and weights from product detail pages.
💸 Discount detection
The hasDiscount flag and compareAtPrice per variant make sale-monitoring workflows trivial.
🗂️ Collection-scoped runs
Restrict extraction to a specific product collection (e.g. mens-shoes, sale) for targeted monitoring without scraping an entire catalogue.
⚡ High throughput, zero proxy cost
Built on Shopify's public JSON API — no browser rendering, no proxy spend. Typical stores yield 250 products per second in list-only mode.
Input parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
domains | string list | — | Shopify store domains to scrape, e.g. allbirds.com |
startUrls | URL list | — | Alternative to Domains — paste store URLs |
maxProducts | integer | 5 | Max total products across all stores (0 = unlimited) |
fetchDetails | boolean | false | Enrich with inventory qty, barcode, weight |
collectionHandle | string | — | Scope to a collection, e.g. mens-shoes |
includeOutOfStock | boolean | true | Include products where all variants are unavailable |
Output schema
Always present
| Field | Type | Description |
|---|---|---|
productId | string | Shopify product ID |
title | string | Product title |
handle | string | URL-friendly slug |
vendor | string | Brand / manufacturer |
productType | string | Store-defined category |
tags | array | Product tags |
url | string | Full product URL |
descriptionHtml | string|null | Raw HTML description |
descriptionText | string|null | Plain-text description |
descriptionMarkdown | string | Full description converted to Markdown. |
publishedAt | string | ISO date published |
createdAt | string | ISO date created |
updatedAt | string | ISO date last updated |
options | array | Option names and values (size, colour, etc.) |
images | array | Image URLs with dimensions |
variants | array | All variants (see below) |
variantCount | integer | Total number of variants |
minPrice | string | Lowest variant price |
maxPrice | string | Highest variant price |
hasDiscount | boolean | True if any variant has a compare-at price |
store | string | Source store domain |
contentHash | string | MD5 of handle+updatedAt for change detection |
scrapedAt | string | ISO datetime of extraction |
Variant fields (always present)
| Field | Type | Description |
|---|---|---|
variantId | string | Shopify variant ID |
title | string | Variant title (e.g. "M / Black") |
option1/2/3 | string|null | Raw option values |
sku | string|null | Stock-keeping unit |
price | string | Variant price |
compareAtPrice | string|null | Original price (if on sale) |
available | boolean | In-stock flag |
position | integer | Display order |
imageId | string|null | Associated image ID |
Additional variant fields with fetchDetails: true
| Field | Type | Description |
|---|---|---|
inventoryQuantity | integer|null | Units in stock |
barcode | string|null | EAN/UPC barcode |
weight | number|null | Physical weight |
weightUnit | string|null | lb, kg, g, or oz |
inventoryPolicy | string|null | deny or continue |
requiresShipping | boolean|null | Physical product flag |
Example output record
{"productId": "6616124981328","title": "Trino® Cozy Crew - Heathered Onyx","handle": "trino-cozy-crew-heathered-onyx","vendor": "Allbirds","productType": "Accessories","tags": ["merino-wool", "socks", "unisex"],"url": "https://www.allbirds.com/products/trino-cozy-crew-heathered-onyx","descriptionHtml": "<p>The Trino Cozy Crew is a breathable, odor-reducing sock...</p>","descriptionText": "The Trino Cozy Crew is a breathable, odor-reducing sock...","publishedAt": "2021-10-22","createdAt": "2021-10-22","updatedAt": "2026-06-04","options": [{ "name": "Size", "values": ["S (W5-7)", "M (W8-10)", "L (W11-13)"] }],"images": [{ "src": "https://cdn.shopify.com/...", "width": 800, "height": 800, "position": 1 }],"variants": [{"variantId": "39574630924368","title": "S (W5-7)","option1": "S (W5-7)","sku": "PCC1HONU301","price": "24.00","compareAtPrice": null,"available": true,"position": 1,"imageId": null}],"variantCount": 4,"minPrice": "24.00","maxPrice": "24.00","hasDiscount": false,"store": "www.allbirds.com","contentHash": "a3f9c12e45b6d7e8","scrapedAt": "2026-06-04T08:30:00.000Z"}
Examples
Extract first 100 products from a single store:
{ "domains": ["allbirds.com"], "maxProducts": 100 }
Full catalogue with inventory quantities:
{ "domains": ["allbirds.com"], "maxProducts": 0, "fetchDetails": true }
Scope to the sale collection only:
{ "domains": ["gymshark.com"], "collectionHandle": "sale", "maxProducts": 500 }
Batch run across multiple stores:
{"domains": ["allbirds.com", "gymshark.com", "hiut.com"],"maxProducts": 1000,"fetchDetails": false}
In-stock products only, with price monitoring fields:
{"domains": ["allbirds.com"],"maxProducts": 0,"includeOutOfStock": false,"fetchDetails": true}
Daily catalog sync (run on a schedule):
{"startUrls": [{"url": "https://www.allbirds.com"}],"maxProducts": 500}
Schedule this input to run once a day in the Apify Scheduler to keep a synced copy of the store's catalog and catch price changes.
💰 Pricing
$1.49 per 1,000 results — you only pay for successfully extracted products. Failed stores and skipped out-of-stock items are never charged.
| Results | Cost |
|---|---|
| 100 | ~$0.15 |
| 1,000 | ~$1.49 |
| 10,000 | ~$14.90 |
| 100,000 | ~$149.00 |
Flat-rate Shopify intelligence tools typically charge $29–$99/month regardless of usage.
Use the Max products cap to control your spend exactly.
Performance
| Run size | Approx. time (list-only) | Approx. time (fetchDetails) |
|---|---|---|
| 250 products | ~3s | ~4 min |
| 1,000 products | ~10s | ~15 min |
| 10,000 products | ~1.5 min | ~2.5 hrs |
Performance varies by store size, product count, and server response time.
Known limitations
- Stores built on Shopify Hydrogen (custom headless storefronts) do not expose
/products.json. The actor detects these automatically and logs a clear message. - Password-protected stores require credentials not supported in this actor.
- Some very large enterprise stores (>50k products) may apply rate limits — the actor handles these with automatic backoff.
inventory_quantityrequiresfetchDetails: trueand is significantly slower.
Technical details
- Zero proxy cost — Shopify's public JSON API requires no browser and no proxy on the vast majority of stores
- Automatic store detection — headless and password-protected stores are identified before crawling begins
- Efficient pagination — retrieves 250 products per API call (Shopify's maximum page size)
- Exponential backoff — automatic retry on rate limits and server errors
- Change detection — every product includes a
contentHashderived from handle and last-updated timestamp
Additional services
Need custom integrations, scheduled runs, or data delivered to your warehouse? Contact us via the Apify messaging system.
Related scrapers
Other scrapers in our General Marketplaces & Retail collection:
- Amazon Seller Scraper
- eBay Scraper
- Walmart Scraper
- MediaMarkt & Saturn Scraper for Product Prices
- AliExpress Scraper
Run it on a schedule
This actor is built for repeat use. Set it to run daily, weekly, or hourly, and the data keeps flowing without you touching it.
- Schedule runs — open the actor, go to Schedules, and pick a cadence. Each run only charges you for the results it returns.
- Connect it to your stack — push results straight to Google Sheets, Slack, a webhook, or your database using Apify Integrations. No glue code needed.
- Pull results via API — every run writes a clean dataset you can fetch with one API call, ready for whatever you build on top of it.
Set it once and it runs on its own.
Need a custom scraper?
Unfenced Group builds Apify actors for any website — for free.
If the site you need isn't in our portfolio yet, just ask. We scope, build, and publish it at no cost to you. You only pay for results — we absorb the compute and proxy costs ourselves. Same pay-per-result pricing, same quality, same standards as every actor in this portfolio.
Get in touch: www.unfencedgroup.nl