How it will work: 3 steps
- Follow us on ApifyThe tool is built and waits in the queue for the Apify Store. Apify is the cloud platform where our tools run.
- Paste your input and press StartNo code needed: you fill in a form (the input). It already has a working example. For example:
https://woocommerce.comin WooCommerce store URLs. Each start is one run. - Download the resultsWhen 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.
This tool is an Apify Actor: a small program that runs on Apify. You can also run it on a schedule, for example every Monday. New to it? Read how it works, step by step and the 8 words you need first.
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.
Who uses it
Online sellers
Watch a competitor's prices, sales and stock.
Resellers
Copy a supplier catalog with SKUs and images into your system.
Marketing agencies
Watch prices for many brands on a schedule.
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.
Details
Step by step on Apify
- Open the Input tab.
- In Store URLs (
storeUrls), add a store, for examplehttps://woocommerce.com. - Keep the prefilled Max products per store (
maxProducts) of 20 for a first test. The default for runs without this field is 1,000. - Click Start.
- Open the Products view in the Output tab. Check
name,priceandinStock. Rows withrecordType: productare 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 for better results
- 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 and good to know
- 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 show0for products that you cannot buy online. The row then hasprice: 0andpurchasable: false, as the store gives it - Variable products.
priceis the lowest variation price.priceMinandpriceMaxshow 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: errorandproductsFound. The run summary lists every store with its result
For developers
Sample result
One result from a real test run, in JSON. Real values change from run to run. In Excel or CSV each field is a column.
{
"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"
}Data fields (40)
| Field | Type | Meaning |
|---|---|---|
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 (5)
The main fields of the input form. With the API you send them as JSON.
| Setting | Name in the API | Type | Example value |
|---|---|---|---|
| WooCommerce store URLs required | storeUrls | array | ["https://woocommerce.com"] |
| Category (optional) | category | string | |
| Max products per store | maxProducts | integer | 20 |
| Only new products | onlyNew | boolean | false |
| State key (only new products) | stateKey | string |



