E-commerce Product Data: WooCommerce stores + AliExpress
Lets an agent answer "what does this store sell and at what price?" and "what does this cost on AliExpress right now?". WooCommerce: exports any public catalog (price, sale price, stock, SKU, categories, images, URL) with filters, plus a changesOnly mode for price or stock monitoring. AliExpress: search and product pages with current price, discount, sold count, rating and optional per-SKU price and stock. Honest limits: AliExpress is a point-in-time snapshot, not a price history. No login needed. Apify hosted MCP server; auth via OAuth or Apify token.
托管 MCP 服务器
npx add-mcp 'https://mcp.apify.com?tools=dheerajitbhu/woocommerce-products-scraper,dheerajitbhu/aliexpress-scraper'可安装到 Claude Code、Codex、Cursor 等客户端
文档
WooCommerce Products Scraper: Prices, Stock, Images & SKUs (dheerajitbhu/woocommerce-products-scraper) Actor
Export a public WooCommerce catalog: name, decimal price, sale price, stock, SKU, categories, images, and URL. No login. Filter by category, keyword, stock, or sale. changesOnly diffs a saved baseline; the first run only records it.
- URL: https://apify.com/dheerajitbhu/woocommerce-products-scraper.md
- Developed by: dheeraj kumar (community)
- Categories: E-commerce, Lead generation, Developer tools
- Features: Limited permissions
- Stats: 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- User rating: No ratings yet
Pricing
from $0.35 / 1,000 product scrapeds
This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events. Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.
Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event
What's an Apify Actor?
An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes. In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours, and optionally produces a well-defined JSON output, datasets with results, or files in key-value store. In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.
How to integrate an Actor?
If asked about integration, you help developers integrate Actors into their projects. You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.
For examples already wired to this Actor's own input schema, see the API section below.
Each client library has reference documentation the quickstart does not restate: JavaScript/TypeScript (npm install apify-client) and Python (pip install apify-client).
README
WooCommerce Products Scraper: Prices, Stock, Images & SKUs
Who it's for: competitor researchers and analysts who need a structured export of a public WooCommerce catalog.
Export products to CSV, JSON, or Excel, with no plugin on the store: name, decimal price, regular and sale price, discount, stock, categories, tags, images, attributes, SKU, and URL. Prices are major units (16.50), not cents. No login, no API keys, and no browser. Filter by category, keyword, in-stock, or on-sale. Stores that do not expose a public catalog return an error row and are not charged per product.
outputMode: "changesOnly" is optional. The first run only records a baseline (_change: "new"). Later runs return products that are new, changed, or removed. It is not an instant diff of a store you have never scraped.
For AI agents
Call this actor through the Apify MCP server. maxChargeUsd is this actor's cap. MCP callOptions.maxTotalChargeUsd is a separate platform cap; set both before a paid call. Omit storeUrls for the built-in demo (no per-product charge). A real run needs at least one public store URL.
List prices (unchanged): run start $0.001, each product $0.0005. In changesOnly, each new or changed product also costs $0.002; a removed row costs $0.002 and does not include the product charge. Five products in the default all mode are about $0.0035. Error rows are free.
There is no compact key-value artifact. Read the dataset.
Full export:
{ "storeUrls": ["https://jococups.com"], "maxProductsPerStore": 5, "outputMode": "all", "maxChargeUsd": 1 }
Product fields: recordType product, name, price, regularPrice, salePrice, currency, inStock, sku, url, categories, images. One store-summary row per store (productsScraped, truncated, spentUsdSoFar).
On-sale slice:
{ "storeUrls": ["https://jococups.com"], "maxProductsPerStore": 5, "onSaleOnly": true, "maxChargeUsd": 1 }
onSale, salePrice, and discountPercent are filled when the store marks the product on sale. salePrice is null otherwise.
Baseline, then a later diff (use the same monitorKey):
{ "storeUrls": ["https://jococups.com"], "maxProductsPerStore": 5, "outputMode": "changesOnly", "monitorKey": "joco-sample", "maxChargeUsd": 1 }
The first run's products are _change new. A later run adds changedFields on changes, or _change removed with only store and productId.
Try it in one click
The input form on this page is already prefilled with the example below — press Start and it runs as-is.
{ "storeUrls": ["https://jococups.com"], "maxProductsPerStore": 10, "maxChargeUsd": 0.5 }
What you get:
- Up to 10 real products from jococups.com: name, price, sale price/discount %, stock, categories, images, attributes and SKU.
- About 10 rows for roughly $0.006 at the listed pricing (run-start $0.001 + $0.0005/product).
- Leave Store URLs empty to see demo rows instead, or point it at any other WooCommerce store.
What you can use it for
- Competitor price research: export a rival store's whole catalog with current and sale prices.
- Catalog migration and backups: pull products, images, categories and attributes out of a WooCommerce shop.
- Product feeds and market research: build datasets of products, brands and price points across many stores.
- Sale tracking: export only on-sale items, with the discount percent already calculated.
Need to track changes over time instead (new products, price changes, stock flips)? Use WooCommerce Catalog Monitor.
Input
- Store URLs: one or more WooCommerce stores, e.g.
https://example-store.com. - Max products per store (default 1,000): caps reads and cost.
- Categories (optional): category slugs, names or numeric IDs, e.g.
sale,t-shirts. - Search keyword (optional): the store's own product search.
- In-stock only / On-sale only (optional).
- Maximum charge per run (default $5): hard cap; the run stops cleanly before exceeding it.
Example input
{
"storeUrls": ["https://offermanwoodshop.com", "https://jococups.com"],
"maxProductsPerStore": 1000,
"categories": ["sale"],
"onSaleOnly": false,
"maxChargeUsd": 5
}
Output
One row per product (recordType: product), plus one store-summary row per store. Prices are decimals in the store's currency.
Example output
{
"recordType": "product",
"store": "https://offermanwoodshop.com",
"productId": 43116,
"name": "Sale OWS T-Shirts",
"slug": "ows-t-shirt-2",
"url": "https://offermanwoodshop.com/store/shop-fashion/ows-t-shirt-2",
"sku": "AP-OWSTSHIRT-SALE",
"type": "variable",
"price": 18.0,
"regularPrice": 32.0,
"salePrice": 18.0,
"onSale": true,
"discountPercent": 43.8,
"priceRange": null,
"currency": "USD",
"inStock": true,
"onBackorder": false,
"lowStockRemaining": null,
"categories": [
{"id": 474, "name": "Sale", "slug": "sale"},
{"id": 91, "name": "Shop Fashion", "slug": "shop-fashion"}
],
"tags": [],
"images": [
"https://offermanwoodshop.com/wp-content/uploads/2018/08/cropped-redshirt2-scaled-1.jpg"
],
"attributes": [
{"name": "Sizes", "values": ["S", "M", "L", "XL"]},
{"name": "Colors", "values": ["Navy", "Royal Blue"]}
],
"variationCount": 8,
"averageRating": 0.0,
"reviewCount": 0,
"shortDescription": "100% cotton.",
"description": "Special cut-price on select colors and sizes.",
"scrapedAt": "2026-10-17T02:12:40+00:00"
}
Run it with empty input to see demo rows.
Monitor mode
Schedule this actor and set Output mode to changesOnly to get a diff instead of a full
re-export: the first run records a baseline, and every run after that reports only products that
are new, changed (with a changedFields list), or removed since last time. Removed rows
carry just the product's key fields. Use Monitor name if you run more than one monitor and want
to keep their baselines separate, and Report removed products / Fields to ignore to tune
what counts as a change. Default mode (all) is unaffected — it always exports everything, every run.
In changesOnly, every new/changed row is billed as a changed row in addition to the normal
per-product charge — see Pricing below; a removed row is billed as a changed row only (there's no
per-product charge for a product that wasn't actually fetched this run); unchanged rows are free
and aren't pushed.
Pricing: pay per event
| Event | Price |
|---|---|
| Run started | $0.001 per run |
| Product scraped | $0.0005 per product ($0.50 per 1,000) |
A 1,000-product store costs about $0.50. Stores that can't be read (unsupported, private/B2B shops, network errors) return an error row and aren't charged per product.
Works on Apify’s Free plan — $5/mo platform usage, no credit card required to try. Actor event prices above are unchanged.
Use it from code
from apify_client import ApifyClient
client = ApifyClient("YOUR_API_TOKEN")
run = client.actor("dheerajitbhu/woocommerce-products-scraper").call(run_input={
"storeUrls": ["https://jococups.com"],
"maxProductsPerStore": 500,
})
for row in client.dataset(run["defaultDatasetId"]).iterate_items():
if row.get("recordType") == "product":
print(row["name"], row["price"], row["currency"], row["url"])
Limits
- Works with the large majority of public WooCommerce stores. Stores behind bot challenges, password protection or B2B logins return an error row.
- Light, paced reads, to be polite to stores.
Integrations
This actor runs on the Apify platform, so it connects to the tools you already use without custom code:
- Make, Zapier, n8n — trigger a run on a schedule or webhook, and feed exported product rows straight into your workflow using Apify's integrations for each tool.
- Google Sheets — push exported products to a spreadsheet with the Apify Google Sheets integration, no code required.
- Slack / email — get notified when a scheduled export finishes (or fails) via Apify's built-in Slack and email integrations.
- API, Python, and JavaScript clients — call it programmatically with the Apify API or the
apify-client/apify-client-jslibraries (see "Use it from code" above). - MCP / AI agents — expose this actor as a callable tool to Claude, Cursor, or any MCP-compatible agent through the Apify MCP server, so an agent can pull catalog data on its own.
Run it on a schedule
Suggested frequency: weekly for price research snapshots. To track changes, turn on monitor mode and run it daily, and you only get the products that changed.
To set it up: save your input as a Task in Apify Console, then add a Schedule. Send results where you work with Apify integrations: Google Sheets, Slack or email notifications, webhooks, Make / Zapier / n8n, or straight into an AI agent through the Apify MCP server. A run that can't get data is marked failed, so your alerts fire.
FAQ
Is this legal? Is the data public? Yes. It reads only the public catalog data the store shows any visitor — no private or password-protected pages are accessed. You're responsible for using the exported data in line with each store's terms.
Do I need a login or API keys? No. No account, login, or API key is required for the store you're scraping. You only need your own Apify account to run the actor.
How often should I schedule it? This actor is built for one-shot exports (a full catalog pull), not change tracking. Run it whenever you need a fresh snapshot — e.g. weekly for ongoing price research. For scheduled change detection instead, use WooCommerce Catalog Monitor.
What does a run cost? Pay per event: $0.001 per run, $0.0005 per product scraped ($0.50 per 1,000). A 1,000-product store costs about $0.50 per run. Set Maximum charge per run to cap spend.
Does it need a proxy? No. It reads public catalog data efficiently, so no proxy is needed.
What happens if a store blocks it or can't be read? The store is reported as unsupported/failed in an error row and is not charged per product. This includes stores behind bot challenges, password protection, or B2B-only logins.
How do I export WooCommerce products to CSV without a plugin? Paste the store URL and press Start. When the run ends, download the dataset as CSV, Excel or JSON. Nothing gets installed on the store, and it works on stores you don't own, so you can use it for competitor price research.
How do I get support or report a bug? Open an issue on this actor's Issues tab on Apify (apify.com/dheerajitbhu/woocommerce-products-scraper/issues) and we'll follow up there.
Feedback
If the data helped, a short rating on the Reviews tab helps others find this actor. Something broke or missing a field? Open an issue on the Issues tab — we aim to reply within 24 hours.
Related actors
- WooCommerce Catalog Monitor — track a WooCommerce store's catalog over time and get alerted on new/removed products, price changes, and stock flips, instead of a one-shot export.
- DriftGuard — on Shopify instead of WooCommerce? Catch feed-vs-storefront price and availability drift before Google/Meta/TikTok disapprove your products.
- AliExpress Scraper — compare store prices with AliExpress supplier prices.
- Shopify Scraper — competitors on Shopify? Export their products and prices too.
- Guide: Export WooCommerce Products in 2026: Real Store Data on Prices, Sales and Stock — real catalog exports from public WooCommerce stores: price ranges, discount depth, stock and cost per run.
Keywords: WooCommerce products scraper, WooCommerce scraper, export WooCommerce products to CSV, WooCommerce product export, WooCommerce price research, WooCommerce competitor prices.
Built and maintained by Integration Yard (dheerajitbhu).
Independent tool. Not affiliated with or endorsed by WooCommerce / Automattic. Use exported data in line with each store's terms.
Actor input Schema
storeUrls (type: array):
One or more WooCommerce store URLs, e.g. https://example-store.com. Works with the large majority of public WooCommerce stores. Leave empty to see demo output.
maxProductsPerStore (type: integer):
Stops reading a store after this many products. Lower it to cap your cost. Example: 200 for a quick check, 1000 (default) for most stores.
categories (type: array):
Only products in these categories. Use category slugs (e.g. t-shirts), names, or numeric IDs. Example: ["sale"] to export only the Sale category.
search (type: string):
Only products matching this keyword (the store's own product search). Example: 'mug' to export only products matching that keyword.
inStockOnly (type: boolean):
Skip out-of-stock products. Example: true to export only items currently available to buy.
onSaleOnly (type: boolean):
Only products currently on sale. Example: true to export only discounted items with their sale price.
maxChargeUsd (type: number):
Hard spending cap for this run. The actor stops cleanly before exceeding it; rows already exported are kept. Example: 5 caps the run at $5 (about 1,000 products).
outputMode (type: string):
Default 'all' exports every matching product, every run. 'changesOnly' remembers the last run and exports only products that are new, changed, or no longer found — handy on a schedule. Example: 'changesOnly' to get a daily diff instead of a full re-export.
monitorKey (type: string):
Only used with 'changesOnly'. Names the saved baseline so scheduled runs compare against the right one. Leave blank to derive it automatically from your other inputs. Example: 'my-store-daily' if you run several monitors.
includeRemoved (type: boolean):
Only used with 'changesOnly'. When true (default), products no longer found are reported once as removed. Example: false to only see new/changed products.
ignoreFields (type: array):
Only used with 'changesOnly'. Field names that should not, by themselves, trigger a 'changed' result. Example: ["reviewCount"] to ignore review-count drift and only react to price/stock/etc.
Actor input object example
{
"storeUrls": [
"https://jococups.com"
],
"maxProductsPerStore": 1000,
"inStockOnly": false,
"onSaleOnly": false,
"maxChargeUsd": 5,
"outputMode": "all",
"includeRemoved": true
}
Actor output Schema
results (type: string):
One row per product plus a per-store summary row.
API
You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.
JavaScript example
import { ApifyClient } from 'apify-client';
// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
token: '<YOUR_API_TOKEN>',
});
// Prepare Actor input
const input = {
"storeUrls": [
"https://jococups.com"
]
};
// Run the Actor and wait for it to finish
const run = await client.actor("dheerajitbhu/woocommerce-products-scraper").call(input);
// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
console.dir(item);
});
// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs
Python example
from apify_client import ApifyClient
# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")
# Prepare the Actor input
run_input = { "storeUrls": ["https://jococups.com"] }
# Run the Actor and wait for it to finish
run = client.actor("dheerajitbhu/woocommerce-products-scraper").call(run_input=run_input)
# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
print(item)
# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start
CLI example
echo '{
"storeUrls": [
"https://jococups.com"
]
}' |
apify call dheerajitbhu/woocommerce-products-scraper --silent --output-dataset
MCP server setup
{
"mcpServers": {
"apify": {
"type": "http",
"url": "https://mcp.apify.com/?tools=fetch-actor-details,dheerajitbhu/woocommerce-products-scraper"
}
}
}
The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an Authorization: Bearer <APIFY_API_TOKEN> header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).
OpenAPI specification
Download the OpenAPI definition: https://api.apify.com/v2/actors/RH4HkKWn7uABFhA7V/builds/Uw5H21BsNXxwHVvyE/openapi.json