Shopify Product Scraper
Under maintenancePricing
from $0.80 / 1,000 products
Shopify Product Scraper
Under maintenanceExtract every product from any Shopify store: titles, prices, variants, stock, images, tags. Automatic whole-catalog pagination, four fallback extraction methods, honest failure reporting, no browser. Export to Excel, CSV, or JSON. Pay per result - you only pay for products delivered.
Pricing
from $0.80 / 1,000 products
Rating
0.0
(0)
Developer
electra bot
Maintained by CommunityActor stats
0
Bookmarked
1
Total users
1
Monthly active users
6 days ago
Last modified
Categories
Share
Extract the full product catalog from almost any public Shopify store — titles, descriptions, vendors, product types, tags, images, and every variant (price, compare-at price, SKU, availability) — and download the results as Excel, CSV, or JSON.
No code required. Paste a store address, click Start, done.
Pay per result — you're only charged for products actually scraped, never for failed or empty runs.
What can I use it for?
- Competitor & market research — pull a rival store's entire catalog with prices and stock status in minutes.
- Price monitoring — schedule runs and track price / compare-at-price changes over time.
- Dropshipping & sourcing — evaluate a supplier's assortment, variants, and availability before committing.
- Catalog migration & syncing — export a complete, structured product feed from any Shopify storefront.
- Feed building — generate product feeds for ads, affiliate sites, or search indexes.
Input
| Field | Required | Description |
|---|---|---|
| Store URL or handle | ✅ | Any of: a myshopify handle (bajaao), a custom domain (tentree.com), or a full URL (https://www.allbirds.com) |
| Max items | – | Maximum products to collect. Leave empty (or 0) to scrape the entire store catalog. Set e.g. 500 to stop early. |
| Starting page (advanced) | – | Override the starting catalog page. Leave at 1. |
| Proxy configuration | – | Off by default — most stores don't need it. Enable Apify Proxy (datacenter is enough) only if a store rate-limits you; residential only as a last resort. |
Output
One dataset record per product. Example (shortened):
{"id": 4808578760765,"title": "Men's Tree Runners","handle": "mens-tree-runners","description": "Light, breathable everyday sneakers made from eucalyptus tree fiber.","vendor": "Allbirds","productType": "Shoes","tags": ["men", "sneakers", "tree"],"publishedAt": "2024-03-12T09:00:01-07:00","options": [{ "name": "Size", "position": 1, "values": ["8", "9", "10"] }],"images": [{ "src": "https://cdn.shopify.com/s/files/1/.../TR1MBBW.png","width": 1600, "height": 1600, "position": 1, "variantIds": [] }],"variants": [{"id": 32924009496637,"title": "8","sku": "TR1MBBW080","price": "98.00","compareAtPrice": null,"available": true,"option1": "8", "option2": null, "option3": null,"grams": 340,"barcode": null,"requiresShipping": true,"taxable": true,"position": 1,"featuredImage": null}],"url": "https://allbirds.com/products/mens-tree-runners","createdAt": "2024-03-10T11:02:44-07:00","updatedAt": "2026-07-01T02:14:09-07:00","source": "products.json"}
Product-level fields
| Field | Description |
|---|---|
title | Product name |
handle | Shopify URL slug |
description | Plain-text description (HTML stripped, entities decoded) |
vendor | Brand / vendor |
productType | Shopify product type |
tags | List of tag strings |
publishedAt | ISO timestamp of when the product was published |
options | Product option definitions, e.g. [{"name":"Size","position":1,"values":["S","M","L"]}] |
images | List of image objects: {"src","width","height","position","variantIds"} |
variants | List of variant objects (see below) |
url | Direct link to the product page |
createdAt / updatedAt | Timestamps (when available) |
source | Which extraction method found the product |
Variant-level fields (inside variants)
| Field | Description |
|---|---|
id | Variant ID |
title | Variant title |
sku | Stock-keeping unit |
price | Variant price (string) |
compareAtPrice | Compare-at / original price (string, or null) |
available | Whether the variant is in stock |
option1 / option2 / option3 | Structured option values (e.g. "Red", "Large") |
grams | Weight in grams |
barcode | Barcode / GTIN (null when the store doesn't publish it) |
requiresShipping | Whether shipping is required |
taxable | Whether the variant is taxable |
position | Display position within the product |
featuredImage | URL of the variant's featured image (or null) |
Why this scraper is reliable
Four extraction methods, tried in order — it keeps working even when a store has one method locked down:
- products.json — Shopify's public product feed (fastest, most complete).
- Storefront GraphQL — the store's own public storefront API.
- Collections + product pages — reads the catalog listing and each product page.
- Embedded data — reads product data embedded directly in the page HTML.
Honest run statuses — you always know what you got:
- ✅ Succeeded — the full requested catalog was scraped.
- ⚠️
PARTIAL: …status message — the store blocked or rate-limited the run partway; everything scraped up to that point is in the dataset, and the message says so. A truncated catalog is never silently passed off as a complete one. - ❌ Failed — no products could be extracted; the run is clearly marked failed with the reason. It will never quietly finish "successful" with an empty dataset.
Data you don't lose:
- Products are saved incrementally as each page is fetched — a timeout or abort never loses what was already collected.
- Long whole-store runs are checkpointed: if Apify migrates or restarts the run, it resumes from the last completed page instead of starting over (so you don't pay twice).
- Rate limits (HTTP 429) are retried automatically with polite backoff before the scraper ever gives up on a method.
Fast and cheap by design: no headless browser — pure HTTP with a realistic browser fingerprint. Typical speed is hundreds of products per second on the primary method, which keeps compute usage (and your cost) low.
Tips & limits
- Works best on standard, public Shopify storefronts. Password-protected or heavily customized stores may return fewer (or no) products — in that case the run tells you instead of pretending.
- Each internal page fetches up to 250 products (Shopify's maximum). Pagination is
automatic; just set
maxItemsor leave it empty for the full catalog. products.jsononly exposes published, publicly visible products — draft or hidden products are not (and cannot be) included.- Be respectful: only scrape publicly available data and follow the target site's terms.
FAQ
Do I need a proxy? Usually no — Shopify's product feed is public and this scraper is polite by default. If a specific store rate-limits you, enable Apify Proxy (datacenter) in the input.
How do I scrape an entire store? Leave Max items empty. The actor paginates through the whole catalog automatically.
Can it scrape prices in my currency? Prices are returned exactly as the store publishes them in its primary currency.
Can it access wholesale, draft, or password-protected products? No. It only reads what the store makes publicly available — nothing behind a login.
Is scraping public product data legal? This actor only accesses publicly available information. You are responsible for ensuring your use complies with applicable laws and the target website's Terms of Service.
Something didn't work — what now? Check the run's status message first (it always states the reason). Feel free to open an issue on the actor's Issues tab with the store URL and run ID — reliability reports are handled with priority.
Disclaimer
This is an unofficial tool. It is not affiliated with, endorsed by, sponsored by, or in any way officially connected to Shopify Inc. or any of the stores it can be pointed at. "Shopify" and all related names, marks, and logos are trademarks of their respective owners and are used here for descriptive purposes only.
This actor only accesses publicly available information. You are responsible for ensuring your use complies with applicable laws, the target website's Terms of Service, and any applicable robots and rate-limiting rules. Use it ethically and at your own risk.