Shopify Scraper — Products API, Prices & Stock | $0.90/1k
Pricing
from $0.90 / 1,000 product results
Shopify Scraper — Products API, Prices & Stock | $0.90/1k
Scrape any Shopify store by domain: products, variants, prices, compare-at prices, stock, SKUs, images, vendor, type, tags, dates and store currency. Many stores per run, collections, product URLs, filters, product or variant rows. No API key.
Pricing
from $0.90 / 1,000 product results
Rating
0.0
(0)
Developer
Raffy
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
an hour ago
Last modified
Categories
Share
What does Shopify Products Scraper do?
Shopify Products Scraper reads the product catalog of any Shopify store and gives it back as clean JSON, CSV or Excel: titles, every variant with its price, compare-at (was) price, stock status and SKU, images, vendor, product type, tags, created / updated / published dates and the store's currency. Enter store domains such as colourpop.com or allbirds.com (one or thousands), and get their products in seconds. No Shopify account, no API key, no app install and no browser.
It works as a Shopify products API for stores you do not own. Every Shopify store publishes its catalog as public JSON (/products.json), and this Actor reads that feed page by page, handles pagination, redirects, headless storefronts and currency, and turns it into one tidy row per product (or per variant).
Typical use cases:
- Competitor price monitoring: track prices, discounts (compare-at prices) and stock of rival Shopify stores every day with a schedule.
- Product research and dropshipping: pull full catalogs of trending DTC brands, their best sellers and new arrivals, with images and descriptions.
- Catalog and market analysis: compare assortments, vendors, product types and price ranges across hundreds of stores.
- Feeds for AI agents and apps: a structured Shopify product scraper an agent can call with just a domain.
It reads only data the stores publish for every visitor. It does not log in and does not collect customer data (Shopify's public feeds contain none).
Why use Shopify Products Scraper?
- The whole catalog, fast. 250 products per request; 1,445 products from 30 stores took 7 seconds on Apify in our test.
- Works where other Shopify scrapers stop. Headless stores (a custom front end on
www) and stores that redirect to regional domains are read through the store's own Shopify address, so they still return data. - Correct currency. The price currency comes from the store's shop record and every request pins it, so prices never switch to a visitor's local currency, and the currency is never guessed.
- Filters that save money. In stock only, price range, product type, vendor, tags, title keywords and "updated since" are applied before rows are written; you pay only for rows you keep.
- Honest results. Every row has a
status. A site that is not a Shopify store, an empty collection or a deleted product gives one freenot_foundrow that says why; you are billed only forokrows. - Cheap. $0.90 per 1,000 products, Apify platform usage included.
What data can Shopify Products Scraper extract?
One row per product (default) with these fields:
| Field | Type | Description |
|---|---|---|
title | string | Product title |
storeDomain | string | Store domain as you entered it, e.g. allbirds.com |
storeName | string | Shop name from the store's public shop record |
productId | integer | Shopify product ID |
handle | string | Product handle (URL slug) |
url | string | Product page on the store |
vendor | string | Vendor / brand |
productType | string | Product type as the store names it |
tags | array | Product tags |
minPrice, maxPrice | number | Lowest and highest variant price |
compareAtMinPrice, compareAtMaxPrice | number | Compare-at ("was") prices, when the store sets them |
currency | string | ISO currency of the prices, e.g. USD, AUD; empty if the store does not publish it |
available | boolean | At least one variant can be bought |
onSale | boolean | A variant's compare-at price is above its price |
variantCount | integer | Number of variants |
variants | array | id, title, sku, price, compareAtPrice, available, option1-option3, grams per variant |
images, imageCount | array, integer | Image URLs (up to 50) and the total count |
bodyText | string | Description as plain text (HTML removed) |
options | array | Option names and values, e.g. Size: S, M, L |
createdAt, updatedAt, publishedAt | string | Dates with the store's time-zone offset |
collection | string | Collection handle, when the row came from a collection |
source | string | products_feed, collection_feed or product_page |
status, error, scrapedAt | string | Row status, reason for non-ok rows, time of extraction |
With One row per = Variant, each size/colour is its own row with variantId, variantTitle, sku, price, compareAtPrice, available, option1-option3, grams and image, plus the product columns. Rows from Product URLs also carry per-variant inventoryQuantity and barcode when the store publishes them.
Result status (tri-state output)
status | Meaning | Billed? |
|---|---|---|
ok | A product (or variant) row. | Yes |
not_found | Not a Shopify store, feed turned off, password-protected store, empty or unknown collection, deleted product, or nothing matched your filters. error says which. | No |
error | The store could not be read after several retries (network error, rate limit). error says why. | No |
How to scrape Shopify stores
- Open the Actor in Apify Console and click Try for free.
- Enter one or more store domains in Store URLs or domains (
colourpop.com,https://www.allbirds.com), collection URLs, or product URLs. - Optionally pick Collection handles, One row per (product or variant) and Filters.
- Set Maximum results: the default 20 is a quick test; raise it to 10,000 or more to read whole catalogs.
- Click Start. The default run finishes in about 5-10 seconds. Download the results as JSON, CSV, Excel or HTML.
To automate it, call the Actor from the API tab (Node.js, Python, curl) or add a Schedule for daily price tracking.
How much does it cost to scrape Shopify?
This Actor uses pay-per-event pricing. Apify platform usage is included in these prices.
| Event | Price |
|---|---|
| Actor start | $0.005 per run |
Result (status: ok row) | $0.0009 per product (or per variant row) |
Examples: the default run (20 products) costs $0.023. 1,000 products cost $0.905, 10,000 products $9.005. Rows with status not_found or error are never billed, and products your filters drop are never written or billed. You can cap spending with Maximum results, Maximum results per store and the run's Max total charge option.
Input
| Field | Type | Default | Description |
|---|---|---|---|
startUrls | array of strings | colourpop.com, allbirds.com | Store domains or URLs, collection URLs or product URLs |
productUrls | array of strings | - | Product pages to read individually |
collections | array of strings | - | Collection handles to read in every store |
outputMode | product or variant | product | One row per product or per variant |
maxItems | integer | 20 | Stop after this many rows in total |
maxItemsPerStore | integer | - | Stop reading a store after this many rows |
inStockOnly | boolean | false | Only products (variants) that can be bought |
minPrice, maxPrice | integer | - | Price range, in the store's currency |
productTypes, vendors, tags, keywords | array of strings | - | Keep matching products only |
updatedSince | string | - | YYYY-MM-DD or relative such as 7 days |
proxyConfiguration | object | off | Optional Apify Proxy (datacenter is enough) |
Example: the in-stock hoodies under $80 of two stores, one row per variant:
{"startUrls": ["gymshark.com", "https://www.allbirds.com"],"keywords": ["hoodie"],"inStockOnly": true,"maxPrice": 80,"outputMode": "variant","maxItems": 500}
Output
Real rows from a run on Apify (arrays shortened):
[{"url": "https://allbirds.com/products/womens-allbirds-flip-flop-dusty-pink","status": "ok","scrapedAt": "2026-09-27T22:24:39.779Z","storeDomain": "allbirds.com","storeName": "Allbirds","productId": 7340901859408,"handle": "womens-allbirds-flip-flop-dusty-pink","title": "Women's Allbirds Flip Flop - Dusty Pink","vendor": "Allbirds","productType": "Shoes","tags": ["allbirds::complete => true", "allbirds::edition => limited", "allbirds::gender => womens"],"createdAt": "2026-03-27T14:03:50-07:00","updatedAt": "2026-09-27T15:24:39-07:00","publishedAt": "2026-09-25T16:58:13-07:00","currency": "USD","minPrice": 25,"maxPrice": 25,"compareAtMinPrice": 50,"compareAtMaxPrice": 50,"available": true,"onSale": true,"variantCount": 7,"variants": [{ "id": 42146889039952, "title": "5", "sku": "A12513W050", "price": 25, "compareAtPrice": 50, "available": false, "option1": "5", "option2": null, "option3": null, "grams": 455 }],"images": ["https://cdn.shopify.com/s/files/1/1104/4168/files/A12513_26Q2_Allbirds-Flip-Flop-Dusty-Pink_PDP_LEFT.png?v=1774646345"],"imageCount": 5,"bodyText": "Sun on your feet. Comfort underneath. Light, easy, and made for warm weather, these flip flops bring everyday comfort to sunny days...","options": [{ "name": "Size", "values": ["5", "6", "7", "8", "9", "10", "11"] }],"collection": null,"source": "products_feed"},{"url": "https://princesspolly.com/","status": "not_found","error": "princesspolly.com is not a Shopify store: us.princesspolly.com/meta.json answered HTTP 404 (every Shopify store answers it). If the shop runs on another domain, enter that domain or its .myshopify.com address.","scrapedAt": "2026-09-27T22:24:38.641Z","storeDomain": "princesspolly.com"}]
Tips
- Put many stores in one run: you pay the start fee once, and stores are read in parallel.
- Use Maximum results per store so one huge catalog cannot use up the run.
- For daily price tracking, schedule the run and use Updated since
1 day: the feed is newest-first, so the scan stops early. - If a store answers with rate-limit errors, run it again later or enable Apify Proxy (datacenter).
Limitations
- Only public Shopify storefronts. Password-protected stores and stores that turned their public product feed off return a
not_foundrow. - Stock counts (
inventoryQuantity) are published by some stores only, and only on product-URL rows; feed rows carryavailableper variant, not quantities. - Prices are in the store's own currency (its main market). Regional price lists of other markets are not collected.
productType,vendorandtagsare whatever the store enters; they differ between stores.- For product URLs on stores with a headless front end,
availablecomes from the published stock data and can be empty;availabilityErrorthen says why. Scanning the store or a collection always givesavailable.
FAQ
Do I need a Shopify account, app or API key?
No. The Actor reads the public JSON that every Shopify store serves to every visitor. It works for any store, not only your own.
How do I know if a site is a Shopify store?
Just enter it. A Shopify store returns products; any other site returns one free not_found row explaining that it is not a Shopify store (or that its feed is off). You can use this to check lists of domains.
Can I get the products of one collection only?
Yes. Enter the collection URL (https://colourpop.com/collections/best-sellers) or put the handle best-sellers in Collection handles.
How do I track the price of specific products?
Put their URLs in Product URLs and schedule the run. Use One row per = Variant to get one row per size or colour with its own price and stock.
Can I use this Actor from an AI agent or MCP client?
Yes. It runs with no input at all (it then reads two example stores), accepts plain domains, and every row explains itself with status and error.
Why did I get fewer rows than maxItems?
The stores have fewer matching products, a per-store limit stopped them, or your run hit its Max total charge. not_found rows say when a filter matched nothing.
Related Actors
- App Store Scraper - use it if the merchant also sells or promotes an iOS app.
- Google Play Scraper - use it if the merchant also sells or promotes an Android app.
- Google Maps Scraper — Business Leads with Emails - use it to find local retailers as leads alongside online store data.
- Pinterest Scraper - use it to see how the same products are being pinned and discovered visually.
Legal and data-protection notice
This Actor extracts only product and store information that Shopify stores publish publicly for every visitor; it does not extract customer data, e-mail addresses, phone numbers or other personal data, and it does not log in or get around access controls. Personal data is protected by the GDPR in the European Union and by other regulations around the world; do not use the output to process personal data without a legitimate reason. You are responsible for complying with each store's terms of service and applicable law when using the extracted data.
This Actor is an independent tool and is not affiliated with, endorsed by or sponsored by Shopify Inc. or any store it reads. Shopify is a trademark of Shopify Inc. All trademarks belong to their respective owners.