How to scrape a Shopify store's products, prices and stock
Short answer
Most Shopify stores publish their catalogue as JSON at /products.json, but it is paginated, prices come per variant and nothing tells you what changed. Cartlark on Apify reads that public catalogue (and WooCommerce's), returns one clean row per product with price, compare-at price, discount and stock per variant, and in monitor mode returns only price and stock changes, at $0.0008 per product.
- Put the store domains in a list (allbirds.com or https://www.allbirds.com). A Shopify /collections/<name> URL limits the run to that collection.
- Run once without filters to see the whole catalogue; raise maxProductsPerStore above 250 for big stores.
- Add filters if you only want part of it: keywords, minPrice/maxPrice, onlyAvailable or onlyOnSale. Filtered-out products are free.
- For competitor price tracking, turn on monitor mode with a monitorKey and save the input as an Apify task.
- Schedule the task daily and send each run's rows (new products, price changes, out of stock, back in stock) to Slack, email or a sheet.
Copy-paste code
Python (pip install apify-client): store in, products + prices out
import csv, os
from apify_client import ApifyClient
client = ApifyClient(os.environ["APIFY_TOKEN"])
run = client.actor("cybermax/shopify-scraper").call(run_input={
"stores": ["https://www.allbirds.com"],
"maxProductsPerStore": 500,
"includeVariants": True,
})
with open("products.csv", "w", newline="") as f:
w = csv.writer(f)
w.writerow(["title", "price", "compare_at", "currency", "in_stock_variants", "url"])
for p in client.dataset(run["defaultDatasetId"]).iterate_items():
w.writerow([p["title"], p["price"], p.get("compareAtPrice"), p["currency"],
f"{p.get('variantsAvailable')}/{p.get('variantCount')}", p["url"]])JavaScript / Node (npm i apify-client): what is on sale across two stores
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('cybermax/shopify-scraper').call({
stores: ['shop-one.com', 'shop-two.com'],
onlyOnSale: true,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
for (const p of items) console.log(p.store, p.title, p.price, 'was', p.compareAtPrice, `-${p.discountPercent}%`);No code: n8n, Make or Zapier
n8n: HTTP Request node (or the Apify node, action "Run an Actor and get dataset")
Method: POST
URL: https://api.apify.com/v2/acts/cybermax~shopify-scraper/run-sync-get-dataset-items
Auth: Header Auth -> Authorization: Bearer <your Apify token>
Body: JSON {"stores": ["competitor.com"], "monitor": true, "monitorKey": "competitors"}
Output: one n8n item per result row
Make: Apify app -> "Run an Actor" (Actor: cybermax/shopify-scraper, wait for finish = yes)
-> Apify "Get Dataset Items" (dataset = the run's defaultDatasetId) -> your next module
Zapier: Apify app -> action "Run Actor" (cybermax/shopify-scraper, input JSON as above)
-> trigger "Finished Actor Run" -> "Fetch Dataset Items" -> your app
Runs longer than 5 minutes: start with POST /v2/acts/cybermax~shopify-scraper/runs and read the dataset when the run finishes.
Price alert flow: Schedule trigger (daily 07:00) -> the request above -> IF change = "price" -> Slack "Send message" with title, previousPrice -> price and priceChangePercent.From an AI agent (MCP)
# Any MCP client (Claude Desktop, Claude Code, Cursor, VS Code): Apify's hosted MCP server
{
"mcpServers": {
"shopify-scraper": {
"command": "npx",
"args": ["-y", "mcp-remote", "https://mcp.apify.com/?tools=cybermax/shopify-scraper",
"--header", "Authorization: Bearer ${APIFY_TOKEN}"],
"env": { "APIFY_TOKEN": "<your Apify token>" }
}
}
}
# The agent sees one tool, cybermax--shopify-scraper, with the Actor's input schema.
# Ask: "what does allbirds.com sell, at what price, and what is on sale?".| Product | Price | Was | In stock | Variants | Platform |
|---|---|---|---|---|---|
| Women's Wool Runner NZ - Shadow Blue | 120 USD | 12 of 13 sizes | 13 | Shopify | |
| Women's Wool Cruiser - Port | 120 USD | 3 of 13 sizes | 13 | Shopify | |
| All Star Canvas Hi Converse | 29 USD | yes | 20 | WooCommerce | |
| Varanise CN Tee Hilfiger Denim | 15 USD | 19 USD | yes | WooCommerce |
Source: Cartlark (Apify Actor cybermax/shopify-scraper) README, real Apify run on 10 Nov 2026
Why /products.json alone is not enough
Shopify's public catalogue is paged, capped per page, priced per variant and silent about changes. WooCommerce stores use a different endpoint and shape. A scraper built for both returns one stable row per product (lowest and highest price, compare-at price, discount %, variants in stock) and keeps state between runs so it can tell you what changed.
Competitor price monitoring for Shopify stores
Monitor mode remembers every product it saw and returns only new products, price changes with the previous price and % change, compare-at changes, out-of-stock and back-in-stock. Unchanged products are not delivered and not charged, so a daily watch on a 500-product store that changes 10 prices costs about a cent a day.
Product research for dropshipping and resale
Run many stores in one go with keywords and a price range to compare price points, vendors and tags across a niche; the rows load straight into a spreadsheet or BI tool.
Good to know
Price on Apify: $0.0008 per product delivered ($0.80 per 1,000), no start fee; a 250-product store is $0.20. Apify's free plan includes $5 of usage each month.
Cartlark reads only the public catalogue a storefront serves to every visitor and follows robots.txt. Password-protected stores and stores that switch these endpoints off are skipped, with the reason in the run summary.
Cartlark: Every product, price and stock level of any Shopify or WooCommerce store
$0.0008 per product, no start feeCartlark: every product, price, sale price and stock level of a Shopify or WooCommerce store, with price and stock change alerts. $0.0008 per product, no start fee.
Runs on your own Apify account, pay per result; failed results are not charged.Questions
Does it work on any Shopify store?
Any store with the standard public catalogue switched on, which is most of them. WooCommerce stores work too and are detected automatically; Wix, BigCommerce and Magento are not supported.
Can I get more than 250 products?
Yes, set maxProductsPerStore up to 50,000.
Is scraping a Shopify store legal?
Cartlark reads the same public product data shown on the store's product pages, follows robots.txt and collects no customer or personal data. Use the data in line with the laws that apply to you.
Can an AI agent use it?
Yes. Apify's MCP server exposes it as cybermax--shopify-scraper for Claude, Cursor and other MCP clients.
Free: the Free API Starter Kit
Copy-paste calls for 4 APIs with free daily tiers (CVE priority, VIN recalls, US duty rates, email checks), then 5 short emails on KEV/EPSS, MCP and free data.