How to export products from any WooCommerce store to CSV or JSON
Updated 2026-10-08 · Tool used: WooCommerce Products Scraper - Prices, Variations & Stock on Apify · Price: $0.60 per 1,000 products
WooCommerce's built-in exporter and REST API need admin keys, so they only work for your own shop. To analyse a competitor or build a supplier catalog you need the products the store already shows publicly.
This guide shows how to export the complete public catalog of any WooCommerce store, including variations, regular vs sale price and stock status, to CSV or JSON, without API keys.
Open WooCommerce Products Scraper on Apify →Steps
- Add store URLs (homepage, shop page or category URL) to
stores. - Choose
outputMode(products or variations) and optionallyonlyInStock. - Export as CSV/Excel or schedule it for price monitoring.
Example input
{
"stores": [
"https://nalgene.com",
"https://www.mandarinstone.com/collections/all-terrazzo/"
],
"outputMode": "products",
"onlyInStock": true,
"maxProductsPerStore": 500
}
Example output (one item, shortened)
{
"storeUrl": "https://www.mandarinstone.com",
"storeName": "Mandarin Stone",
"productId": 499641,
"sku": null,
"slug": "terrazzo-ivory-honed",
"url": "https://www.mandarinstone.com/product/terrazzo-ivory-honed/",
"title": "Terrazzo Ivory Honed",
"type": "variable",
"price": 0,
"maxPrice": 13.68,
"regularPrice": null,
"salePrice": null,
"onSale": false,
"discountPercent": null,
"currency": "GBP",
"currencySymbol": "£",
"inStock": true,
"onBackorder": false,
"stockStatus": "in-stock",
"stockText": null,
"lowStockRemaining": null,
"purchasable": true,
"averageRating": 0,
"reviewCount": 0,
"categories": [
"All Terrazzo",
"New arrivals"
],
"tags": [
"High Traffic",
"Straight Edge Finish"
],
"brands": [],
"attributes": [
{
"name": "Size",
"values": [
"200x200x12",
"200x50x12",
"406x406x18",
"..."
],
"usedForVariations": true
},
{
"name": "Colour",
"values": [
"White"
],
"usedForVariations": false
},
{
"name": "Finish",
"values": [
"Honed"
],
"usedForVariations": false
},
"..."
],
"featuredImage": "https://www.mandarinstone.com/app/uploads/2026/08/Terrazzo-Ivory-Honed-scaled.jpg",
"images": [
"https://www.mandarinstone.com/app/uploads/2026/08/Terrazzo-Ivory-Honed-scaled.jpg"
],
"weight": null,
"dimensions": null,
"variationsCount": 4,
"variations": [
{
"id": 499642,
"title": "Size: Sample",
"attributes": [
{
"name": "Size",
"value": "sample"
}
],
"sku": "TCTERIVOSAMP",
"price": 0,
"regularPrice": 0,
"salePrice": null,
"onSale": false,
"inStock": true,
"stockText": null,
"lowStockRemaining": null,
"imageUrl": "https://www.mandarinstone.com/app/uploads/2026/08/Terrazzo-Ivory-Honed-scaled.jpg",
"url": "https://www.mandarinstone.com/product/terrazzo-ivory-honed/?attribute_pa_size=sample"
},
{
"id": 500195,
"title": "Size: 200x50x12",
"attributes": [
{
"name": "Size",
"value": "200x50x12"
}
],
"sku": "TCTEIVOSC20X5",
"price": 0.66,
"regularPrice": 0.66,
"salePrice": null,
"onSale": false,
"inStock": true,
"stockText": "4094 in stock",
"lowStockRemaining": null,
"imageUrl": "https://www.mandarinstone.com/app/uploads/2026/08/Terrazzo-Ivory-Honed-scaled.jpg",
"url": "https://www.mandarinstone.com/product/terrazzo-ivory-honed/?attribute_pa_size=200x50x12"
},
{
"id": 500197,
"title": "Size: 200x200x12",
"attributes": [
{
"name": "Size",
"value": "200x200x12"
}
],
"sku": "TCTERIVOSC20X20",
"price": 2.84,
"regularPrice": 2.84,
"salePrice": null,
"onSale": false,
"inStock": true,
"stockText": "1128 in stock",
"lowStockRemaining": null,
"imageUrl": "https://www.mandarinstone.com/app/uploads/2026/08/Terrazzo-Ivory-Honed-scaled.jpg",
"url": "https://www.mandarinstone.com/product/terrazzo-ivory-honed/?attribute_pa_size=200x200x12"
}
],
"shortDescriptionText": null,
"descriptionText": "Please note: Products such as FILA PRW200 should be applied before grouting to create a barrier against grout penetration.\n\nTerrazzo Honed tile installation is more complex than porcelain, so it’s essential to use an exp...",
"scrapedAt": "2026-10-04T16:24:33.823Z"
}
Every run's dataset can be downloaded as JSON, CSV, Excel, XML or HTML from the Apify Console, or via https://api.apify.com/v2/datasets/<datasetId>/items?format=csv.
Run it from code
Python
from apify_client import ApifyClient # pip install apify-client
client = ApifyClient("<YOUR_APIFY_TOKEN>")
run_input = {
"stores": [
"https://nalgene.com",
"https://www.mandarinstone.com/collections/all-terrazzo/"
],
"outputMode": "products",
"onlyInStock": true,
"maxProductsPerStore": 500
}
run = client.actor("tinyrex/woocommerce-products-scraper").call(run_input=run_input)
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item)JavaScript / Node.js
import { ApifyClient } from 'apify-client'; // npm i apify-client
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('tinyrex/woocommerce-products-scraper').call({
"stores": [
"https://nalgene.com",
"https://www.mandarinstone.com/collections/all-terrazzo/"
],
"outputMode": "products",
"onlyInStock": true,
"maxProductsPerStore": 500
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);curl (no SDK)
# Runs the actor and returns the results directly (CSV here; use format=json for JSON)
curl -X POST "https://api.apify.com/v2/acts/tinyrex~woocommerce-products-scraper/run-sync-get-dataset-items?format=csv" \
-H "Authorization: Bearer $APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"stores": ["https://nalgene.com", "https://www.mandarinstone.com/collections/all-terrazzo/"], "outputMode": "products", "onlyInStock": true, "maxProductsPerStore": 500}' > results.csv
Get your API token in Apify Console → Settings → API & Integrations. The free Apify plan includes monthly credit that is enough to try this.
Use it from an AI agent (MCP)
The Apify MCP server exposes this actor as a tool for Claude, Cursor, VS Code, n8n and other MCP clients. Add this to your client's MCP config (or use the OAuth flow at mcp.apify.com instead of a token):
{
"mcpServers": {
"apify": {
"url": "https://mcp.apify.com?tools=tinyrex/woocommerce-products-scraper",
"headers": {
"Authorization": "Bearer <YOUR_APIFY_TOKEN>"
}
}
}
}
Then ask in plain language, e.g. "Export woocommerce products from another store for this list and give me a table".
Pricing
Pay per result: $0.60 per 1,000 products. You can cap the cost of every run in the run options.
FAQ
Can I export products from someone else's WooCommerce store?
Yes, the publicly visible products. The actor reads the store's public storefront data; no admin access is involved.
Does it get variations?
Yes, with attributes, prices, SKUs and stock per variation.
What if the store isn't WooCommerce?
Run the Tech Stack Detector first to check, or use the Shopify Products Scraper for Shopify stores.
Try it on Apify →More guides
- Bulk tech stack lookup: a Wappalyzer / BuiltWith alternative for thousands of domains
- How to scrape Greenhouse, Lever and Ashby jobs (plus Personio, Teamtailor, Recruitee)
- How to export all products from any Shopify store to CSV or JSON
- How to scrape jobs from Workday career sites (myworkdayjobs.com)
- How to export EU public tenders from TED (Tenders Electronic Daily) to CSV or JSON
- How to export jobs from the Bundesagentur für Arbeit (Arbeitsagentur) and EURES
- How to scrape remote jobs from Himalayas, Remote OK, We Work Remotely and more in one run
- How to scrape Apple App Store reviews for any app and country (CSV, JSON, API)
- How to export open EU funding calls (Horizon Europe, Digital Europe, cascade funding) to CSV or JSON