# WooCommerce Store Products Export

> WooCommerce products scraper: export prices, sale prices, stock, SKUs, categories and images from any store. Only-new mode. No login or key.

URL: https://cliqtomedia.com/actors/woocommerce-products/

Category: E-commerce & prices · Status: coming soon · Apify profile: https://apify.com/cliqtomedia?fpr=cliqto

Add a store URL and get its public products in one table. Each row has prices, stock status, SKUs, categories, attributes and images. You need no login.

## How to use it: 3 steps

1. **Follow us on Apify.** The tool is built and waits in the queue for the Apify Store. Apify is the cloud platform where our tools run.
2. **Paste your input and press Start.** No code needed: you fill in a form (the input). It already has a working example. For example: `https://woocommerce.com` in WooCommerce store URLs. Each start is one run.
3. **Download the results.** When the run ends, the results are in a table (the dataset). Open Output, press Export and pick Excel or CSV. JSON and the API are there too.

## What it does

Export public products from any WooCommerce store to JSON, CSV or Excel. You get one row per product with prices, sale prices, stock, SKUs, categories, attributes, images and the product link. Add one store URL, such as `https://woocommerce.com`, and click **Start**. There is no login and no API key.



### Good for

- Watch a competitor's prices, sales and stock.
- Copy a supplier's catalog with SKUs and images into your own system.
- Get a daily list of only the new products in a store.

### Not a good fit

- Stores that are not on WooCommerce, or that closed the Store API. You get a status row, not products.
- Exact stock numbers. Most stores only say if a product is in stock. Some show a low-stock number (`lowStockRemaining`).
- Private data: orders, customers, costs, admin-only fields and hidden or draft products.
- Price per variation (size, color). You get the price range of a variable product and its attribute values, not one row per variation.

## Price

Prices will be shown after release.

## Questions

### Do I need a WooCommerce login or API key?

No. It reads the public Store API. Stores that close it are skipped with a status row.

### Is the stock number exact?

Most stores only say if a product is in stock. Some show a low-stock number.

### Why are there no products in an only-new run?

Nothing was added since the last run with the same stateKey.

### Does it get orders or buyer data?

No. It gets public product data only.

### How fresh is the data?

Each row is read live from the store at `fetchedAt`.

## Data fields

- `recordType` (string): Row type: product, or store-status for a store that was not found, failed or stopped early.
- `status` (string): complete for product rows; not_found (not a WooCommerce store, Store API closed, category missing, empty) or error (blocked, rate limited, unavailable, stopped) for store-status rows.
- `store` (string): Store domain the data came from (after redirects), e.g. woocommerce.com.
- `storeUrl` (string): Store homepage URL.
- `category` (string): Category slug the export was limited to; null for the whole catalog.
- `productId` (integer): WooCommerce product ID.
- `name` (string): Product name, HTML entities decoded.
- `slug` (string): Product slug (URL part).
- `sku` (string): SKU as published by the store; null when the store leaves it empty.
- `type` (string): Product type: simple, variable, grouped, external, or a type added by a plugin.
- `parentId` (integer): Parent product ID for child products; null for top-level products.
- `price` (number): Current price in the store currency (sale price when on sale). Null when the store shows no price; 0 only for a free product.
- `regularPrice` (number): Regular (non-sale) price. Null when not published.
- `salePrice` (number): Sale price, only when the product is on sale; otherwise null.
- `priceMin` (number): Lowest price across variations (variable products) or the price.
- `priceMax` (number): Highest price across variations (variable products) or the price.
- `onSale` (boolean): True when the store marks the product as on sale.
- `currency` (string): ISO 4217 currency code of the prices, e.g. USD.
- `inStock` (boolean): True when the product is in stock (or on backorder), as the store reports it.
- `stockStatus` (string): Stock label class from the store, e.g. in-stock, out-of-stock, available-on-backorder.
- `lowStockRemaining` (integer): Units left when the store shows a low-stock notice; null otherwise.
- `purchasable` (boolean): True when the product can be added to the cart.
- `categories` (array): Category names.
- `categorySlugs` (array): Category slugs.
- `tags` (array): Tag names.
- `brands` (array): Brand names (WooCommerce Brands).
- `attributes` (array): Public attributes with their values, e.g. Size: S, M, L.
- `variationsCount` (integer): Number of variations for variable products.
- `averageRating` (number): Average review rating from 0 to 5; null when the product has no reviews.
- `reviewCount` (integer): Number of reviews.
- `shortDescription` (string): Short description as plain text (up to 2,000 characters).
- `description` (string): Full description as plain text (up to 5,000 characters).
- `imageUrl` (string): Main image URL.
- `images` (array): All image URLs.
- `url` (string): Product page URL on the store.
- `isNew` (boolean): onlyNew mode: true for products added since the previous run; null on the first run and when onlyNew is off.
- `source` (string): Data source: woocommerce-store-api.
- `sourceUrl` (string): Store API page the row was read from.
- `fetchedAt` (string): When the row was fetched (ISO 8601, UTC).
- `statusCode` (string): store-status rows: NOT_WOOCOMMERCE, STORE_API_DISABLED, CATEGORY_NOT_FOUND, NO_PRODUCTS, BLOCKED, RATE_LIMITED, SOURCE_UNAVAILABLE, CHARGE_LIMIT, INVALID_URL and others.

## Input settings

