Request a tool
All toolsAutomationsGuidesMCP serverRequest a toolPlatformsCategories
Shopify Products Scraper icon

Shopify Products Scraper

Scrape any Shopify store's catalog: titles, prices, variants, SKUs, stock, tags and images. No API key. $1.00 per 1,000 products.

5 from 1 review on Apify 302 runs on Apify $0.001 per product ($1 / 1,000)
Run this in the cloudRun on Apify →

E-commerce & Price Tools

How it works

  1. 1
    Open it on Apify

    Hit Run on Apify — it opens the tool in the cloud, no install.

  2. 2
    Set the inputs

    Adjust storeUrls, maxItems, sortBy (sensible defaults are pre-filled).

  3. 3
    Click Run

    The tool runs on Apify’s cloud and collects the data for you.

  4. 4
    Export the results

    Download as JSON, CSV or Excel, or pipe straight into your app, Google Sheets, or an AI agent.

Pricing

$0.001 per product = $1 per 1,000

You are charged forWhenPrice
Product returnedCharged per product returned.$0.001
Product read for sortingCharged for each product read to sort the store's catalogue but not delivered. Only applies when you pick a sort order.$0.00006

Pay-per-event pricing: you are billed per result, not per subscription. Billing is handled by Apify on your own account. These are the live Apify store prices, in effect since 2026-10-01, and they are what you are actually charged.

Inputs

