🦖 TinyRex Data Toolspractical guides for web data APIs

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

  1. Add store URLs (homepage, shop page or category URL) to stores.
  2. Choose outputMode (products or variations) and optionally onlyInStock.
  3. 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