- `storeUrls` (array, required): Up to 100 WooCommerce stores as URLs or domains, e.g. https://woocommerce.com or shop.example.com. A category page URL such as https://shop.example.com/product-category/hoodies/ exports only that category. Each store you check is billed once. Stores that close their API to visitors are skipped and reported, never logged into.
- `category` (string): Product category applied to every store without a category in its URL: slug (hoodies), ID (16) or name (Hoodies). If a store has no such category, its status row lists the categories it has. Leave empty to export the whole catalog.
- `maxProducts` (integer): Stop each store after this many product rows, newest products first. Each product row is billed.
- `onlyNew` (boolean): Return only products added since the previous run with the same state key. The first run returns the newest products (up to the max) and marks older ones as already seen; later runs return only new products, usually in one request per store. State lives in your account's key-value store woocommerce-products-state.
- `stateKey` (string): Name of the onlyNew memory, so different schedules or task setups do not share it. Letters, digits, - and _ (up to 40). Default: default.

## Step by step on Apify

1. Open the Input tab.
2. In Store URLs (`storeUrls`), add a store, for example `https://woocommerce.com`.
3. Keep the prefilled Max products per store (`maxProducts`) of 20 for a first test. The default for runs without this field is 1,000.
4. Click Start.
5. Open the Products view in the Output tab. Check `name`, `price` and `inStock`. Rows with `recordType: product` are products.

## Use cases

| Task | Input | You get | Key fields | Next step |
|---|---|---|---|---|
| Competitor price and sale watch | `storeUrls`, schedule | Product row | `price`, `regularPrice`, `salePrice`, `onSale`, `inStock` | Dataset export or API to a sheet |
| Supplier catalog import | `storeUrls` | Product row | `sku`, `price`, `images`, `description`, `attributes` | JSON/CSV import into your store or PIM |
| New product alerts | `storeUrls`, `onlyNew: true`, schedule | New product rows | `name`, `url`, `isNew` | Webhook or integration on run finish |
| Category research | Category URL or `category` | Product row | `categories`, `brands`, `tags`, `price` | Dataset export |

## Tips

- Use only-new mode on a daily schedule to get new products only.
- Pick one category when you need only part of a store.
- Variable products show a price range, not one row per variation.

## Limits



- Tested size. The biggest tested run saved 2,009 products from 4 stores in under 2 minutes. The biggest tested store had 1,757 products. The input allows up to 50,000 products per store, but bigger stores were not tested.
- Time. Speed depends on the store. In tests one store gave 1,000 products in about 15 seconds, and a slower store gave 1,757 products in under 2 minutes. The Actor asks each store at most once per second. Up to 5 stores are read at the same time. For many big stores, raise the timeout in Run options (default 300 seconds) or split the stores.
- Price `0`. Some stores show `0` for products that you cannot buy online. The row then has `price: 0` and `purchasable: false`, as the store gives it.
- Variable products. `price` is the lowest variation price. `priceMin` and `priceMax` show the range. There is no row per variation.
- No proxy needed. The API is public. The Actor waits when a store asks it to slow down (HTTP 429 or 503).
- Order. Rows come newest first by date added.
- Unreachable stores. If the first 5 stores in a row cannot be reached, the run stops early to save your money. Stores that it did not check are not charged.
- Partial results. If a store fails, the rows already saved stay in the Dataset, and the other stores go on. The store also gets a status row with `status: error` and `productsFound`. The run summary lists every store with its result.

## Sample result

```json
{
  "recordType": "product",
  "status": "complete",
  "store": "www.passion4pens.com",
  "storeUrl": "https://www.passion4pens.com",
  "category": null,
  "productId": 21466,
  "name": "Lamy® Safari Yellow Fountain Pens-four nibs sizes available",
  "slug": "lamy-safari-yellow-fountain-pens-four-nibs-sizes-available",
  "sku": "L18",
  "type": "variable",
  "parentId": null,
  "price": 30.25,
  "regularPrice": 37,
  "salePrice": 30.25,
  "priceMin": 30.25,
  "priceMax": 30.25,
  "onSale": true,
  "currency": "USD",
  "inStock": true,
  "stockStatus": "in-stock",
  "lowStockRemaining": null,
  "purchasable": true,
  "categories": ["Fountain Pens"],
  "categorySlugs": ["foutain-pens"],
  "tags": ["fountain pens", "stainless steel nibs"],
  "brands": ["Lamy Pens & Refills"],
  "attributes": [{ "name": "size", "values": ["B", "EF", "F", "M"] }],
  "variationsCount": 4,
  "averageRating": null,
  "reviewCount": 0,
  "imageUrl": "https://passion4pens.com/wp-content/uploads/2026/05/LAMY-018-safari-Fountain-pen-yellow-1.webp",
  "images": ["https://passion4pens.com/wp-content/uploads/2026/05/LAMY-018-safari-Fountain-pen-yellow-1.webp"],
  "url": "https://passion4pens.com/product/lamy-safari-yellow-fountain-pens-four-nibs-sizes-available/",
  "isNew": null,
  "source": "woocommerce-store-api",
  "sourceUrl": "https://www.passion4pens.com/wp-json/wc/store/v1/products?per_page=100&page=1&orderby=date&order=desc&_fields=...",
  "fetchedAt": "2026-10-17T12:57:48.472Z"
}
```

## Similar tools

- [AliExpress Scraper: Products, Prices & Reviews, No Login](https://cliqtomedia.com/actors/aliexpress-scraper/)
- [Coles, Woolworths & Aldi Price Scraper - No Login](https://cliqtomedia.com/actors/au-supermarket-prices/)
- [Idealo Price Scraper: All Shop Offers, 6 Countries, No Login](https://cliqtomedia.com/actors/idealo-price-scraper/)
- [Naver Shopping Scraper: Korea Products & Prices](https://cliqtomedia.com/actors/naver-shopping-scraper/)
- [Trendyol Scraper: Products, Prices & Reviews (No login)](https://cliqtomedia.com/actors/trendyol-scraper/)
- [eBay Sold Listings Scraper - Sold Prices & Dates](https://cliqtomedia.com/actors/ebay-sold-listings/)