FieldWhat it doesType
storeUrlsOne or more Shopify stores to scrape. Accepts a bare domain (shop.com), a full URL (https://shop.com), or any page on the store (https://shop.com/collections/sale), each is normalized to the store origin. Each store's public /products.json endpoint is paginated.array
maxItemsMaximum number of products to scrape per store before moving on. Products are paged in batches of 250 until this cap or the catalog is exhausted.integer
sortByLeave empty to get each store's products in the store's own order. Pick an order and the run reads up to 10,000 products of each store, then returns the first ones by that order, up to Max products per store. Cheapest and dearest go by the lowest and highest variant price, newest by the date the product was created. Each product read and left out is billed as a checked product: see the Pricing tab.string
notionConnectorOptional. Write each product as a page into your Notion when the run finishes. Authorize a Notion connector once in Settings → API & Integrations → MCP connectors, then pick it here. Leave empty to skip (default), results are always saved to the dataset regardless.string
notionParentIdOptional. The Notion data source ID of the database to write into (only used if a Notion connector is set). Leave empty to create the pages privately in your workspace instead.string

What you get

A structured dataset — each result includes fields like:

availablecreatedAtdescriptiondetailshandleimagesinputStorepriceMaxpriceMinproductIdproductTypepublishedAtstoretagstitlevendorurl

Export every run as JSON, CSV or Excel, or send it to your app, a database, Google Sheets, or an AI agent.

19 ready-to-run use cases

Find Winning Dropshipping Products on Shopify

Sort a rival's catalog by newest and see what they just added, with prices and images. It shows what is listed, never how many units anyone sold.

Shopify New Arrivals Collection, Logged Every Run

Point it at a brand's new-arrivals collection and each run captures what is in it, with price and images. Compare two runs to see what launched.

MAP Price Monitoring Across Reseller Shopify Stores

Scan reseller catalogs for anything listed under your floor. Each variant carries price and compareAtPrice, which is the evidence you attach to the notice.

Google Merchant Center Feed from a Shopify Catalog

Titles, prices, availability and image URLs per product, shaped to map into a Shopping or Meta feed. The field mapping still happens in Merchant Center.

Shopify API Products as a Dataset for RAG and Agents

A store's products.json turned into rows with description, variants, prices and image links. Images come back as URLs, not downloaded files.

Sneaker Restock Monitor for Shopify Boutiques

Watch footwear collections on Shopify boutiques like Kith and Bodega. Each run records what is listed and in stock. It does not buy or queue anything.

Shopify Sale Collection: See How Deep They Discount

Pulls a rival's sale collection and puts price next to compareAtPrice on every variant. Where a store leaves compareAtPrice empty there is no discount to read.

Shopify Store Analyzer: Catalog Size and Price Tiers

Pull a DTC brand's whole catalog once and you have its category mix, vendor spread and where the price bands sit. Sales figures are not in the feed.

Shopify Image Scraper: Every Product Image URL

All the image URLs a store publishes per product, in bulk. URLs only: no alt text, no image dimensions, and the files themselves are not downloaded.

Shopify Out of Stock and Restock Watch for Beauty

Each variant reports available true or false, so repeat runs show which shades sold out and which came back. Rare Beauty and Kosas are the defaults.

Competitor Price Monitoring Across Shopify Stores

One category pulled from several rival Shopify stores in a single run, with min and max price per product, so the gaps show up in one sheet.

Shopify Wholesale and B2B Catalog Prices as Data

Pull a wholesale Shopify catalog for assortment and price benchmarking. Only what the storefront shows publicly; gated trade pricing stays hidden.

Shopify Brand List: New Vendors on a Retailer's Site

Every product row carries its vendor, so re-running the pull shows which brands a multi-brand Shopify retailer has started stocking since last time.

Shopify Product Tags and Types Pulled for SEO Work

The tags, product types and titles a competitor actually uses, in rows you can count and sort. Useful when your own tag taxonomy has gaps you cannot see.

Price History Tracker for Several Shopify Stores

Run it on a schedule and each pass stamps prices and stock for every product. The history builds up across runs; one run on its own is a single snapshot.

Gymshark Products: the Full Shopify Catalog as Data

Every Gymshark product with price range, variants, SKUs, vendor and image URLs, straight from the public products.json feed. No login, no API key.

Shopify Competitor Analysis: Allbirds vs Rothy's

Two Shopify catalogs in one run, so Allbirds and Rothy's products, prices and tags sit side by side. Public products.json only, nothing behind a login.

Shopify Stock Checker and Price Change Monitor

Scheduled runs against a rival store catch new SKUs, price moves and items going out of stock. Compare two runs to see what actually changed.

Shopify Variants and SKUs Broken Out per Product

Every variant with its option title, SKU, price, compareAtPrice and stock flag, grouped under its product. Export to CSV or JSON from the dataset.

Related tools in E-commerce & Price Tools

Other ready-to-run tools in the same category — all pay-per-use on the Apify cloud.

Structured Product Price & Stock Monitor — JSON-LD / Shopify iconE-commerce & Price Tools

Structured Product Price & Stock Monitor — JSON-LD / Shopify

Track product price and stock from a store's own JSON-LD or Shopify data. Restock, price-drop and sale alerts into Slack or Discord. No API key.

4 use cases

eBay Sold Listings Scraper iconE-commerce & Price Tools

eBay Sold Listings Scraper

Get sold and completed eBay listings: sale price, shipping, sold date, condition, bids, on 9 marketplaces. Bring your own eBay login. $0.70 per 1,000.

Ready to run — no setup

1688 Wholesale Scraper iconE-commerce & Price Tools

1688 Wholesale Scraper

Scrape 1688.com wholesale listings. Get unit price, quantity price tiers, MOQ, supplier, sales count and rating. $0.35 per 1,000 products.

1 use cases

Alibaba 1688 Supplier Ratings Scraper iconE-commerce & Price Tools

Alibaba 1688 Supplier Ratings Scraper

1688.com supplier ratings: score, five sub-scores, repeat-buyer rate, years on platform, factory or trader, audits. No account. $0.40 per 1,000.

1 use cases

Alibaba.com Scraper iconE-commerce & Price Tools

Alibaba.com Scraper

Get Alibaba.com products with no account: price ranges, MOQ, supplier name, country, verified status and images. $0.85 per 1,000.

Ready to run — no setup

AliExpress Products Scraper iconE-commerce & Price Tools

AliExpress Products Scraper

Scrape AliExpress products by search term: product ID, title, price, discount, rating, order count and image. All prices in one currency. $0.12 per 1,000.

Ready to run — no setup

See all E-commerce & Price Tools →

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.

InputShopify store URLs or bare domains
OutputOne row per product, with variants nested
CeilingWhatever the store publishes, capped by maxItems per store
Account neededNone, 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
}
FieldDefaultWhat it is
storeUrlsbox holds two example storesBare domains, full URLs, or any page on the store, one per line.
maxItems1000How many products to take per store before moving on. You are charged per product returned, so this is your spend cap.
sortByemptyPaid option: price-asc (cheapest first), price-desc (dearest first) or newest. Empty keeps the store's own order.
notionConnectoremptyOptional. Authorise a Notion connector once under Settings, then pick it here to have the products written into your workspace.
notionParentIdemptyOptional. The Notion data source id to write into. Leave it empty and the pages are created privately in your workspace.
proxyConfigurationleave it aloneOptional, 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.

