Shopify Store Scraper - Products, Prices & Stock
Pricing
from $0.50 / 1,000 product scrapeds
Shopify Store Scraper - Products, Prices & Stock
Exports the catalog of any Shopify store as clean rows: title, vendor, type, tags, price, compare-at price, discount, availability, variants, images and links. Filter by collection or keyword; schedule it to catch new products, price changes and stock changes. No browser. $0.0005 per product.
Pricing
from $0.50 / 1,000 product scrapeds
Rating
0.0
(0)
Developer
Antonio del Olmo Tena
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
4 days ago
Last modified
Categories
Share
Export the full product catalog of any Shopify store as clean, structured rows, and keep it monitored. Paste the store URL (or a collection URL) and the Actor reads the public catalog feed that every Shopify storefront exposes: one row per product with title, vendor, type, tags, price, crossed-out price, discount, availability, variants, options, images and links. Filter by keyword, schedule it, and each run flags new products, price changes and stock changes compared with the previous run.
No browser, no proxies, no HTML parsing: the data comes from the same JSON feed the store theme uses, so it is complete, fast and cheap. You pay $0.0005 per product returned.
What you get
One Dataset row per product:
title,url,handle,id,vendor,productType,tags,createdAt,updatedAt,publishedAt.price(cheapest variant),maxPrice,compareAtPrice(original price when discounted),discountPercent,currency.available(at least one variant in stock),variantsCount,variants(id, title, sku, price, compareAtPrice, available, grams),options(for example Size and Color with their values).imageUrl(first image) andimages(all).store,storeName,collection: where the product comes from.isNew,previousPrice,availabilityChange: what changed since the previous run of that store (out_of_stockorback_in_stock).description: plain text of the product page, only when Include product description is on.
A store that cannot be read (not Shopify, password-protected, catalog feed disabled) produces a single row with an error field and is not charged.
How to use it
- Open the Input tab.
- In Stores paste one URL per line. A store URL such as
https://www.allbirds.comreads the whole catalog; a collection URL such ashttps://www.allbirds.com/collections/mensreads only that collection. - Optionally set Keyword (for example
hoodie) to keep only matching products, and Max products per store to cap the size and the cost. - Click Start. Read the rows in Output or export them as JSON, CSV or Excel.
- To monitor prices and stock, schedule the Actor (hourly or daily). Every run compares each store with the previous one: new products come with
isNew: true, repriced ones withpreviousPrice, and stock changes withavailabilityChange. Connect a webhook or an email integration to be notified.
Input
{"stores": ["https://www.allbirds.com/collections/mens", "https://colourpop.com"],"query": "","includeDescription": false,"maxProducts": 1000}
| Field | Description |
|---|---|
stores | Store URLs or collection URLs. Up to 50 per run. |
query | Optional. Keeps products whose title, vendor, type or tags contain the text. |
includeDescription | Adds the product description as plain text (up to 2,000 characters). |
maxProducts | Products are read in pages of 250 up to this limit (1 to 10,000), then filtered by keyword. Default 1,000. |
Output example
{"store": "https://www.allbirds.com","storeName": "Allbirds","currency": "USD","collection": "mens","id": "7340901859408","handle": "mens-tree-runners-blizzard","title": "Men's Tree Runners - Blizzard","url": "https://www.allbirds.com/products/mens-tree-runners-blizzard","vendor": "Allbirds","productType": "Shoes","tags": ["mens", "tree"],"price": 98,"maxPrice": 98,"compareAtPrice": 120,"discountPercent": 18.3,"available": true,"variantsCount": 7,"variants": [{ "id": "42146889039952", "title": "8", "sku": "A10001M080", "price": 98, "compareAtPrice": 120, "available": true, "grams": 455 }],"options": [{ "name": "Size", "values": ["8", "9", "10"] }],"imageUrl": "https://cdn.shopify.com/s/files/1/1104/4168/files/tree-runner.png","images": ["https://cdn.shopify.com/s/files/1/1104/4168/files/tree-runner.png"],"publishedAt": "2026-09-25T23:58:13.000Z","isNew": false,"previousPrice": 110,"availabilityChange": null,"timestamp": "2026-10-04T10:00:00.000Z"}
Pricing
Pay per event, no subscription:
- Product scraped: $0.0005 per product row. A 1,000-product store costs $0.50.
- Product changed: $0.002 per product flagged as new, repriced or with a stock change in a scheduled run. Runs with no changes only pay for the rows.
Stores that cannot be read are free. Compare with typical Shopify scrapers at $0.001 to $0.003 per product.
Use it as an API
Run it from your code with the Apify API or client libraries:
curl -X POST "https://api.apify.com/v2/acts/aolmo~shopify-catalog/run-sync-get-dataset-items?token=YOUR_TOKEN" \-H "Content-Type: application/json" \-d '{"stores": ["https://www.allbirds.com"], "maxProducts": 500}'
The response is the list of product rows. You can also call it from AI agents through the Apify MCP server.
FAQ
Does it work with every Shopify store? With every storefront that exposes the public catalog feed, which is the default. A few stores disable it or sit behind a bot wall (the Actor reports blocks automated access), and password-protected stores cannot be read.
Is stock quantity included? The feed exposes availability per variant (in stock or not), not the exact quantity.
What is the price when variants differ? price is the cheapest variant and maxPrice the most expensive; each variant keeps its own price in variants.
How are discounts detected? When the cheapest variant has a compare_at_price higher than its price, compareAtPrice and discountPercent are filled.
How do I get only one collection? Paste the collection URL exactly as in the browser, for example https://store.com/collections/sale.
Where is the data stored between runs? In a Key-Value Store of your account named micro-saas-state-shopify-catalog, one key per store. Delete it to start fresh.