Shopify Products Scraper - Full Store Catalog, No Key
Pricing
$1.00 / 1,000 product returneds
Shopify Products Scraper - Full Store Catalog, No Key
Scrape the full catalog of any Shopify store. Shopify gives 250 products per page to anyone, with no key. This walks every page. Rows have the title, URL, vendor, type, tags, lowest and highest price and stock status. Each variant has its SKU, price and image URLs. $1.00 per 1,000 products.
Pricing
$1.00 / 1,000 product returneds
Rating
5.0
(1)
Developer
Dami's Studio
Maintained by CommunityActor stats
0
Bookmarked
4
Total users
0
Monthly active users
3 days ago
Last modified
Categories
Share
Shopify Products Scraper: the whole catalog of any Shopify store
Give it a store URL and get one row per product: title, handle, link, vendor, product type, tags, description, lowest and highest price, stock flag, and every variant with its own SKU, price, compare-at price and availability, plus the image URLs.
It reads the catalog feed every Shopify store publishes, so there is nothing to apply for and no key to hold. The limit worth knowing up front: it returns published products only, and inventory counts are not in that feed. You get a yes or no on stock, never a number.
| Input | Shopify store URLs or bare domains |
| Output | One row per product, with variants nested |
| Ceiling | Whatever the store publishes, capped by maxItems per store |
| Account needed | None, and no API key |
| Price | $1.00 per 1,000 products, flat on every plan |
📦 What Shopify Products Scraper does
Paste stores, one per line. A bare domain, a full URL, or any page on the store: each one is reduced to the store itself and the catalog is walked from the top, 250 products at a time, until it runs out or hits your cap.
If a store answers on www but not on the bare domain, or the other way round, both are tried
before it gives up.
Optional Notion delivery. Pick a Notion connector and every product is also written as a page into your workspace when the run finishes. Leave it empty and nothing changes; the dataset is always written either way.
📥 What you give it
{"storeUrls": ["https://www.gymshark.com", "allbirds.com"],"maxItems": 1000}
| Field | Default | What it is |
|---|---|---|
storeUrls | box holds two example stores | Bare domains, full URLs, or any page on the store, one per line. |
maxItems | 1000 | How many products to take per store before moving on. You are charged per product returned, so this is your spend cap. |
notionConnector | empty | Optional. Authorise a Notion connector once under Settings, then pick it here to have the products written into your workspace. |
notionParentId | empty | Optional. The Notion data source id to write into. Leave it empty and the pages are created privately in your workspace. |
proxyConfiguration | leave it alone | Optional, and not needed for a normal run. Only fill this in if you want the run to go out through your own servers. |
Leave the store box empty and you get one BAD_INPUT row, uncharged, telling you so.
📤 What you get back
A real product row from a recent run. The tags, description and images are all cut short here.
{"ok": true,"store": "https://gymshark.com","productId": "6806502867146","title": "Gymshark Diffuse Sweat Headwrap - Black","handle": "gymshark-diffuse-sweat-headwrap-headwear","url": "https://gymshark.com/products/gymshark-diffuse-sweat-headwrap-headwear","vendor": "Gymshark | Be a visionary.","productType": "Unisex>Accessories>Headwear>headband","tags": ["accessories", "category:Headwear", "feature:sweat-wicking", "filter-colour:Black", "outlet", "over-50-off", "season:SS26", "..."],"description": "A HEADWRAP THAT WORKS\nWe built the Diffuse Sweat Headwrap with the black community and all hair types in mind ...","createdAt": "2026-01-09T04:26:28-08:00","publishedAt": "2026-09-11T10:14:04-07:00","priceMin": 26,"priceMax": 26,"available": true,"variantCount": 1,"variants": [{"title": "One Size", "sku": "I1C2W-BB2J-OS", "price": 26, "compareAtPrice": null, "available": true}],"images": ["https://cdn.shopify.com/s/files/1/0156/6146/files/Diffuse_Sweat_Headwrap_GS_Black_I1C2W_BB2J_6.jpg?v=1789139459", "..."]}
| Field | What it is |
|---|---|
productId, handle | Shopify's own id and URL slug. productId is the key to join on between runs. |
priceMin, priceMax | The cheapest and dearest variant, as numbers. Equal when there is only one. |
available, variantCount | Whether any variant is in stock, and how many variants there are. |
variants | Each variant's name, SKU, price, compare-at price and its own stock flag. |
compareAtPrice | The crossed-out price, when the store set one. null otherwise, which is most of the time. |
tags | The store's own tags, exactly as they set them. Big retailers use these for internal bookkeeping, so expect noise. |
description | The product copy as plain text, with the HTML stripped out. |
createdAt, publishedAt | When the product was made and when it went live. Useful for spotting new arrivals. |
images | Full-size image URLs. The files themselves stay on Shopify. |
🧾 Reading the output
Two kinds of row can land in your dataset.
| Row | How to spot it |
|---|---|
| A product | ok is true and it has a productId |
| A diagnostic | ok is false and it carries an errorCode |
Diagnostic rows are never charged.
| Code | What it means |
|---|---|
BAD_INPUT | Nothing usable in the store box. |
NOT_SHOPIFY | The catalog feed did not answer. The row carries triedHosts so you can see what was attempted. A store that turned the feed off, or one behind a password, lands here too. |
NO_RESULTS | The store answered with an empty catalog. |
RATE_LIMITED, SERVER_ERROR | The store asked for a slower pace, or its own server erred. Worth one re-run. |
BLOCKED, NETWORK | The store would not serve the request, or was unreachable. |
▶️ How to run it
- Open Shopify Products Scraper and click Try for free.
- Paste your stores into Shopify store URLs, one per line.
- Set Max products per store to what you actually need.
- Click Start.
- Download the dataset as JSON, CSV or Excel, or read it from the Apify API.
💰 How much does it cost?
$1.00 per 1,000 products. Flat on every Apify plan, no volume tiers.
One row is one product, however many variants hang off it. Diagnostic rows are not charged, so a store that will not answer produces nothing to pay for.
One thing to watch: the store list is taken as written. List the same shop twice and it is read twice and charged twice, so deduplicate before you paste.
💡 What people use it for
- Pulling a competitor's full catalog with prices and SKUs, then diffing it weekly.
- Watching
compareAtPriceagainstpriceto see when a store actually discounts. - Spotting new arrivals by sorting on
publishedAt. - Building a supplier or dropshipping feed with images and variant SKUs already on the row.
- Checking which of your own products show as out of stock across regional storefronts.
🚧 What it does not do
- No inventory numbers. The public feed carries a stock flag, not a quantity.
availableis all there is. - Published products only. Drafts, archived products and anything hidden from the storefront are not in the feed.
- A collection URL scrapes the whole store. Any page you paste is reduced to the store itself,
so
/collections/salereturns the full catalog, not the sale. - A store with the feed switched off comes back as
NOT_SHOPIFY. Some shops turn it off, and password-protected stores answer the same way, so the verdict is not always about the platform.triedHostson the row shows what was attempted. - A truncated catalog can look complete. If a store stops answering partway through, that store ends quietly with the products it had. If a count looks short against what the shop shows, run it again.
- Prices are the store's own currency, as the feed publishes them. There is no conversion and no currency field on the product row.
- Duplicate store URLs are not merged. Two entries for one shop means two passes.
🧭 Which product scraper do you need?
| If you want | Use |
|---|---|
| Every product in a Shopify store's catalog | This one |
| To confirm a domain is Shopify and get its contact details | Shopify Store Leads |
| Products, prices and reviews on Amazon | Amazon Scraper |
| Wholesale products and suppliers on Alibaba.com | Alibaba.com Scraper |
❓ Questions people ask
Do I need a Shopify account or an API key? No. The catalog feed is public on every store that leaves it on.
Can I scrape just one collection? Not here. Whatever page you paste, the whole store is read.
Filter on productType or tags afterwards.
How many products can one run take? As deep as the store goes. maxItems is your own cap, and
it is also your spend cap.
Why do the tags look like nonsense? Because they are the store's internal labels. Big retailers put dates, buckets and workflow markers in there alongside the useful ones.
Can I get it into Notion automatically? Yes. Authorise a Notion connector in your Apify settings and pick it in Notion connector. The dataset is written either way.
Is scraping a Shopify catalog legal? These are public product listings. Apify's write-up on scraping and the law is a good place to start, and we are not lawyers.
🆘 If something breaks
Open the Issues tab on the actor page. Send the store URL and the run ID. The errorCode and
triedHosts on the diagnostic row usually name the problem on their own.