Sorting is a paid option. Shopify serves its catalog in the store's own order and won't sort it on request. So to sort, the run reads up to 10,000 products of each store, keeps the first ones by your order, up to maxItems, and leaves the rest out. Cheapest and dearest go by the lowest and highest variant price, newest by when the product was created. Products returned are charged as usual, and each product read and left out is billed as a checked product: see the Pricing tab.

📤 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", "..."]
}
FieldWhat it is
productId, handleShopify's own id and URL slug. productId is the key to join on between runs.
priceMin, priceMaxThe cheapest and dearest variant, as numbers. Equal when there is only one.
available, variantCountWhether any variant is in stock, and how many variants there are.
variantsEach variant's name, SKU, price, compare-at price and its own stock flag.
compareAtPriceThe crossed-out price, when the store set one. null otherwise, which is most of the time.
tagsThe store's own tags, exactly as they set them. Big retailers use these for internal bookkeeping, so expect noise.
descriptionThe product copy as plain text, with the HTML stripped out.
createdAt, publishedAtWhen the product was made and when it went live. Useful for spotting new arrivals.
imagesFull-size image URLs. The files themselves stay on Shopify.

🧾 Reading the output

Two kinds of row can land in your dataset.

RowHow to spot it
A productok is true and it has a productId
A diagnosticok is false and it carries an errorCode

Diagnostic rows are never charged.

CodeWhat it means
BAD_INPUTNothing usable in the store box.
NOT_SHOPIFYThe 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_RESULTSThe store answered with an empty catalog.
RATE_LIMITED, SERVER_ERRORThe store asked for a slower pace, or its own server erred. Worth one re-run.
BLOCKED, NETWORKThe store would not serve the request, or was unreachable.
SORT_NOT_LIVEYou asked for a sort before its price went live. Nothing was searched.
TIME_LIMITThe run got close to its time limit and stopped early. Every product delivered before that is in your dataset, and the row names the store it was reading and any it never reached. Give the run more time to get the rest. If nothing came back at all, the run is marked as failed.

▶️ How to run it

1. Open Shopify Products Scraper and click Try for free. 2. Paste your stores into Shopify store URLs, one per line. 3. Set Max products per store to what you actually need. 4. Click Start. 5. 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.

A sort adds one charge of its own: each product it reads and leaves out is billed as a checked product. The Pricing tab has the figure. Without a sort, nothing changes.

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 compareAtPrice against price to 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. available is 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/sale returns 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. triedHosts on 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.
  • A sort covers at most 10,000 products per store. A bigger store is sorted on its first 10,000.

🧭 Which product scraper do you need?

If you wantUse
Every product in a Shopify store's catalogThis one
To confirm a domain is Shopify and get its contact detailsShopify Store Leads
Products, prices and reviews on AmazonAmazon Scraper
Wholesale products and suppliers on Alibaba.comAlibaba.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.